关于linux:将多个PDF文件合并/转换为一个PDF

Merge / convert multiple PDF files into one PDF

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

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

1
convert file1.pdf file2.pdf merged.pdf

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


考虑到pdfunite是poppler的一部分,安装的机会更大,使用也比pdftk简单:

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


尝试好的鬼脚本:

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

或者,即使对于低分辨率PDF的改进版本也可以这样(感谢Adriano指出这一点):

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

在这两种情况下,使用convert时输出分辨率都比使用convert时高得多,而且更好:

1
convert -density 300x300 -quality 100 mine1.pdf mine2.pdf merged.pdf

这样,您就不需要安装任何其他东西,只需使用您已经安装在系统中的东西(至少在我的RHEL中都是默认的)。

希望这有帮助,

最新消息:首先,谢谢你所有的好评!!只是一个可能对你们有用的提示,在谷歌搜索后,我发现了一个缩小PDF大小的绝妙方法,我用它将一个300 MB的PDF缩小到15 MB,分辨率可以接受!所有这些都有一个好的鬼脚本,这里是:

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

干杯!!


很抱歉,我自己用谷歌找到了答案,而且有点运气:)

对于感兴趣的人;

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

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

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

这反过来可以直接通过管道输送到PDF2PS。


另外,pdfjoin a.pdf b.pdf将创建一个新的b-joined.pdf,内容包括a.pdf和b.pdf。


您可以直接使用convert命令,

例如

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


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

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


pdfunite可以合并整个pdf。例如,如果您想要文件1.pdf中的第2-7页和文件2.pdf中的第1、3、4页,则必须使用pdfseparate将文件拆分为单独的PDF,以便为每个页面提供给pdfunite

此时,您可能需要一个具有更多选项的程序。qpdf是我发现的操纵pdf的最佳工具。pdftk越来越大,越来越慢,而且红帽/软呢帽由于依赖于GCJ而不打包。其他PDF实用程序具有mono或python依赖性。我发现qpdf生成的输出文件比使用pdfseparatepdfunite将页面组装成30页的输出PDF要小得多,分别为970kb和16450kb。因为它提供了更多的选项,所以qpdf的命令行就不那么简单了;合并file1和file2的原始请求可以用

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


Apache PDFoxhttp://pdfbox.apache.org网站/

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

usage: java -jar pdfbox-app-x.y.z.jar PDFMerger"Source PDF files (2 ..n)""Target PDF file"


使用来自python的pdf工具https://pypi.python.org/pypi/pdf tools/1.0.6

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

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

在运行上述命令之前,应该安装pyhton3

此工具支持以下内容

  • 添加
  • 插入
  • 去除
  • 旋转
  • 分裂
  • 合并
  • 拉链

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

https://github.com/mrleeh/pdftools


您可以使用Sejda控制台,免费和开源。拉开拉链,运行sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

它保留书签、链接注释、acroforms等。它实际上有很多可以选择的选项,只需运行sejda-console merge -h就可以看到它们。


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

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


我赞成pdfunite的建议。然而,当我试图合并>2K的PDF文件时,我得到了Argument list too long错误。

我转向了python和两个外部包:pypdf2(处理所有与pdf相关的事情)和natsort(对目录的文件名进行"自然"排序)。如果这可以帮助某人:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)


这是我使用的一个方法,它很好用,而且很容易实现。这将需要fpdf和fpdi库,可以在这里下载:

  • fpdf:http://www.fpdf.org/en/download.php
  • fpdi:https://www.setasign.com/products/fpdi/downloads
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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');

我倾向于成为pymupdf(mupdf的python绑定)的开发人员之一。

你可以很容易地用它做你想做的(以及更多)。框架代码的工作方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
#-------------------------------------------------
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。


我喜欢查莫的想法,但我还是先考虑利用像这样的优势

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

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


其他的答案是好的,但是如果您不能在本地合并PDF,无论您是在共享的托管环境中,还是出于其他原因,它们都不会帮助您。

如果您正在寻找一个API来远程合并PDF,您可以尝试使用API2PDF,它有一个端点用于将PDF合并在一起。文件在这里。