我想编辑扫描的PDF 的元数据,以将自定义页码分配给不同的页面。例如,现在我想将第1-3页称为i,ii和iii,什么将第4-10页称为1-7。我不希望改变页面的实际顺序。
是否有A)使用免费工具完全做到这一点的方法;B)“批量”执行此操作的方法(因此,无需手动重新编号每个页面)。
我想编辑扫描的PDF 的元数据,以将自定义页码分配给不同的页面。例如,现在我想将第1-3页称为i,ii和iii,什么将第4-10页称为1-7。我不希望改变页面的实际顺序。
是否有A)使用免费工具完全做到这一点的方法;B)“批量”执行此操作的方法(因此,无需手动重新编号每个页面)。
Answers:
这里是一个基于LaTeX的解决方案。它使用该pdfpages
软件包包括扫描的PDF(此处称为scan.pdf
)。您可以使用启用hyperref
了pdfpagelabels
选项的软件包来设置所需的PDF页面标签。它使用普通\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应该不会有任何问题。
如果您更经常需要此脚本,则可以编写一个脚本,该脚本接受罗马编号的页数和文件名作为参数,并使用上述代码创建一个临时文件,其中名称和数字为变量,然后进行编译。
您可以使用文本编辑器执行此操作。
如答案所说,用文本编辑器打开一个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标准-页面标签具有详细的规范。
jPDF Tweak是一个开源图形实用程序,提供页码编号(正确的术语是“页面标签”)以及许多其他初学者到高级PDF编辑功能。它可以在Ubuntu和其他操作系统上运行。
“ 文档”页面提供了分步说明。
有一个名为PDF Mod的工具,这是一个免费工具,可以重新排列PDF页面。
可以从Ubuntu 10.10及更高版本中的Ubuntu软件中心安装。
要在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
刚刚在这里找到了可以使用的指针ghostscript
:pdftk-向pdf添加和编辑书签-Unix和Linux-Stack Exchange#18600 ; 它指的是链接:
但是,以上内容处理书签-而不处理逻辑分页。从pdfmarkReference.pdf可以看出,所需的“命令”是' /Label
'(或' /PAGELABEL
')-并进一步参考PDFReference.pdf第8.3.1章“页面标签”。不幸的是,该章不必解释如何将pdfmarks与页面标签一起使用-但这篇文章确实做到了:
/ PAGELABEL pdfmark没有任何/ Page键,因此只能设置“当前”页面的标签(因此,一次只能设置一页)。由于您从一开始就调用它,因此应该为第一页设置标签,并且仅为其设置标签。
同一页上有多个/ 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文件,因此您可以单独运行文件中的每个页面。因此,您可以为第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
有一个小的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
Openoffice / Libreoffice可以使用pdf-import扩展名和分页宏来解决问题。
这不是一个完美的解决方案,但是它对我有用(除了使用PDF Mod,我强烈建议这样做)。
尝试使用pyPdf(一个处理PDF文档的python库)。一些但不是很多编程是必要的。
您也可以看一下PDFtk,尽管我没有检查它是否支持更改与单个页面相关的页码。两者都可以在Ubuntu中作为软件包使用。
那里还有另一个名为PDFEdit的应用程序-它托管在源伪造中。 Source Forge项目页面 -但这无济于事,因为它不是您所需的功能
pdfedit
可以显示Catalog/PageLabels
Dict,但是如果选中该文档,它会说:“ 此词典没有任何可直接编辑的属性 ”。