重新编号 PDF 的页面

重新编号 PDF 的页面

我想编辑元数据扫描的 PDF 的页面编号,以便为不同的页面分配自定义页码。例如,现在的第 1-3 页我可能想称为 i、ii 和 iii,第 4-10 页我想称为 1-7。我确实不是想要改变页面的实际顺序。

有没有 A) 一种使用免费工具来完成这一任务的方法;以及 B) 一种“批量”完成这一任务的方法(因此,无需手动对每页重新编号)。

答案1

这是一个基于 LaTeX 的解决方案。它使用pdfpages包来包含扫描的 PDF(此处称为)。可以使用启用选项的包来scan.pdf设置所需的 PDF 页面标签。它使用普通宏作为标签,可以将其定义为小写罗马数字。然后重置页码计数器并改回普通数字。hyperrefpdfpagelabels\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 来说,这应该不是问题。

如果您更频繁地需要此功能,您可以编写一个脚本,该脚本接受罗马数字页码和文件名作为参数,并使用上述代码创建一个临时文件,其中名称和数字是变量,然后进行编译。

答案2

您可以使用文本编辑器来完成此操作。

正如答案所说,用文本编辑器打开一个 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 标准 - 页面标签有详细规范。

答案3

jPDF 调整是一款开源图形实用程序,提供页码编号(正确术语是“页面标签”)和许多其他初级到高级 PDF 编辑功能。它可在 Ubuntu 和其他操作系统上运行。

文档页面提供了分步说明。

答案4

刚刚找到一个可以用于ghostscript此的指针,如下:pdftk - 添加和编辑 pdf 书签 - Unix 和 Linux - Stack Exchange #18600;它指的是链接:

然而,上述代码处理的是书签,而不是逻辑分页。事实证明pdfmarkReference.pdf,所需的“命令”是' /Label'(或' /PAGELABEL') - 它进一步指PDF参考.pdf第 8.3.1 章“页面标签”。不幸的是,该章并不一定解释如何将 pdfmarks 与页面标签一起使用 - 但这篇文章解释了这一点:

/PAGELABEL pdfmark 没有任何 /Page 键,因此只能为“当前”页面设置标签(因此,一次只能为一页设置标签)。由于您在一开始就调用它,因此预计会为第一页设置标签,并且只为第一页设置标签。

同一页有多个 /PAGELABEL:pdfmark 参考资料说最后一个生效,因此第一个命令行的结果是正确的。请注意,/Page 键将被忽略。

如何从 PostScript 设置页面标签?我能想到两种方法:

(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 文件,您可以单独运行文件中的每一页。因此,您可以为第 1 页设置 PAGELABEL pdfmark,从原始文件运行第 1 页,为第 2 页设置 PAGELABEL,从原始文件运行第 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

相关内容