Перенумеровать страницы PDF

25

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

Есть ли А) Способ сделать это вообще с помощью бесплатных инструментов; и B) способ сделать это «в пакетном режиме» (так, без необходимости перенумерации каждой страницы вручную).

MarkovCh1
источник
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, и в этом процессе гиперссылки и подобные вещи отбрасываются (насколько я помню, для безопасности). Поскольку OP был о сканированном 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 и других операционных системах.

Страница документации содержит пошаговые инструкции.

CherryBerry
источник
Спасибо, это то, что мне действительно помогло, сохранение форм и все. jPDF Tweak - действительно мощная вещь, хотя и с не очень удобным интерфейсом.
TiGR
Если бы в первоначальном вопросе не упоминались пакетные задания, я бы сказал, что этот ответ действительно заслуживает того, чтобы быть принятым.
Брайан З.
4

Существует инструмент под названием PDF Mod, который является бесплатным инструментом для изменения порядка страниц PDF.

Его можно установить из Ubuntu Software Center в 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

Wilsonzaizai
источник
4
Ах, но мой вопрос не касался того, как переставить страницы. Это должно было изменить метаданные для страниц: перемаркировать номера страниц (вставьте римские цифры в качестве первых нескольких страниц, возможно, пропустите несколько; PDF, конечно, поддерживают первые).
МарковЧ1,
3

Просто нашел указатель, который можно использовать ghostscriptдля этого, здесь: pdftk - Добавить и редактировать закладки в pdf - Unix и Linux - Stack Exchange # 18600 ; это относится к ссылкам:

Однако вышеизложенное касается закладок, а не логической нумерации страниц. Получается из pdfmarkReference.pdf , необходимая «команда» - это /Label«(или /PAGELABEL») - и далее это относится к PDFReference.pdf, глава 8.3.1 «Метки страницы». К сожалению, эта глава не обязательно объясняет, как pdfmarks можно использовать с ярлыками страниц - но этот пост делает:

В / pAGELABEL pdfmark нет ключа / Page, поэтому можно установить метку только для «текущей» страницы (и, как следствие, только для одной страницы за раз). Поскольку вы вызываете его в самом начале, ожидается, что он установит метку для 1-й страницы и только для нее.

Несколько / PAGELABEL для одной и той же страницы: ссылка на pdfmark говорит, что последняя вступает в силу, поэтому результат вашей первой командной строки в порядке. Обратите внимание, что ключ / Page игнорируется.

Как установить метки страницы из PostScript? Я могу думать о 2 методах:

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

Выпустите / PAGELABEL как часть каждой страницы.

(B) Менее документированный способ: ...

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, вы можете запускать каждую страницу из файла в отдельности. Таким образом, вы можете установить pagmark PAGELABEL для страницы 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скрипт для перенумерации страниц :)
Ура!

 

РЕДАКТИРОВАТЬ 2: Думаю, понял - используйте ту же 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
sdaau
источник
Большой! Спасибо, ты не
шутишь
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
DG»
источник
1
Это отличное решение!
mikemtnbikes
1
Это работает как очарование, огромная экономия времени тоже!
Бастиан
1

Openoffice / Libreoffice может справиться с расширением pdf-import и макросом разбиения на страницы.

Не идеальное решение, но оно работает для меня (кроме использования PDF Mod - который я настоятельно рекомендую).

RolandiXor
источник
Расширение pdf-import похоже на ошибку для OpenOffice.org 3.2. Импорт (в Draw и Writer) дает «ошибку ввода-вывода».
МарковЧ1,
0

Попробуйте pyPdf , библиотеку python для работы с PDF-документами. Некоторое, но не очень, программирование было бы необходимо.

Вы также можете взглянуть на PDFtk , хотя я не проверял, поддерживает ли он изменение номера страницы, связанной с отдельными страницами. Оба доступны в виде пакетов в Ubuntu.

loevborg
источник
1
Хм, PDFtk, похоже, не в состоянии это сделать. В pyPdf есть много методов для извлечения метаданных, но, похоже, они не могут записать их обратно в документ.
МарковЧ1,
0

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

Редактирование текста в PDFEdit

lazyPower
источник
1
Я не думаю, что PDF Edit может изменить номера страниц. Я пытался и не удалось, во всяком случае.
МарковЧ1,
2
@Syzygy - действительно, только что проверил: pdfeditможет показать Catalog/PageLabelsDict, если документ есть, но если он выбран, он говорит: « Этот словарь не имеет каких-либо непосредственно редактируемых свойств » ... Ура!
Сдау