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

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

convert file1.pdf file2.pdf merged.pdf

我需要一个非常简单/基本的命令行(CLI)解决方案。最好是我可以将合并/转换的输出直接管道化为pdf2ps(正如我之前在这里提出的问题:Linux管道化(convert->pdf2ps->lp)中所尝试的那样)。


当前回答

尝试好的重影脚本:

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

其他回答

这里有一个我使用的方法,它有效且易于实现。这将需要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');

您可以直接使用convert命令,

e.g.

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

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

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

很抱歉,我自己用谷歌找到了答案,运气不错:)

对于感兴趣的人;

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

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

OR

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

这反过来又可以直接输送到pdf2ps中。