30

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

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

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

10 ответов10

34

То, что вы хотите, действительно называется ярлыками страниц и может быть легко добавлено непосредственно в исходный код 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.

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) по этому поводу. Перейдите по ссылке на отчет об ошибке, чтобы увидеть подробности.

1

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


КАК Редактировать номера страниц 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.

1

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

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

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

1

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

0

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

%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
0

Я обнаружил, что прямое редактирование файла (как несжатого 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/

0

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

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

0

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

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

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

0

Есть небольшой скрипт на 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .