如何将多个PDF文件合并/转换为一个大型PDF文件?
我尝试了以下操作,但目标文件的内容与预期不符:
convert file1.pdf file2.pdf merged.pdf
我需要一个非常简单/基本的命令行(CLI)解决方案。最好是我可以将合并/转换的输出直接管道化为pdf2ps(正如我之前在这里提出的问题:Linux管道化(convert->pdf2ps->lp)中所尝试的那样)。
如何将多个PDF文件合并/转换为一个大型PDF文件?
我尝试了以下操作,但目标文件的内容与预期不符:
convert file1.pdf file2.pdf merged.pdf
我需要一个非常简单/基本的命令行(CLI)解决方案。最好是我可以将合并/转换的输出直接管道化为pdf2ps(正如我之前在这里提出的问题:Linux管道化(convert->pdf2ps->lp)中所尝试的那样)。
当前回答
作为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上。
其他回答
我支持pdfunite的建议。然而,当我试图合并>2k个PDF文件时,我得到了参数列表太长的错误。
我求助于Python和两个外部包:PyPDF2(处理所有与PDF相关的事情)和natsort(对目录的文件名进行“自然”排序)。如果这可以帮助某人:
from pathlib import Path
from PyPDF2 import PdfMerger
import natsort
DIR = Path("dir-with-pdfs/")
OUTPUT = "output.pdf"
paths = DIR.glob("*.pdf")
paths = natsort.natsorted(paths)
merger = PdfMerger()
for path in paths:
merger.append(path)
merger.write(OUTPUT)
Apache PDFBoxhttp://pdfbox.apache.org/
PDF发电机此应用程序将获取pdf文档列表并将其合并,将结果保存到新文档中。
用法:java-jar pdfbox-app-x.y.z.jar PDFMerger“源PDF文件(2..n)”“目标PDF文件”
考虑到pdfunite是poppler的一部分,它有更高的安装机会,使用也比pdftk简单:
pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
只需确保您记得提供out.pdf,否则它将覆盖命令中的最后一个输入文件
更安全的解决方案可能包括不存在的测试以输出文件为目标
export output_file=out.pdf && \
! test -e $output_file && \
pdfunite in-1.pdf in-2.pdf in-n.pdf $output_file
pdfunite可以合并整个PDF。例如,如果您想要file1.pdf中的第2-7页和file2.pdf中的1,3,4页,则必须使用pdfsepart将文件拆分为单独的pdf,以便为每个页面提供给pdfunite。
此时,您可能需要一个具有更多选项的程序。qpdf是我发现的处理PDF的最佳工具。pdftk更大、更慢,Red Hat/Fedora不打包它,因为它依赖于gcj。其他PDF实用程序具有Mono或Python依赖关系。我发现qpdf生成的输出文件比使用pdfseparate和pdfunite将页面组装成30页的输出PDF要小得多,分别为970kB和16450kB。因为它提供了更多的选项,qpdf的命令行并没有那么简单;合并文件1和文件2的原始请求可以使用
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
如果您想使用Ghostscript将所有PDF文件连接到一个目录中,可以使用find来实现这一点。这里有一个例子
find . -name '*.pdf' -exec gs -o -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=../out.pdf {} +
将在当前目录中找到所有pdf,并在父目录中创建out.pdf。如果他们正在寻找一种快速的方法来使用ghostscript创建整个目录,可能会很有用。