合并/转换多个PDF文件为一个PDF

1516

如何合并或转换多个PDF文件为一个大的PDF文件?

我尝试了以下方法,但目标文件的内容并不如预期:

convert file1.pdf file2.pdf merged.pdf

我需要一个非常简单/基本的命令行(CLI)解决方案。最好的情况是,我可以将合并/转换的输出直接传递到 pdf2ps(就像我在先前提问的问题中尝试过的那样:Linux piping ( convert -> pdf2ps -> lp))。


4
可能因人而异,但这种方法的输出文件似乎分辨率不如pdfunite,并且生成的文件大小也比pdfunite的输出文件大。 - sabujp
1
无论这些解决方案是否保留链接,都在此帖子中进行了讨论。如果您想保留链接(可能还包括其他注释),请使用:如果需要命令行界面,请使用pdftk, 如果需要图形用户界面,请使用pdfsam, 如果需要Web界面,请使用sejda。 - Clément
1
convert 命令行来自于 ImageMagick,它会在执行其他操作之前将 PDF 转换为图像。 - Alexis Wilke
2
pdftk PDF1.pdf PDF2.pdf cat output PDF3.pdf 运行正常。 - Sihat Afnan
显示剩余4条评论
23个回答

2010

考虑到 pdfunitepoppler 的一部分,它更容易被安装,使用也比 pdftk 更简单:

⚠ 重要提示:确保记得提供 out.pdf,否则它将覆盖您命令中的最后一个输入文件 ⚠

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf

更安全的解决方案可能包括针对输出文件进行不存在性测试

export output_file=out.pdf && \
! test -e $output_file && \
pdfunite in-1.pdf in-2.pdf in-n.pdf $output_file

27
它速度很快,但似乎会破坏超链接。请参见http://blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs/。 - Danilo Bargen
571
请确保记得提供“out.pdf”,否则它会覆盖你的命令中的最后一个文件,唉。 - mlissner
12
在 Debian 中,用于 PDF 合并的软件包是 poppler-utils,但在旧版本的 Debian 中可能不存在。 - Jocelyn delalande
28
不建议使用这个。生成的PDF文件太大了。比如说:Pdfunite 生成了一个75MB的文件,而Ghostscript可以把所有内容压缩成1MB。 - Torben
90
假设目录中不存在其他PDF文件,并且它们按照"*"通配符的顺序排序,则可以使用命令“pdfunite *.pdf out.pdf”进行合并。如果原本的顺序没有保留,可以通过使用范围来解决:filename_{0..9}.pdf。 - lepe
显示剩余25条评论

769

尝试使用好的Ghostscript

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=merged.pdf mine1.pdf mine2.pdf

或者甚至可以采用这种方式来改进低分辨率PDF文件的版本(感谢Adriano指出):

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdf

无论哪种情况,输出分辨率都比使用convert高得多且更好。
convert -density 300x300 -quality 100 mine1.pdf mine2.pdf merged.pdf

以这种方式,您无需安装其他任何东西,只需使用系统中已安装的内容即可(至少在我的系统中默认都有)。 更新#1:首先感谢您所有美好的评论!只是一个可能对您们有用的提示,在Google搜索后,我发现了一个绝妙的技巧来缩小PDF的大小,我使用它将300 MB的一个PDF缩小到了15 MB,并且分辨率也能接受!这全部都是在良好的ghostscript的帮助下完成的,以下是方法:
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -dDetectDuplicateImages -dCompressFonts=true -r150 -sOutputFile=output.pdf input.pdf

更新 #2: 如果您需要“烧录”编辑并压缩使用Acrobat制作的PDF文件,则以下内容可能会有所帮助:

gs -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dPDFSETTINGS=/screen -dEmbedAllFonts=true -dSubsetFonts=true -dColorImageDownsampleType=/Bicubic -dColorImageResolution=144 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=144 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=144 -sOutputFile=compressed.pdf withedits.pdf

35
不错的提示,“gs”运行速度非常快,而且它压缩得非常多。不过,当我使用了这个参数“-dPDFSETTINGS=/prepress”后,质量有了很大的改善。 - Adriano P
7
我发现-dPDFSETTINGS=/prepress这个参数可以很好地解决页面过宽、导致水平滚动条出现的问题,具有旋转页面的作用。 - r_31415
36
将以下内容添加到您的.bash_profile文件中即可创建一个方便的快捷方式: pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }。如果你需要经常使用该命令,这能够帮您节省打字时间。使用方法如下:pdfmerge merged.pdf mine1.pdf mine2.pdf - Torben
15
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdf 可以缩短为 gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf。根据文档,"作为一种便捷的速记方式,您可以使用 -o 选项,后跟上述输出文件的规范。-o 选项还设置了 -dBATCH-dNOPAUSE 选项。这旨在是调用 ghostscript 快速转换一个或多个输入文件的快速方式." - MiniMax
7
@Winny 我需要添加 dPrinted=false 来保留超链接,否则会破坏除第一个pdf以外的所有链接。请参考 https://tex.stackexchange.com/questions/245801/local-hyperlinks-broken-after-pdf-processing-with-ghostscript - qdread
显示剩余18条评论

662

抱歉,我自己用谷歌和一点运气找到了答案 :)

对于那些有兴趣的人;

我在我们的 Debian 服务器上安装了 pdftk(PDF 工具包),并使用以下命令实现了所需的输出:

pdftk file1.pdf file2.pdf cat output output.pdf

或者

gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf ...

这可以直接通过管道传送到pdf2ps中。


83
使用Ghostscript也可能起作用: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ... - Nate Kohl
19
值得一提的是,pdftk可以合并加密的PDF文件,而pdfunite则不能。 - Thomas
3
使用pdftk与默认选项中的转换相比,能够提供更好的分辨率。 - Kiran K Telukunta
14
pdftk file1.pdf file2.pdf cat output out.pdf 的输出为合并后的文件 out.pdf - jmiserez
2
pdftk is neat because you can easily select page ranges to merge: pdftk A=file1.pdf B=file2.pdf cat A1-3 B1 output out.pdf - z0r
显示剩余18条评论

162

如果您有多个文件并且不想一个一个地输入名称,那么这是最简单的解决方案:

qpdf --empty --pages *.pdf -- out.pdf

5
qpdf似乎会破坏文档中的超链接。 - David
8
虽然一开始可能很难理解复杂的选项,但是qpdf是非常方便和强大的工具。可以在这里获得在线文档:http://qpdf.sourceforge.net/files/qpdf-manual.html。 - Jonathan Holvey
1
来这里寻找 qpdf 的解决方案,但又不想再次浏览文档以弄清楚,谢谢。 - Hashim Aziz
1
使用shell通配符非常方便,只要顺序对你有用!首先使用echo *.pdf | tr ' ' $'\n'或类似命令来检查顺序! - lmat - Reinstate Monica
1
Qpdf质量高且得到积极维护,这使它比pdftk更好的选择。 - user1142217
显示剩余5条评论

57

此外,pdfjoin a.pdf b.pdf 将创建一个新的 b-joined.pdf,其中包含 a.pdf 和 b.pdf 的内容。


7
这段话很简洁明了,但会破坏超链接。 - bright-star
3
使用pdfjoin(pdflatex)合并页数较多的文件失败。无法将1000页以上的文件合并。 - mdrozdziel
1
pdfjoin会破坏注释或其他非图形项。 - sabujp
10
通常情况下,pdfunite的效果不错。但如果出现“未实现功能:无法合并加密文件”的提示,则可以选择pdfjoin作为较好的替代工具。由于某种原因,pdfjoin不会对加密文件进行投诉。 - Calaf
1
pdfjam 包不再包含 pdfjoin 脚本。您可以在这里找到该脚本。 - Henrik Pingel
显示剩余3条评论

53

pdfunite 可以合并整个PDF。如果要从file1.pdf中选择第2到第7页和从file2.pdf中选择第1、3、4页,您需要使用pdfseparate将文件拆分为每页一个PDF,以便提供给pdfunite

此时,您可能需要一个具有更多选项的程序。 qpdf 是我找到的最好的操作PDF的工具。 pdftk 更大且速度较慢,而Red Hat / Fedora不会打包它,因为它依赖于gcj。其他PDF实用程序具有Mono或Python依赖项。我发现,将页面组合成30页输出PDF的qpdf生成的输出文件比使用pdfseparatepdfunite小得多,970kB与1,6450 kB。由于它提供了更多的选项,qpdf 的命令行不像那么简单;可以使用以下命令执行将file1和file2合并的初始请求:

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf

3
非常同意这个观点。比如说,由于依赖于已经不再支持的gcj,Parabola现在也不再提供pdftk的安装包。虽然我通过使用pacman -Ss pdf搜索PDF文件编辑工具,但我错过了这个信息。感谢您的回答!我认为它应该得到更多的赞,这样它就能够出现在suggestions for pdfunite或者pdftk旁边。 - k.stm
1
在我新安装的Linux Mint上,这个程序可以在终端窗口中运行,无需任何安装或路径调整。不错! - Wallace Kelly
这个完美地运行了,而且还提供了一个更清晰的合并文档,比我尝试过的其他命令都要好。感谢您的帖子。 - Siwoku Adeola
1
如果 even.pdf 文件中的页面被反转(通常在非双面扫描仪上扫描时会出现这种情况),则您需要使用以下命令:qpdf --collate --empty --pages odd.pdf even.pdf z-1 -- merged.pdf - caram

38
你可以直接使用转换命令,例如:
convert sub1.pdf sub2.pdf sub3.pdf merged.pdf

51
这不是无损的。 - Ben Ruijl
15
您可以使用命令convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf进行合并,但生成的文件大小可能会非常大。我建议您改用convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdf命令来进行合并。 - arielnmz
27
这似乎涉及将所有内容转换为光栅图像,尤其是处理基于文本的PDF文件时,这绝对不是最佳选择。 - Julia Ebert
9
几乎是与 OP 描述的不起作用的内容完全相同。 - user829755
20
除非你需要将矢量图转换为光栅图并且不再需要矢量格式,否则不要使用转换后的Postscript或PDF文件。这是一个极其糟糕的想法,难以言喻。 - markgalassi

23

从PyPI使用pdftools

下载tar.gz文件并解压缩,然后运行以下命令:

python pdftools-1.1.0/pdfmerge.py -o output.pdf -d file1.pdf file2.pdf file3 

在运行上述命令之前,您应该安装python3。

此工具支持以下操作:

  • 添加
  • 插入
  • 移除
  • 旋转
  • 分割
  • 合并
  • 压缩

您可以在GitHub中找到更多详细信息,它是开源的。


1
这太完美了。使用gs(上面列出的所有变体),合并两个PDF文件,一个2MB,另一个500Kb,需要几分钟才能完成,并且结果是一个40MB的文件! pdftools瞬间完成,文件大小相同。 - supergra
或者您可以无论如何安装它。依赖项的总大小小于100 kb。 - tejasvi88

17

Apache PDFBox http://pdfbox.apache.org/

PDFMerger 这个应用程序将接受一系列的pdf文档,并将它们合并成一个新的pdf文档。

使用方法:java -jar pdfbox-app-x.y.z.jar PDFMerger "源PDF文件(2..n)" "目标PDF文件"


14

虽然这不是一个命令行解决方案,但它可能对 macOS 用户有所帮助:

  1. 选择您的PDF文件
  2. 右键单击您选择的文件
  3. 选择快速操作 > 创建PDF

1
我不知道为什么这么低。这正是我在寻找的。谢谢你。 - Pavol Travnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接