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


1067

如何将多个PDF文件合并/转换为一个大PDF文件?

我尝试了以下操作,但是目标文件的内容不符合预期:

convert file1.pdf file2.pdf merged.pdf

我需要一个非常简单/基本的命令行(CLI)解决方案。最好的办法是,如果我可以将合并/转换的输出直接传送到管道中pdf2ps(就像我在前面的问题中最初尝试的那样:Linux管道(转换-> pdf2ps-> lp))。


3
ymmv,但这似乎在输出文件中没有pdfunite那样好的分辨率,而且它导致的文件大小也比pdfunite的输出大
sabujp 2015年


无论何时使用这些解决方案保留或不保留链接,都会在本文中讨论。如果要保留链接(可能与其他注释一起使用),请使用pdftk(如果要使用命令行界面),请使用pdfsam(如果要使用图形用户界面),请使用sejda(如果要使用Web界面)。
克莱门特

Answers:


1387

考虑到这pdfunite是poppler的一部分,因此它有较高的安装机会,使用也比pdftk以下方法简单:

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

20
速度很快,但似乎破坏了超链接。参见blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs
Danilo Bargen

425
只需确保记得提供out.pdf,否则,它会覆盖命令中的最后一个文件。
mlissner

10
pdfunite的软件包在debian中是poppler-utils,但在旧的debian版本中可能不存在。
Jocelyn delalande 2013年

16
无法推荐这个。生成的PDF的大小太大。例如:Pdfunite给我一个75MB的文件,而Ghostscript将所有内容打包为1MB。
Torben

64
您可以使用:pdfunite *.pdf out.pdf假设该目录中不存在其他pdf,并且其顺序由“ *”保留。如果未保留,则使用范围:filename_ {0..9} .pdf解决。
lepe 2015年

547

尝试好的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

这样,您无需安装其他任何东西,只需使用系统中已经安装的内容即可(至少在我的产品中默认都包含这两者)。

希望这可以帮助,

更新:首先感谢您的所有好评!只是一个对您可能有用的提示,在谷歌搜索后,我发现了一种精妙的技巧来缩小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

干杯!!


27
不错的提示,gs运行非常快,而且压缩很多。但是,使用此参数后,质量有了很大提高:-dPDFSETTINGS=/prepress
Adriano P

3
我发现-dPDFSETTINGS=/prepress旋转太宽的页面会产生很好的效果,并且使水平滚动条变得令人讨厌。
罗伯·史密斯

24
将以下行添加到您的命令中.bash_profile,您将获得一个不错的快捷方式:pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }如果您需要大量使用该命令,则可以节省一些键入时间。用法如下所示:pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben

2
我试图找到-dBATCH标志的描述,但找不到。即使是男人也没说什么。但是很棒,而且没有任何其他程序!
米哈尔·冈达

3
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

513

抱歉,我设法使用Google自己找到了答案,还有些运气:)

对于那些感兴趣的人;

我在我们的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中。


81
使用ghostscript也可能有效: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Nate Kohl

15
值得一提的是,pdftk可以合并加密的pdf,而pdfunite不能合并
Thomas

3
使用pdftk可以提供更好的分辨率,与默认选项进行比较相比。
Kiran K Telukunta 2014年

13
pdftk file1.pdf file2.pdf cat output out.pdf将合并后的文件输出为out.pdf
jmiserez

2
pdftk由于缺少依赖项,因此不适用于EL7系统libgcj
编码员

72

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

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


2
这似乎是迄今为止最容易的
baxx

1
qpdf似乎破坏了文档中的超链接
David Granqvist,

2
尽管很难一开始就了解复杂的选项,但是qpdf是一个非常方便且强大的工具。在线文档在这里
Jonathan Holvey '19

绝对最方便!
幸运

54

pdfjoin a.pdf b.pdf将创造一个新的b-joined.pdf与a.pdf和b.pdf的内容


5
这很简洁,但是会破坏超链接。
明星

3
pdfjoin(pdflatex)失败,页面文件很多。无法合并到1k页文件。
mdrozdziel 2014年

pdfjoin会中断注释或其他非图形项
sabujp

pdfjoin页面后,“ URW Palladio L”字体变得不可见。
v_2e 16-11-5

9
pdfunite通常效果很好,但是如果显示“未实现的功能:无法合并加密的文件”,则pdfjoin是一个不错的选择。出于某种原因,pdfjoin不会抱怨加密。
卡拉夫

38

您可以直接使用convert命令,

例如

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf

40
这不是无损的。
Ben Ruijl 2014年

12
您可以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 2014年

21
看来,这涉及将所有内容转换为光栅图像,这绝对不是最好的方法,尤其是在处理基于文本的PDF时。
翼龙

5
几乎是OP所描述的无效副本
user829755 2015年

15
除非您从矢量到光栅,再也不要返回,否则请勿将convert用于Postscript或PDF文件。很难高估这是一个坏主意。
markgalassi 2015年

32

pdfunite合并整个PDF很好。例如,如果要使用file1.pdf的第2-7页和file2.pdf的第1,3,4页,则必须使用pdfseparate来将文件分割成单独的PDF,以供每个页面使用pdfunite

到那时,您可能想要一个带有更多选项的程序。qpdf是我发现的处理PDF的最佳工具。pdftk更大,更慢,并且Red Hat / Fedora不打包它,因为它依赖gcj。其他PDF实用程序具有Mono或Python依赖项。我发现qpdf生成的输出文件比使用pdfseparatepdfunite将页面组合成30页的输出PDF(970kB与1,6450 kB)要小得多。因为它提供了更多选项,所以它qpdf的命令行不是那么简单。合并文件1和文件2的原始请求可以通过

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

2
这么多。例如,抛物线不再打包pdftk,因为它依赖于gcj,我相信对此已经失去了支持。尽管通过搜索了pdf操作工具pacman -Ss pdf,但我还是错过了。感谢您的回答!我应该收到更多赞誉,因此它会在pdfunite或的建议旁边显示pdftk
k.stm

1
在我全新安装的Linux Mint上,此命令在“终端”窗口中运行,而无需任何安装或路径调整。真好!
华莱士·凯利

这非常有效,并且还给出了更清晰的合并文档,供我尝试使用的其他命令使用。感谢您的帖子。
4

14

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

PDFMerger此应用程序将获取pdf文档列表并将其合并,将结果保存到新文档中。

用法:java -jar pdfbox-app-xyzjar PDFMerger“源PDF文件(2 ..n)”“目标PDF文件”


11

使用python https://pypi.python.org/pypi/pdftools/1.0.6的 PDF工具

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

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

运行上面的命令之前,您应该安装pyhton3

该工具支持以下内容

  • 去掉
  • 旋转
  • 分裂
  • 合并
  • 压缩

您可以在下面的链接中找到更多详细信息,它是开源的

https://github.com/MrLeeh/pdftools


太棒了。使用gs(上面列出的所有变体),两个PDF(2MB和500Kb)的简单合并需要几分钟才能完成,并产生40MB的文件!pdftools使用相同的文件大小立即完成。
supergra

10

您可以使用sejda-console,免费和开放源代码。解压缩并运行 sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

它保留了书签,链接注释,acroforms等。实际上,您可以使用很多选项,只需sejda-console merge -h查看它们即可。


OMHO最好的工具来完成这些类型的任务
mario ruiz

8

如果要将所有下载的图像转换为一个pdf,请执行

convert img{0..19}.jpg slides.pdf


6
除非您从矢量到光栅,再也不要返回,否则请勿将convert用于Postscript或PDF文件。很难高估这是一个坏主意。
markgalassi 2015年

6

我第二次pdfunite推荐。但是,Argument list too long在尝试合并> 2k PDF文件时出现错误。

我为此使用Python和两个外部软件包:PyPDF2(处理与PDF相关的所有事情)和natsort(对目录的文件名进行“自然”排序)。如果这可以帮助某人:

from PyPDF2 import PdfFileMerger
import natsort
import os

DIR = "dir-with-pdfs/"
OUTPUT = "output.pdf"

file_list = filter(lambda f: f.endswith('.pdf'), os.listdir(DIR))
file_list = natsort.natsorted(file_list)

# 'strict' used because of
# https://github.com/mstamy2/PyPDF2/issues/244#issuecomment-206952235
merger = PdfFileMerger(strict=False)

for f_name in file_list:
  f = open(os.path.join(DIR, f_name), "rb")
  merger.append(f)

output = open(OUTPUT, "wb")
merger.write(output)

6
“参数列表太长”表示您要遍历shell分配给环境的缓冲区大小-实际上这并不是对该工具的限制。在这种情况下,切换到Python可能会过大,因为您可以批处理:find input -name * .pdf | xargs -P1 -n500 sh -c'pdfunite“ $ @”输出date +%s-.pdf'&& pdfunite output-*。pdf output.pdf(这将创建500个按顺序处理的文件批次,使生成的临时文件以正确的顺序排序,并产生适当的输出文件;之后您需要清理临时文件)
enkiv2

4

这是我使用的一种有效且易于实现的方法。这将需要两个FPDFFPDI可以在这里下载库:

  • FPDF:http://www.fpdf.org/en/download.php
  • FPDI:https://www.setasign.com/products/fpdi/downloads
require('fpdf.php');
require('fpdi.php');

$files = ['doc1.pdf', 'doc2.pdf', 'doc3.pdf'];

$pdf = new FPDI();

foreach ($files as $file) {
    $pdf->setSourceFile($file);
    $tpl = $pdf->importPage(1, '/MediaBox');
    $pdf->addPage();
    $pdf->useTemplate($tpl);
}

$pdf->Output('F','merged.pdf');

4

作为PyMuPDF(MuPDF的Python绑定)的开发人员之一,我有偏见。

您可以轻松地用它(以及更多)做您想做的事。骨架代码如下所示:

#-------------------------------------------------
import fitz         # the binding PyMuPDF
fout = fitz.open()  # new PDF for joined output
flist = ["1.pdf", "2.pdf", ...]  # list of filenames to be joined

for f in flist:
    fin = fitz.open(f)  # open an input file
    fout.insertPDF(fin) # append f
    fin.close()

fout.save("joined.pdf")
#-------------------------------------------------

就是这样 有几个选项可用于仅选择页面范围,维护联合目录,反转页面顺序或更改页面旋转度等。

我们在PyPi上。


3

我喜欢Chasmo的想法,但是我喜欢利用诸如

convert $(ls *.pdf) ../merged.pdf

提供多个源文件可convert导致将它们合并为通用pdf。此命令将.pdf实际目录中所有带有扩展名的文件合并到merged.pdf父目录中。


5
考虑到这与原始问题有多相似,看来这应该是评论,而不是答案。有了更多代表,您就可以发表评论。在此之前,请不要将答案用作解决方法。
内森·塔吉

1
@Silfheed不,它回答了问题!虽然答案可能应该更详细。
彼得-恢复莫妮卡

7
除非您从矢量到光栅,再也不要返回,否则请勿将convert用于Postscript或PDF文件。很难高估这是一个坏主意。
markgalassi 2015年

13
什么是用点$(ls *.pdf)来代替简单的通配符*.pdf
firegurafiku

此外,参考@firegurafiku答案,使用ls *.pdf通配符会失去对合并文件顺序的控制。在一个示例中,以下列表:1.pdf,2.pdf,3.pdf,...,10.pdf,...,100.pdf实际上将像1.pdf,10.pdf,100这样合并。 pdf,2.pdf,3.pdf(由于使用默认的Linux订购文件方式-在这里您可以了解有关此问题的更多详细信息-stackoverflow.com/q/22948042/1977012)。
Egel

0

尽管它不是命令行解决方案,但它可以帮助macos用户:

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

0

您可以看到使用免费和开源的pdftools(免责声明:我是它的作者)。

它基本上是Latex pdfpages软件包的Python接口。

要一一合并pdf文件,可以运行:

pdftools --input-file file1.pdf --input-file file2.pdf --output output.pdf

要将目录中的所有pdf文件合并在一起,可以运行:

pdftools --input-dir ./dir_with_pdfs --output output.pdf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.