我想连接 pdf 文档而不丢失任何信息(图像重新采样等)。我只想进行无损压缩、合并字体等。
在合并之前,我想删除每个文档的第一页和最后一页。如何将此操作与合并过程结合起来,这样我就不需要通过 gs 运行每个文件两次了?
为了合并,我使用来自的命令这非常好的答案。我添加了 dPDFSETTINGS=\prepress。我不确定这是否有必要或是一个好主意。
gs \
-o book.pdf \
-sDEVICE=pdfwrite \
-dPDFSETTINGS=/prepress \
-dColorConversionStrategy=/LeaveColorUnchanged \
-dEncodeColorImages=false \
-dEncodeGrayImages=false \
-dEncodeMonoImages=false \
title.pdf \
content.pdf
更新:
我尝试在一些实际文件上执行上述命令(不删除页面),但运行速度非常慢。
gswin32c.exe -dBATCH -dNOPAUSE -o temp.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -dColorConve
rsionStrategy=/LeaveColorUnchanged -dEncodeColorImages=false -dEncodeGrayImages=false -dEncodeMonoImages=false [list of pdf files] pdfmark
对 20 个 2MB 文件运行上述命令会创建近 2 GB 的临时文件,然后运行速度极慢,CPU 利用率很低,HDD 活动很多。它大约需要 20 分钟,输出文件大小为 800 MB。
我收到此错误消息:GPL Ghostscript 9.10:字体 HiddenHorzOCR 中缺少字形 CID=0、字形=0028。输出 PDF 可能无法在某些查看器上显示。
另一方面,pdftk 运行时间为 30 秒,输出文件为 40 MB。使用 gs 添加书签又需要一分钟,文件大小缩小到 30 MB。
gswin32c.exe -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf pdftk.pdf pdfmark
使用 pdftk 有什么缺点吗?我希望以完全相同的质量保存图像,不丢失任何细节,也不会使文件不必要地变大。除此之外,我不太在意,pdf 大多是扫描的科学文章和书籍章节。我想删除的页面是每篇文章扫描的封面页,一个在前面,一个在结尾。
答案1
关于您的更新:pdftk
保留图像质量设置但不保留元数据、章节标记等。
sejda
是一款新的 pdf 编辑工具包,可以完成 pdftk 的所有功能,甚至更多。最重要的是,它保留了所有质量设置和大部分文件元数据。Sejda 需要 Java 才能运行。
以下是有关合并操作的文档:
$sejda merge -h
Given a collection of pdf documents, creates a single output pdf document composed by the selected pages of each input document taken in the given order.
Example usage: sejda-console merge -f /tmp/file1.pdf /tmp/file2.pdf -o /tmp/output.pdf -s all:12-14:32,12-14,4,34-:
Usage: sejda-console merge options
[--addBlanks] : add a blank page after each merged document if the number of pages is odd (optional)
--bookmarks -b value : bookmarks merge policy. {discard, retain, one_entry_each_doc }. Default is 'retain' (optional)
[--compressed] : compress output file (optional)
[--copyFields] : input pdf documents contain forms (high memory usage) (optional)
[--directory -d value] : directory containing pdf files to merge. Files will be merged in alphabetical order. (optional)
[--files -f value...] : pdf files to operate on: a list of existing pdf files (EX. -f /tmp/file1.pdf or -f /tmp/password_protected_file2.pdf:secret123) (optional)
[--filesListConfig -l value] : xml or csv file containing pdf files list to concat. If csv file in comma separated value format; if xml file <filelist><file value="filepath" /></filelist> (optional)
[--help -h] : prints usage information. Can be used to detail options for a command '-h command' (optional)
[--matchingRegEx -e value] : regular expression the file names have to match when the directory input is used (Ex -e "test(.*).pdf"). (optional)
--output -o value : output file (required)
[--overwrite] : overwrite existing output file (optional)
--pageSelection -s value : page selection script. You can set a subset of pages to merge as a colon separated list of page selections. Order of the pages is relevant. Accepted values: 'all' or 'num1-num2' or 'num-' or 'num1,num2-num3..'
(EX. -f /tmp/file1.pdf /tmp/file2.pdf -s all:all:), (EX. -f /tmp/file1.pdf /tmp/file2.pdf /tmp/file3.pdf -s all:12-14:32,12-14,4,34-:) to merge file1.pdf, pages 12,13,14 of file2.pdf and pages 32,12,13,14,4,34,35.. of file3.pdf.
If -s is not set default behaviour is to merge document completely (optional)
--pdfVersion -v value : pdf version of the output document/s {2, 3, 4, 5, 6 or 7}. Default is 6. (optional)
假设您有两个 PDF 文件,file1.pdf 和 file2.pdf,每个文件长 50 页,并且想要合并它们,同时在每个情况下都忽略第一页和最后一页。此命令应该可以解决问题:
sejda-console merge -f file1.pdf file2.pdf -o merge.pdf -s 2-49:2-49:
注意:如果您使用的是 Windows,则可能需要替换sejda-console
。sejda-console.bat
如您所见,您仍然必须手动提供每个文档的页面范围。如果您想自动执行此操作,您可以编写一个 bash 脚本或类似脚本,首先计算 PDF 页数(例如,通过使用 libpoppler 的pdfinfo
),然后sejda
相应地编写命令行。