如何将多个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上。

其他回答

尝试好的重影脚本:

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,分辨率可以接受!所有这一切都有一个很好的脚本,这里是:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -dDetectDuplicateImages -dCompressFonts=true -r150 -sOutputFile=output.pdf input.pdf

Apache PDFBoxhttp://pdfbox.apache.org/

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

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

我支持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)

这里有一个我使用的方法,它有效且易于实现。这将需要fpdf和fpdi库,可在此处下载:

FPDF:http://www.fpdf.org/en/download.phpFPDI: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');

考虑到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