一次性合并 PDF 并删除页面

一次性合并 PDF 并删除页面

我想连接 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-consolesejda-console.bat

如您所见,您仍然必须手动提供每个文档的页面范围。如果您想自动执行此操作,您可以编写一个 bash 脚本或类似脚本,首先计算 PDF 页数(例如,通过使用 libpoppler 的pdfinfo),然后sejda相应地编写命令行。

相关内容