Как изменить внутренние номера страниц в метаданных PDF?


37

У меня есть документ PDF, который я создал не Acrobat (печать в PDF, затем объединение нескольких PDF-файлов), но я бы хотел вручную изменить номера страниц (т.е. первые несколько страниц - это просто титульные страницы, страница, на которой как меченый «страница 1» на самом деле седьмой лист PDF). Какой самый простой (и в идеале, бесплатный) способ сделать это?

Чтобы быть ясным, я не пытаюсь изменить номера на самих страницах, но номера страниц в «метаданных», которые хранит PDF (сами страницы уже нумеруются правильно; я просто хочу, чтобы «перейти на страницу 1», чтобы перейти на страницу с меткой 1, которая может быть листом 7).

Что бы это ни стоило, я на Windows, хотя у меня есть доступ и к Mac.


Я не уверен, полностью ли я понимаю ваше описание + требование. Можете ли вы предоставить ссылку на образец PDF, который вы хотите изменить?
Курт Пфайфл

Есть ли инструмент командной строки, чтобы сделать это, например, на большом файле PDF без фактического открытия файла TXT?
jj_p

как например pdftk?
jj_p

Ответы:


39

То, что вы хотите, на самом деле называется ярлыками страниц и может быть легко добавлено непосредственно в исходный код PDF. Переименуйте расширение файла из pdfв txtи откройте файл в текстовом редакторе (это может быть медленно, в зависимости от размера файла, будьте терпеливы). Информация о метках страницы хранится в узле, называемом каталогом документов, который выглядит примерно так:

3 0 obj
<< /Type /Catalog
   /Pages 1 0 R
>>
endobj

Это может содержать более запутанные вещи, но это основная структура. Существует только один каталог, поэтому в большом файле вы можете найти узел, который в нем содержится /Catalog. Теперь вы можете внести желаемые изменения, вставив /PageLabelsзапись:

3 0 obj
<< /Type /Catalog
   /Pages 1 0 R
   /PageLabels << /Nums [ 0 << /P (cover) >>
                          % labels 1st page with the string "cover"
                          1 << /S /r >>
                          % numbers pages 2-6 in small roman numerals
                          6 << /S /D >>
                          % numbers pages 7-x in decimal arabic numerals
                        ]
               >>
>>
endobj

Есть 3 строки, начинающиеся с цифр, называемые индексами страниц . Страница 1 имеет индекс 0, страница 2 - индекс 1и так далее. Они всегда описывают диапазоны, поэтому строка с 1 <<...>>относится ко всем страницам с индекса 1 до 5, а строка с 6 <<...>>относится ко всем страницам с 6 до последней страницы. Метка для 0 <<...>>всегда должна быть определена.

Вы можете найти больше информации о ярлыках страниц и исходном коде PDF в стандарте PDF или в вики о стандартах PDF.


4
Замечательное! Это единственное место в Интернете, где я нашел такую ​​прямую и полезную информацию. В конце концов, у нас не все есть Acrobat Reader.
Нолдорин

3
В примере /St 8или /St 2вы устанавливаете начальную точку для отображаемой метки; но выберите любое число вместо 8 (или 2), которое должно быть> = 1. Например, 1 << /S /r /St 12 >>нумерация страниц с (на самом деле) 2-6 будет (отображаться) xii-xvii - потому что «12» соответствует «xii».
n611x007

1
спасибо за ответ, но по моему опыту этот метод иногда работает, а иногда нет; Кроме того, мне довелось найти более одного каталога: как вы это объясните?
jj_p

1
Отличная информация. Вот ссылка на другой полезный источник: Указание согласованной нумерации страниц для документов PDF из W3C.
Адам Маклер

2
Вы уверены, что это работает так же, как это? Из просмотра необработанного содержимого некоторых PDF-файлов казалось, что некоторые индексы указывают на позиции в файле после того, как каталог должен быть обновлен, если длина предыдущего содержимого изменится.
ИЛИ Mapper,

6

Если я вас правильно понимаю, вот как это должно работать:

gs \
  -o modified-pagelabels-50pages.pdf \
  -sDEVICE=pdfwrite \
  -c "[ /Page 1 /Label (i)     /PAGELABEL pdfmark" \
  -c "[ /Page 2 /Label (ii)    /PAGELABEL pdfmark" \
  -c "[ /Page 3 /Label (III)   /PAGELABEL pdfmark" \
  -c "[ /Page 4 /Label (four)  /PAGELABEL pdfmark" \
  -c "[ /Page 5 /Label (v)     /PAGELABEL pdfmark" \
  -c "[ /Page 6 /Label (|||||) /PAGELABEL pdfmark" \
  -f 50pages.pdf

Тем не менее, я , кажется , помнить, что это не надежно и полностью работать в последний раз , когда я попробовал это (около 2 -х лет назад).

ОБНОВЛЕНИЕ: моя память не подводила меня. Теперь я попробовал еще раз и подал отчет об ошибке для Ghostscript ( ошибка 691889 ) по этому поводу. Перейдите по ссылке на отчет об ошибке, чтобы увидеть подробности.


5

ПРИМЕЧАНИЕ 1. Принятый ответ по-прежнему в основном правильный, но имеет некоторые пробелы. Недостаток в том, что многие файлы PDF не могут редактироваться напрямую как текст. Даже когда они есть, такое редактирование может иногда повредить PDF, делая его нечитаемым. Одним из решений, которое будет работать как для Unix, так и для Microsoft Windows, является qpdf, который может переводить PDF-файлы в «QDF», текстовую форму, которая по-прежнему является действительным PDF-файлом. qpdfПакет поставляется с , fix-qdfчто пересчитывает Коррекция после файла QDF была отредактирована , чтобы исправить повреждения.

ПРИМЕЧАНИЕ 2: неудобно с текстовыми редакторами? Попробуйте сначала использовать графический редактор, такой как jpdftweak . Иногда редакторы PDF GUI работают, и в этом случае, ура, вы сделали. Однако, когда они терпят неудачу, как это часто бывает для меня, вы можете попробовать эту более надежную альтернативу. В любом случае, пожалуйста, не голосуйте за мой ответ за элегантность.


КАК редактировать номера страниц PDF с помощью Qpdf

Резюме:

  1. qpdf -qdf foo.pdf foo.qdf
  2. редактировать foo.qdf

     0 << >>           % No label on first pages
     6 << /S /D >>     % Start numbering from 7th page.
    
  3. fix-qdf foo.qdf >bar.qdf
  4. тест бар.qdf
  5. qpdf bar.qdf bar.pdf

Подробные шаги

Шаг 1.

Преобразуйте документ в легко редактируемый формат QDF. Запустите qpdf из командной строки следующим образом:

qpdf -qdf foo.pdf foo.qdf

Примечание. Если qpdf еще не установлен, исполняемые файлы Microsoft Windows можно загрузить из https://github.com/qpdf/qpdf/releases систем Unix, таких как Ubuntu и Debian GNU / Linux, которые можно установить, введя командуapt install qpdf .

Шаг 2.

Отредактируйте документ QDF с помощью текстового редактора, такого как notepad ++, emacs или gedit. Найдите слово /Catalogи отметьте << угловые скобки >> внутри. Рядом вы найдете текущий /PageLabels( если есть ).

Мы будем добавлять каждый раздел, который должен быть по-разному пронумерован /PageLabels. Формат: start-page<< style>>. Обратите внимание, что пробел не имеет значения и что первая страница документа 0. Если не указано иное, новый раздел всегда начинается с нумерации страниц с 1.

Примеры

Вот полный пример того, как может выглядеть PageLabels с добавленными комментариями:

/Type /Catalog
/PageLabels <<
  /Nums [
    0           % From the first page of the document,
      <<
        /S /r   % ...use the lowercase roman numeral style.
      >>
    6           % From seventh page onward,
      <<
        /S /D   % ...use ordinary digits (arabic numerals)
      >>
  ]
>>

Если в файле нет PageLabels, добавьте их после /Type /Catalog. Например, можно изменить,

1 0 obj
<<
  …
  /Type /Catalog
>>
endobj

в,

1 0 obj
<<
  … 
  /Type /Catalog
  /PageLabels
      << /Nums [
    0 << >>                 % No label for cover
    1 << /S /r >>           % i, ii for index
    3 << /S /D /St 15 >>    % 15, 16, 17, ... for article
    31 << /S /D /P (A-) >>  % A-1, A-2, A-3... for appendix
       ]
  >>
>>
endobj

ДОПОЛНИТЕЛЬНО: НАЧИНАЯ С РАЗЛИЧНОГО ЧИСЛА С /St

Каждый раздел перезапускает нумерацию с 1, если вы не укажете иное, используя /St. Обратите внимание, что в приведенном выше примере четвертая страница начинается с 15.

ДОПОЛНИТЕЛЬНО: ИСПОЛЬЗОВАНИЕ РАЗНОГО СТИЛЯ С /S

/SОператор принимает аргумент , который позволяет выбрать стиль нумерации,

  • / D цифры (1, 2, 3 ...)
  • / R заглавные римские (I, II, III ...)
  • / г строчные римские (I, II, III ...)
  • / Прописные буквы (A, B, C, ...., X, Y, Z, AA, AB, AC, ...)
  • / строчные буквы алфавита (a, b, c, ...., x, y, z, aa, ab, ac, ...)

Если пропустить /Sоператор, то этот раздел страниц не будет иметь нумерации. Например:

0 << >>         % No label for cover

ДОПОЛНИТЕЛЬНО: добавление префикса к каждой странице с /P

Вы можете показать любую строку текста перед номером страницы, указав слово в скобках после /P:

  31
  <<
    /S /D
    /P (A-)     % label appendix pages A-1, A-2, A-3
  >>

Указание префикса без стиля ( /S) даст вам страницы, на которых есть только слово без номера. Это может быть полезно, например, если вы хотите, чтобы на титульной странице был просто ярлык «Cover».

     0 << /P (Cover) >>        % No number, just "Cover"

Шаг 3.

Запустите, fix-qdfчтобы сделать ваши правки действительными в формате PDF и поместите вывод в bar.qdf.

fix-qdf foo.qdf > bar.qdf

Шаг 4

Откройте bar.qdf в вашей программе просмотра PDF и убедитесь, что он нумеруется правильно.

Шаг 5

Преобразуйте файл QDF обратно в обычный PDF, например, так:

qpdf bar.qdf bar.pdf

Та да. Вы сделали Теперь у вас есть документ с правильно помеченными номерами страниц в bar.pdf.


4

Есть небольшой скрипт на python, который может сделать эту работу: https://github.com/lovasoa/pagelabels-py

В вашем случае назовите что-то вроде:

./addpagelabels.py --delete file.pdf
./addpagelabels.py --startpage 1 --type 'roman lowercase' file.pdf
./addpagelabels.py --startpage 7 --type arabic file.pdf

Это сделало работу именно так, как мне нужно. Благодарность!
телоториум

3

jPdf Tweak - это графическая утилита с открытым исходным кодом, которая позволяет редактировать ярлыки страниц в файлах PDF. Страница документации содержит пошаговые инструкции.


Я использовал это, чтобы добавить свои собственные метки страниц в виде «пустого» формата с текстом в качестве префикса. Работал хорошо!
Мэтт Сефтон

Это намного лучший ответ, чем редактирование текста вручную
эндолит

Пожалуйста, добавьте пошаговые инструкции здесь, а не полагайтесь на внешнюю ссылку. Благодарность!
hackerb9

1

Для удаления старых, возможно, самый простой кроссплатформенный способ - просто обрезать старые. Вы могли бы к этому, например, с BRISS.

Добавление новых с использованием бесплатных инструментов более сложно. Лично я, вероятно, сделал бы это с pdflatex, как в этом ответе StackExchange , хотя это могло бы быть довольно сложным решением, если у вас нет другого использования pdflatex.

Я думаю, что это можно сделать, но с помощью jPdfTweak .


1

Метод, данный Дейном Х., работает с Acrobat Reader (или, если быть точным, с текущей версией Adobe Reader). Один небольшой момент, на который следует обратить внимание: поле вверху будет принимать только 8 символов, поэтому вы не можете ввести в него что-то вроде «предметного указателя», если такая метка была использована. Но вместо этого вы можете использовать пункт меню Вид> Навигация по страницам> Перейти к ... или эквивалент ключа.

Другой совет: спецификация pdf всегда присваивает номера страниц последовательно, поэтому в случае документа, созданного путем сканирования пар страниц, два набора номеров выходят из строя (если только вы не кропотливо нумеруете каждую страницу по отдельности). Но вы можете без особых усилий настроить свой документ, так что применяется соглашение «перейти на страницу n», где вы переходите на страницы 2n и 2n + 1 ».


1

Ответ датчан самый лучший, форматы немного изменились, это может быть полезно:

%PDF-1.6

29241 0 obj

<</Metadata 1685 0 R/Outlines 29461 0 R/PageLabels<</Nums[0<</S/D>>3<</S/D/St 6>>4<</S/D/St 10>>5<</S/D/St 12>>15<</S/D/St 70>>16<</S/D/St 72>>17<</S/D/St 80>>18<</S/D/St 82>>19<</S/D/St 90>>23<</S/D/St 96>>25<</S/D/St 99>>29<</S/D/St 110>>31<</S/D/St 130>>32<</S/D/St 133>>35<</S/D/St 137>>36<</S/D/St 140>>37<</S/D/St 145>>39<</S/D/St 150>>40<</S/D/St 152>>42<</S/D/St 155>>43<</S/D/St 160>>46<</S/D/St 165>>47<</S/D/St 167>>48<</S/D/St 170>>49<</S/D/St 180>>50<</S/D/St 190>>52<</S/D/St 300>>53<</S/D/St 305>>54<</S/D/St 319>>56<</S/D/St 380>>57<</S/D/St 390>>58<</S/D/St 500>>67<</S/D/St 515>>68<</S/D/St 525>>70<</S/D/St 550>>71<</S/D/St 553>>72<</S/D/St 560>>73<</S/D/St 600>>76<</S/D/St 620>>78<</S/D/St 650>>82<</S/D/St 670>>85<</S/D/St 700>>95<</S/D/St 714>>117<</S/D/St 900>>162<</S/D/St 1000>>178<</S/D/St 1200>>209<</S/D/St 1500>>263<</S/D/St 1555>>270<</S/D/St 1563>>389<</S/D/St 1681>>522<</S/D/St 1813>>]>> /PageMode/UseOutlines/Pages 29177 0 R/Type/Catalog>>

endobj

1

Я обнаружил, что прямое редактирование файла (как несжатого pdftk) не работает, если в области «/ outlines» уже установлено «/ title». Техника прямого редактирования, описанная в посте выше, демонстрируется на Youtube: https://www.youtube.com/watch?v=zoH1Z_hSpak

Но функция «обновления» pdftk может быть более интуитивной (и более надежной, когда «/ title» уже существует в области «/ outlines» PDF-файла) путем редактирования используемого здесь файла «doc_data.txt»: https: / /www.pdflabs.com/blog/export-and-import-pdf-bookmarks/


1
Привет @Bob, Ответы только на ссылки низкого качества. Они будут бесполезны, если целевой сайт перемещается или исчезает. Пожалуйста, отредактируйте свой ответ и процитируйте соответствующую часть решения здесь.
C0deDaedalus

0

BeCyPDFMetaEdit http://www.becyhome.de/becypdfmetaedit/description_eng.htm

Вы можете добавить / удалить / изменить схему номеров внутренних страниц на вкладке "страницы" этого бесплатного инструмента.

И будьте осторожны, программа просмотра PDF xchange не показывает схему нумерации страниц, и foxitreader дает правильный результат. Я не проверял читателя Acrobat.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.