Перенумерація сторінок PDF


25

Я хочу відредагувати метадані відсканованого PDF, щоб призначити спеціальні номери сторінок різним сторінкам. Наприклад, те, що зараз є сторінками 1-3, які я б міг би зателефонувати i, ii та iii, а що - сторінки 4-10, я хочу зателефонувати 1-7. Я не хочу змінювати фактичний порядок сторінок.

Чи існує A) Спосіб зробити це взагалі за допомогою безкоштовних інструментів; і B) Спосіб зробити це "в пакеті" (так, без необхідності перенумерувати кожну сторінку вручну).


1
Чи були б ви задоволені рішенням, заснованим на LaTeX? Можна було б включити PDF в інакше порожній документ і створити номери сторінок PDF так, як вам подобається.
Мартін Шаррер

Я дійсно був би задоволений рішенням LaTeX. Чи можете ви опублікувати деякі деталі нижче?
MarkovCh1

Відповіді:


22

Ось рішення, засноване на LaTeX. Він використовує pdfpagesпакет для включення відсканованого PDF (тут його називають scan.pdf). Потрібні мітки сторінки PDF можна встановити за допомогою hyperrefпакета з pdfpagelabelsувімкненою опцією. Він використовує звичайний \thepageмакрос як мітку, яку можна визначити для малих римських чисел. Потім лічильник сторінок скидається і повертається до звичайних цифр.

\documentclass[a4paper]{article}% or use 'letterpaper'
\usepackage{pdfpages}
\usepackage[pdfpagelabels]{hyperref}
\begin{document}
% Set lower case roman numbers (\Roman would be upper case):
\renewcommand{\thepage}{\roman{page}}
\includepdf[pages=1-3]{scan.pdf}
% Back to normal (arabic) numbers:
\renewcommand{\thepage}{\arabic{page}}
% Reset page counter to 1:
\setcounter{page}{1}
\includepdf[pages=4-]{scan.pdf}
\end{document}

Помістіть вищезазначений код у файл (наприклад scan_mod.tex) та компілюйте його з pdflatex:

# pdflatex scan_mod

Це дасть результат scan_mod.pdf. Однак будь-які спеціальні примітки включають гіперпосилання зникне. Це не повинно бути жодних проблем зі сканованими PDF-файлами.

Якщо вам це потрібно частіше, ви можете написати сценарій, який приймає кількість армійських пронумерованих сторінок та ім'я (файлів) файлів як аргументи та створює тимплейф із наведеним вище кодом, де ім'я та числа є змінними, який потім компілюється.


Дякую за таку ґрунтовну відповідь! Це чудове рішення. Єдині інші рішення, про які мені було відомо, включали або .NET, або щось не менш жахливе, або пробігаючи діалоги в Adobe Acrobat (чого я не можу собі дозволити). Це навіть сценарій!
MarkovCh1

Приємне рішення! Мені було цікаво одне й те саме питання генерації пакетів закладок / контурів на лівій панелі із гіперпосиланнями на початок кожного розділу / глави. Чи можливо також використовувати LaTex? Ось моє запитання askubuntu.com/questions/27312/bookmark-pdf-and-djvu-files . Спасибі!
Тім

2
@Tim: Ви можете створювати закладки PDF за допомогою LaTeX, комбінуючи PDF-файли. Дивіться мою відповідь на те, як я використовую LaTeX для створення змісту (заголовки глав, підрозділи тощо) для набору файлів pdf, які я об'єдную в один великий pdf? на TeX.SX.
Мартін Шаррер

Це фантастична відповідь, я її використав, і вона прекрасно працює.
Андреа Лацаротто

1
@TiGR: Так, це тому, що сторінки оригінального PDF додаються до нового PDF-файлу, і в цьому процесі гіперпосилання та подібні речі відкидаються (для безпеки, наскільки я пам’ятаю). Оскільки ОП стосувався сканованого PDF, це не було проблемою.
Мартін Шаррер

10

Це можна зробити за допомогою текстового редактора.

Як йдеться у відповіді, відкрийте файл PDF у текстовому редакторі, шукайте /Catalogзапис, а потім додайте запис, названий /PageLabelsтак:

/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
]
>>

Зауважте, що індекси сторінок (фізичні номери сторінок) починаються з 0.

Зрозуміло, ви можете це зробити автоматично, використовуючи мови сценаріїв.

Стандарти PDF - Етикетки сторінок мають детальну специфікацію.


+1 Ця відповідь набагато простіша і краща за прийняту, а посилання на специфікацію - це чудова допомога.
jja

6

jPDF Tweak - це графічна утиліта з відкритим кодом, яка пропонує нумерацію сторінок (правильний термін - "маркування сторінок") та багато інших функцій для редагування PDF для початківців. Він працює на Ubuntu та інших операційних системах.

Сторінка Документація містить покрокові інструкції.


Дякую, це те, що мені справді допомогло, зберігаючи форми та все. jPDF Tweak - це дійсно потужна річ, хоча з не дуже зручним інтерфейсом.
TiGR

Якщо в оригінальному запитанні не було зазначено пакетних завдань, я б сказав, що ця відповідь справді заслуговує на те, щоб бути прийнятою.
Брайан Z

4

Існує інструмент під назвою PDF Mod, який є безкоштовним інструментом для перестановки сторінок PDF.

Його можна встановити з програмного центру Ubuntu в Ubuntu 10.10 і новіших версій.

Щоб встановити в Ubuntu 9.10 або 10.04:

Щоб встановити Додайте ppa ppa:pdfmod-team/ppaдо своїх програмних джерел ( Ось як це зробити ) та встановіть pdfmod з центру програмного забезпечення

Адаптовано з: http://www.webupd8.org/2011/03/edit-pdf-documents-in-linux-with-pdf.html

Удачі: D


4
Ах, але в моєму питанні не було питання про те, як переставити сторінки. Потрібно було змінити метадані для сторінок: відновити номери сторінок (вставити римські цифри як перші кілька сторінок, можливо, пропустити декілька; PDF-файли, безумовно, підтримують колишні сторінки).
MarkovCh1

3

Щойно знайшов вказівник, який можна було б використовувати ghostscriptдля цього, ось тут: pdftk - додавання та редагування закладок у pdf - Unix та Linux - обмін стеками №18600 ; воно посилається на посилання:

Однак, вищезгадане стосується закладок, а не логічної сторінки. Виявляється, що з pdfmarkReference.pdf потрібна "команда" є " /Label" (або " /PAGELABEL"), і далі вона посилається на PDFReference.pdf глава 8.3.1 "Мітки сторінки". На жаль, ця глава не обов'язково пояснює, як можна використовувати PDF-позначки з мітками сторінок, але ця публікація:

У pdfmark / PAGELABEL немає жодного ключа / Page, тому ви можете встановити мітку лише для "поточної" сторінки (і, як наслідок, лише для однієї сторінки одночасно). Оскільки ви називаєте це на самому початку, очікується встановити мітку для 1-ї сторінки та лише для неї.

Кілька / PAGELABEL для однієї сторінки: посилання pdfmark говорить про те, що останній набирає чинності, тому результат вашого першого командного рядка нормальний. Зверніть увагу, що клавіша / Сторінка ігнорується.

Як встановити мітки сторінки з PostScript? Я можу придумати два способи:

(A) 100% документально підтверджений спосіб:

Видайте / PAGELABEL як частину кожної сторінки.

(Б) Менш задокументований спосіб: ...

gswin32c -sDEVICE=pdfwrite -sOutputFile=50pages.pdf -dNOPAUSE

GS>[/_objdef {pl} /type /dict /OBJ pdfmark
GS>[{pl} <</Nums [0 <</P (Page ) /S /r /St 10>> 2 <<>>]>> /PUT pdfmark
GS>[{Catalog} <</PageLabels {pl}>> /PUT pdfmark
GS>50 { showpage } repeat
GS>quit

... і далі в цій темі:

Щодо того, щоб зробити цю роботу; оскільки оригінальний файл - це PDF-файл, ви можете запустити кожну сторінку з файлу окремо. Таким чином, ви можете встановити PAGELABEL pdfmark для сторінки 1, запустити сторінку 1 з оригінального файлу, встановити PAGELABEL для сторінки 2, запустити сторінку 2 з оригінального файлу тощо.

Оскільки мітка (як сказано в SaGS) застосована до поточної сторінки, це має правильно встановити мітки для кожної сторінки у вихідному PDF-файлі. (застереження: я цього ще не намагався)

РЕДАКТУВАТИ: просто щоб показати це - якщо ви зберегли це як pdfmarksфайл:

[ /Label (-1) /PAGELABEL pdfmark
showpage
[ /Label (0) /PAGELABEL pdfmark
showpage
[ /Label (1) /PAGELABEL pdfmark
showpage

... і ви телефонуєте:

gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=outfile.pdf infile.pdf pdfmarks

... тоді ви отримаєте три порожні сторінки, додані в кінці, з infile.pdfпозначкою -1, 0 і 1 :)

 

Ну, можливо, це допоможе колись отримати більш простий gsскрипт для перенумерування сторінок :)
Привіт!

 

EDIT2: Зрозумів - я використовую ту ж gsкоманду, що і вище - і нижче pdfmarksміститься вміст скрипту, який перенумерує файл infile.pdf, тому він починається з -1, 0, 1 ... Це в основному модифікований приклад з посилання на PDF (див. коментарі для отримання додаткової інформації):

% Type name (Optional) The type of PDF object that this dictionary describes; if present, must be PageLabel for a page label dictionary.
% S name (Optional) The numbering style to be used for the numeric portion of each page label:
%       D Decimal arabic numerals
%       R Uppercase roman numerals
%       r Lowercase roman numerals
%       A Uppercase letters (A to Z for the first 26 pages, AA to ZZ for the next 26, and so on)
%       a Lowercase letters (a to z for the first 26 pages, aa to zz for the next 26, and so on)
% P text string (Optional) The label prefix for page labels in this range.
% St integer (Optional) The value of the numeric portion for the first page label in the range. Subsequent pages will be numbered sequentially from this value, which must be greater than or equal to 1. Default value: 1.

% renumber first 25 pages - push each by 10, and add prefix:
% [/_objdef {pl} /type /dict /OBJ pdfmark
% [{pl} <</Nums [0 <</P (Page ) /S /D /St 10>> 25 <<>>]>> /PUT pdfmark
% [{Catalog} <</PageLabels {pl}>> /PUT pdfmark

[/_objdef {pl} /type /dict /OBJ pdfmark
[{pl} <</Nums [ 0 << /P (-1) >>         % just label -1 (no style) for pg 0;
                1 << /P (0) >>          % just label  0 (no style) for pg 1;
                2 << /S /D /St 1 >>     % decimal style, start from 1, for pg2 and on.
                ]>> /PUT pdfmark
[{Catalog} <</PageLabels {pl}>> /PUT pdfmark

Чудово! Дякую, ти не
жартуєш

3

Існує невеликий сценарій python, який може зробити цю роботу: https://github.com/lovasoa/pagelabels-py

У вашому випадку зателефонуйте:

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

1
Це чудове рішення!
mikemtnbikes

1
Це працює як шарм, величезна економія часу теж!
Бастіан

1

Openoffice / Libreoffice може зробити трюк за допомогою розширення pdf-import та макросу розширення.

Це не ідеальне рішення, але воно працює для мене (крім використання PDF Mod - що я настійно пропоную).


Розширення на імпорт pdf здається розбитим для OpenOffice.org 3.2. Імпорт (у програму Draw and Writer) дає "помилку вводу / виводу".
MarkovCh1

0

Спробуйте pyPdf , бібліотеку пітонів, щоб управляти документами PDF. Деякі, але не дуже, програмування були б необхідні.

Ви також можете подивитися PDFtk , хоча я не перевіряв, чи підтримує він зміну номера сторінки, пов’язаної з окремими сторінками. Обидва вони доступні як пакети в Ubuntu.


1
Гм, схоже, PDFtk не може це зробити. pyPdf має багато методів вилучення метаданих, але, схоже, не в змозі записати їх назад у документ.
MarkovCh1

0

Існує ще одне додаток під назвою PDFEdit - його розміщено у джерельній кузні. Сторінка проекту Forge Source - Однак це не допомагає, оскільки це не функціонал, який вам потрібен

Редагування тексту в PDFEdit


1
Я насправді не думаю, що PDF Edit може змінити номери сторінок. Я намагався і в будь-якому випадку не досяг успіху.
MarkovCh1

2
@Syzygy - дійсно, щойно перевірено: pdfeditможе показати Catalog/PageLabelsDict, якщо документ має його, але якщо він вибраний, він говорить: " Цей словник не має жодних безпосередньо редагованих властивостей " ... Ура!
sdaau
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.