Як змінити внутрішні номери сторінок у метаданих PDF?


37

У мене є документ pdf, який я створив за допомогою засобів, що не належать до Acrobat (друк у pdf, потім злиття купи pdfs), але я хотів би вручну змінити номери сторінок (тобто перші кілька сторінок - це просто титульні сторінки, сторінка, яка як мічений «сторінка 1» насправді сьомий лист PDF). Який найпростіший (і в ідеалі безкоштовний) спосіб зробити це?

Щоб було зрозуміло, я намагаюся не змінювати числа на самих сторінках, а номери сторінок у "метаданих", які зберігає pdf (самі сторінки вже пронумеровані правильно; я просто хочу "перейти на сторінку 1", щоб перейти на сторінку з позначкою 1, яка може бути аркушем 7).

Для чого це варто, я в Windows, хоч і в мене є доступ до Macs.


Я не впевнений, чи повністю розумію ваш опис + вимогу. Чи можете ви надати посилання на зразок 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/release Системи Unix, такі як Ubuntu та Debian GNU / Linux, можна встановити його, ввівшиapt install qpdf .

Крок 2.

Відредагуйте документ QDF за допомогою текстового редактора, такого як блокнот ++, 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 ...)
  • / r малі римські (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), ви отримаєте сторінки, у яких є лише слово без будь-якого числа. Це може бути корисно, наприклад, якщо ви хочете, щоб на титульній сторінці було просто ярлик "Обкладинка".

     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) не працює, якщо в області "/ контури" вже встановлені "/ заголовки". Техніка прямого редагування, описана у публікації вище, демонструється на Youtube: https://www.youtube.com/watch?v=zoH1Z_hSpak

Але функція "update" pdftk може бути більш інтуїтивно зрозумілою (і більш надійною, коли "/ заголовки" вже існують у регіоні "/ контури" файлу 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 не показує схему номерів сторінок, а фокситредер має правильний результат. Я не перевіряв зчитувач Acrobat.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.