1353

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

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

convert file1.pdf file2.pdf merged.pdf

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

4

23 回答 23

1784

考虑到它pdfunitepoppler的一部分,它有更高的安装机会,使用也比pdftk

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

只要确保你记得提供out.pdf,否则它将覆盖你命令中的最后一个文件

于 2012-07-01T07:11:53.183 回答
687

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

干杯!!

于 2013-10-14T10:39:43.460 回答
600

对不起,我自己用谷歌和运气找到了答案:)

对于那些感兴趣的人;

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

于 2010-03-24T13:06:30.617 回答
128

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

qpdf --empty --pages *.pdf -- out.pdf
于 2018-12-13T03:36:43.340 回答
55

还将使用 a.pdf 和 b.pdf 的内容创建pdfjoin a.pdf b.pdf一个新的b-joined.pdf

于 2013-04-18T17:24:32.300 回答
45

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生成的输出文件比使用pdfseparate并将pdfunite页面组装成 30 页的输出 PDF(970kB 与 1,6450kB)要小得多。因为它提供了更多qpdf的选项,所以命令行并不简单;合并 file1 和 file2 的原始请求可以使用

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
于 2018-06-28T10:46:14.580 回答
40

可以直接使用转换命令,

例如

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf
于 2014-05-17T11:33:39.133 回答
21

使用来自 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

于 2017-07-06T10:34:56.513 回答
15

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

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

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

于 2015-11-20T05:52:33.697 回答
9

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

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

于 2017-02-02T18:44:13.897 回答
9

我偏向于成为 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 上。

于 2018-01-15T21:22:54.323 回答
6

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

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

于 2014-01-13T11:27:07.867 回答
6

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

  1. 选择您的 PDF 文件
  2. 右键单击突出显示的文件
  3. 选择快速操作>创建 PDF
于 2020-04-09T22:29:44.837 回答
5

我赞同这个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)
于 2017-06-13T18:03:00.280 回答
5

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

它基本上是 Latexpdfpages包的 Python 接口。

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

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

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

pdftools --input-dir ./dir_with_pdfs --output output.pdf
于 2020-05-20T19:56:30.793 回答
3

这是我使用的一种有效且易于实施的方法。这将需要可在此处下载的fpdffpdi库:

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');
于 2016-03-18T23:26:45.090 回答
3

这是一个检查合并错误的 Bash 脚本。

我遇到了一些 PDF 合并产生一些错误消息的问题。由于查找损坏的 PDF 需要反复试验,因此我为它编写了一个脚本。

以下 Bash 脚本将文件夹中的所有可用 PDF 一个一个合并,并在每次合并后给出成功状态。只需将其复制到包含 PDF 的文件夹中并从那里执行。

#!/bin/bash

PDFOUT=_all_merged.pdf
rm -f "${PDFOUT}"

for f in *.pdf
do
  printf "processing %-50s" "$f  ..." >&2
  if [ -f "$PDFOUT" ]; then
    # https://stackoverflow.com/questions/8158584/ghostscript-to-merge-pdfs-compresses-the-result
    #  -dPDFSETTINGS=/prepress
    status=$(gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="${PDFOUT}.new" "${PDFOUT}" "$f" 2> /dev/null)
    if [ "$status" ]
    then
      echo "gs ERROR: $status" >&2
    else
      echo "successful" >&2
    fi
    mv "${PDFOUT}.new" "${PDFOUT}"
  else
    cp "$f" "${PDFOUT}"
    echo "successful" >&2
  fi
done

示例输出:

processing inp1.pdf  ...                                     successful
processing inp2.pdf  ...                                     successful
于 2020-09-02T11:56:29.947 回答
3

我从终端使用 qpdf 并在 Windows (Mobaxterm) 和 Linux 上为我工作,例如在新文件 C.pdf 中加入 A.pdf 和 B.pdf 的命令是:

qpdf --empty --pages oficios/A.pdf informes/B.pdf -- salida/C.PDF

If need more documentation [https://net2.com/how-to-merge-or-split-pdf-files-on-linux/][1]

于 2021-03-14T02:06:36.207 回答
2

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

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

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

于 2015-05-16T01:47:43.580 回答
2

PdfCpu 效果很好:

pdfcpu merge c.pdf a.pdf b.pdf

https://pdfcpu.io/core/merge

于 2021-03-07T16:52:46.003 回答
1

如果你想用 Ghostscript 加入一个目录中的所有 PDF 文件,你可以使用 find 来做到这一点。这是一个例子

find . -name '*.pdf' -exec gs -o -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=../out.pdf {} +

将在当前目录中查找所有 pdf,并在父目录中创建 out.pdf。如果他们正在寻找一种使用 ghostscript 快速创建整个目录的方法,这可能会很有用。

于 2021-02-05T18:19:08.127 回答
1
pdfconcat -o out.pdf 1.pdf 2.pdf

``pdfconcat 是一个用 ANSI C 编写的小而快的命令行实用程序,可以将多个 PDF 文件连接(合并)成一个长 PDF 文档。''

于 2021-03-09T21:55:10.827 回答
0

另一个有用的选项是您还想选择要合并的文档中的页面:

pdfjoin image.jpg '-' doc_only_first_pages.pdf '1,2' doc_with_all_pages.pdf '-'

它带有包 texlive-extra-utils

于 2021-01-13T19:11:55.253 回答