将多个PDF文件合并/转换为一个PDF [已关闭]

Merge / convert multiple PDF files into one PDF [closed]

提问人:alcohol 提问时间:3/24/2010 最后编辑:Communityalcohol 更新时间:5/30/2023 访问量:1114556

问:


这个问题似乎不是关于特定的编程问题、软件算法或程序员主要使用的软件工具。如果您认为该问题在另一个 Stack Exchange 站点上是主题,您可以发表评论以解释该问题可能在哪里得到回答。

2年前关闭。

社区在 10 个月前审查了是否重新讨论这个问题,并将其关闭:

原始关闭原因未解决

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

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

convert file1.pdf file2.pdf merged.pdf

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

Linux PDF 合并 命令行界面

评论

4赞 sabujp 11/18/2015
YMMV,但这在输出文件中的分辨率似乎不如 PDFunite 好,并且还导致文件大小大于 PDFunite 的输出
1赞 Franck Dernoncourt 2/12/2017
相关新闻: Linux 命令将 PDF 文件与数字排序合并
1赞 Clément 3/5/2020
无论何时保留链接,这些解决方案都会在这篇文章中讨论。如果你想保留链接(可能与其他注释一起),如果想要一个命令行界面,请使用pdftk,如果你想要一个图形用户界面,请使用pdfsam,如果你想要一个Web界面,请使用sejda。
1赞 Alexis Wilke 12/23/2021
命令行来自 ImageMagick,它会在执行任何其他操作之前将 PDF 转换为图像。convert
2赞 Sihat Afnan 9/17/2022
pdftk PDF1.pdf PDF2.pdf cat output PDF3.pdf工作正常

答:

661赞 alcohol 3/24/2010 #1

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

对于那些感兴趣的人;

我在 debian 服务器上安装了 pdftk (pdf toolkit),并使用以下命令获得了所需的输出:

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 中。

评论

83赞 Nate Kohl 3/24/2010
使用 ghostscript 也可能有效:gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
19赞 Thomas 4/29/2013
值得一提的是,pdftk 可以合并加密的 pdf,而 pdfunite 不能
3赞 Kiran K Telukunta 3/18/2014
与默认选项中的转换相比,使用 PDFTK 提供更好的分辨率。
14赞 jmiserez 9/29/2015
pdftk file1.pdf file2.pdf cat output out.pdf将合并后的文件输出为out.pdf
2赞 a coder 3/23/2016
pdftk由于缺少依赖关系,因此不适用于 EL7 系统。libgcj
2008赞 Hubert Kario 7/1/2012 #2

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

⚠ 重要提示:请确保您记得提供 out.pdf,否则它将覆盖命令⚠中的最后一个输入文件

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

更安全的解决方案可能包括
针对输出文件的不存在测试

export output_file=out.pdf && \
! test -e $output_file && \
pdfunite in-1.pdf in-2.pdf in-n.pdf $output_file

评论

27赞 Danilo Bargen 8/14/2013
它很快,但它似乎破坏了超链接。查看 blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs
570赞 mlissner 10/20/2013
只要确保你记得提供 out.pdf,否则它会覆盖你命令中的最后一个文件,叹息。
12赞 Jocelyn delalande 11/10/2013
pdfunite 的软件包在 Debian 中是 poppler-utils,但在旧的 Debian 版本中可能不存在。
28赞 Torben 12/6/2013
不能推荐这个。生成的 PDF 的大小太大。例如:Pdfunite 给了我一个 75MB 的文件,而 Ghostscript 将所有内容打包到 1MB 中。
89赞 lepe 1/5/2015
您可以使用:假设该目录中不存在其他 pdf,并且它们的顺序由“*”保留。如果它没有被保留,使用ranges: filename_{0..9}.pdf可以解决它。pdfunite *.pdf out.pdf
57赞 rodrigob 4/19/2013 #3

还将创建一个包含 a.pdf 和 b 内容的新.pdfpdfjoin a.pdf b.pdfb-joined.pdf

评论

7赞 bright-star 10/20/2014
这很好,很简洁,但会破坏超链接。
3赞 mdrozdziel 12/9/2014
PDFJOIN (PDFLatex) 对于包含大量页面的文件会失败。无法合并到 1k 页文件。
1赞 sabujp 3/9/2016
PDFJOIN 中断注解或其他非图形项
10赞 Calaf 2/24/2017
pdfunite 通常运行良好,但如果它显示“未实现的功能:无法合并加密文件”,pdfjoin 是一个不错的选择。无论出于何种原因,pdfjoin 都不会抱怨加密。
1赞 Henrik Pingel 7/15/2020
pdfjam包不再包含脚本。您可以在此处找到脚本pdfjoin
769赞 Gery 10/14/2013 #4

试试好的 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 的这种方式高得多,也更好:

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

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

更新#1:首先感谢您的所有好评!只是一个可能对你们有用的提示,在谷歌搜索之后,我发现了一个缩小 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

更新#2:如果您需要“刻录”编辑内容并压缩使用 Acrobat 制作的 PDF,这将有所帮助:

gs -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dPDFSETTINGS=/screen -dEmbedAllFonts=true -dSubsetFonts=true -dColorImageDownsampleType=/Bicubic -dColorImageResolution=144 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=144 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=144 -sOutputFile=compressed.pdf withedits.pdf

评论

35赞 Adriano P 12/16/2013
不错的提示,运行速度非常快,压缩很多。但是,在我使用这个参数后,质量提高了很多:gs-dPDFSETTINGS=/prepress
7赞 r_31415 8/21/2014
我发现它有很好的效果,可以旋转太宽的页面并强制烦人的水平滚动条。-dPDFSETTINGS=/prepress
36赞 Torben 7/23/2015
将以下行添加到您的行中,您就有了一个不错的快捷方式: 如果您必须经常使用该命令,这将为您节省一些打字时间。用法如下所示:.bash_profilepdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }pdfmerge merged.pdf mine1.pdf mine2.pdf
15赞 MiniMax 4/25/2019
可以缩短为 .来自文档:“作为一个方便的速记,您可以使用上面讨论的输出文件规范后面的选项。该选项还设置 和 选项。这是为了快速调用转换一个或多个输入文件。gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfgs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf-o-o-dBATCH-dNOPAUSEghostscript
7赞 qdread 11/20/2020
我需要添加@Winny以保留超链接。否则,它会破坏除第一个 pdf 之外的所有链接。查看 tex.stackexchange.com/questions/245801/...dPrinted=false
5赞 Trupti Kini 1/13/2014 #5

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

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

评论

8赞 markgalassi 11/29/2015
不要对 postscript 或 PDF 文件使用转换,除非您从矢量转到栅格并且永远不会返回。很难夸大这是一个多么糟糕的主意。
38赞 Noor 5/17/2014 #6

您可以直接使用 convert 命令,

例如:

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

评论

51赞 Ben Ruijl 6/3/2014
这不是无损的。
15赞 arielnmz 8/6/2014
你可以,但生成的文件大小可能太大了。我建议改为。convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdfconvert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdf
27赞 Julia Ebert 8/29/2014
这似乎涉及将所有内容转换为光栅图像,这绝对不是最好的,尤其是在处理基于文本的 PDF 时。
9赞 user829755 9/29/2015
几乎是 OP 所描述的不起作用的副本
20赞 markgalassi 11/29/2015
不要对 postscript 或 PDF 文件使用转换,除非您从矢量转到栅格并且永远不会返回。很难夸大这是一个多么糟糕的主意。
0赞 user3709983 5/16/2015 #7

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

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

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

评论

5赞 Nathan Tuggy 5/16/2015
鉴于这看起来与原始问题有多么相似,这似乎应该是一个评论,而不是一个答案。有了更多的代表,您将能够发表评论。在此之前,请不要使用答案作为解决方法。
1赞 peterh 5/16/2015
@Silfheed 不,它回答了这个问题!虽然答案也许应该更详细。
7赞 markgalassi 11/29/2015
不要对 postscript 或 PDF 文件使用转换,除非您从矢量转到栅格并且永远不会返回。很难夸大这是一个多么糟糕的主意。
15赞 firegurafiku 12/18/2015
使用简单的通配符有什么意义?$(ls *.pdf)*.pdf
1赞 Egel 6/28/2018
此外,参考@firegurafiku答案,使用通配符,您将失去对合并文件顺序的控制。在一个例子中,下面的列表:1.pdf、2.pdf、3.pdf、...、10.pdf、...、100.pdf实际上会像 1.pdf、10.pdf、100.pdf、2.pdf、3.pdf 一样合并(由于默认的 Linux 文件排序方式 - 这里你有关于这个问题的更多细节 - stackoverflow.com/q/22948042/1977012)。ls *.pdf
17赞 lumpchen 11/20/2015 #8

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

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

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

3赞 But those new buttons though.. 3/19/2016 #9

这是我使用的一种有效且易于实现的方法。这将需要 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');
9赞 Andrea Vacondio 2/3/2017 #10

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

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

评论

0赞 mario ruiz 4/25/2020
OMHO 是完成此类任务的最佳工具
1赞 Andrea Vacondio 4/2/2021
这不再是开源的
8赞 Greg Sadetsky 6/14/2017 #11

我支持这项建议。但是,当我尝试合并> 2k PDF 文件时,我遇到了错误。pdfuniteArgument list too long

我求助于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)

评论

6赞 enkiv2 11/1/2017
“参数列表太长”表示您正在超出 shell 为环境分配的缓冲区大小 - 这实际上并不是该工具的限制。在这种情况下,切换到 Python 可能有点矫枉过正,因为您可以批量处理:查找输入名称 *.pdf |xargs -P1 -n500 sh -c 'pdfunite “$@” output-.pdf' &&; pdfunite output-*.pdf output.pdf (这将创建批量处理的 500 个文件,使生成的临时文件按正确的顺序排序,并生成适当的输出文件;之后您需要清理临时文件)date +%s
0赞 tejasvi88 1/26/2021
pdftools是 PyPDF2 的包装器。请看这个答案。
22赞 Ravikiran Reddy Kotapati 7/6/2017 #12

使用 PyPI 中的 pdftools

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

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

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

此工具支持以下内容

  • 插入
  • 删除
  • 旋转
  • 分裂
  • 合并
  • 拉链

您可以在 GitHub 上找到更多详细信息,它是开源的

评论

1赞 supergra 11/17/2018
这是完美的。使用(上面列出的所有变体),两个 PDF(2MB 和 500Kb)的简单合并需要几分钟才能完成,并产生一个 40MB 的文件! 以相同的文件大小即时完成。gspdftools
0赞 tejasvi88 1/26/2021
或者你仍然可以安装它。依赖项的总大小< 100 kb。
9赞 Jorj McKie 1/16/2018 #13

我是 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 上。

53赞 skierpage 6/28/2018 #14

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

在这一点上,您可能想要一个具有更多选项的程序。 是我发现的用于操作 PDF 的最佳实用程序。 更大更慢,Red Hat/Fedora 不会打包它,因为它依赖于 gcj。其他 PDF 实用程序具有 Mono 或 Python 依赖项。我发现生成的输出文件比使用和将页面组装成 30 页的输出 PDF 要小得多,分别为 970kB 和 1,6450 kB。因为它提供了更多的选项,所以的命令行并不那么简单;合并 file1 和 file2 的原始请求可以通过以下方式执行qpdfpdftkqpdfpdfseparatepdfuniteqpdf

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

评论

3赞 k.stm 9/20/2018
这么多这个。例如,抛物线不再打包,因为它依赖于 ,我相信已经放弃了对 的支持。尽管通过搜索 pdf 操作工具,但我还是错过了这一点。感谢您的回答!我应该收到更多的赞成票,所以它出现在 or 的建议旁边。pdftkgcjpacman -Ss pdfpdfunitepdftk
1赞 Wallace Kelly 6/14/2019
在我全新安装的 Linux Mint 上,它在终端窗口中运行,无需任何安装或路径调整。好!
0赞 Siwoku Adeola 3/30/2020
这工作得很好,并且还提供了我尝试过的其他命令更清晰的合并文档。谢谢你的帖子。
1赞 caram 2/14/2021
如果 even.pdf 文件中的页面被反转(通常在非双面扫描仪上扫描时),您将需要改用以下方法:qpdf --collate --empty --pages odd.pdf even.pdf z-1 -- merged.pdf
162赞 SaTa 12/13/2018 #15

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

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

评论

5赞 David 10/29/2019
QPDF似乎破坏了文档中的超链接
8赞 Jonathan Holvey 12/18/2019
虽然很难让你了解复杂的选项,但qpdf是一个非常方便和强大的工具。在线文档可在此处获得
1赞 Hashim Aziz 7/16/2020
来这里寻找解决方案,但不想再次浏览文档来弄清楚,谢谢。qpdf
1赞 lmat - Reinstate Monica 10/24/2020
只要订单适合您,使用 shell 通配符就很棒!先检查订单或左右!echo *.pdf | tr ' ' $'\n'
1赞 7/1/2021
Qpdf 质量高且维护积极,这使其成为比 pdftk 更好的选择。
14赞 DevonDahon 4/10/2020 #16

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

  1. 选择您的 PDF 文件
  2. 右键单击突出显示的文件
  3. 选择快速操作>创建 PDF

评论

1赞 Pavol Travnik 5/6/2022
我想知道为什么它这么低。这正是我一直在寻找的。谢谢。
5赞 robertspierre 5/21/2020 #17

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

它基本上是 Latex 包的 Python 接口。pdfpages

要逐个合并 pdf 文件,您可以运行:

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

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

pdftools --input-dir ./dir_with_pdfs --output output.pdf
4赞 Markus Dutschke 9/2/2020 #18

下面是一个 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
0赞 eleuteron 1/14/2021 #19

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

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

它带有软件包 texlive-extra-utils

评论

0赞 tripleee 8/2/2021
软件包名称可能是指 Debian 软件包。
0赞 GPWR 10/22/2022
我正在运行 Debian GNU/Linux 11 (bullseye) 并已安装,但在我的系统上找不到。 是版本 2020.20210202-3。知道为什么会这样吗?你实际上指的是 texlive 的 Debian 发行版吗?这应该添加到您的答案中。texlive-extra-utilspdfjoinMy texlive-extra-utils
1赞 Rainb 2/6/2021 #20

如果您想使用 Ghostscript 将所有 PDF 文件联接到一个目录中,您可以使用 find 来做到这一点。下面是一个示例

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

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

2赞 Zombo 3/8/2021 #21

PdfCpu效果很好:

pdfcpu merge c.pdf a.pdf b.pdf

https://pdfcpu.io/core/merge

评论

0赞 Charles 3/12/2021
可以与 Homebrew +1 一起安装 还没试过
1赞 kleinbottle4 3/10/2021 #22
pdfconcat -o out.pdf 1.pdf 2.pdf

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

8赞 Doberon 3/14/2021 #23

我从终端使用了 qpdf 并在 Windows (Mobaxterm) 和 Linux 上为我工作,例如,在新文件 C.pdf .pdf将 A.pdf 与 B 连接起来的命令是:

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

如果需要更多文档 [https://net2.com/how-to-merge-or-split-pdf-files-on-linux/][1]

评论

2赞 Tarick Welling 3/28/2021
这是一个被低估的答案。该工具很棒qpdf
0赞 Doberon 4/3/2021
没错,QPDF是多平台的,可移植的,可以用于脚本
0赞 Doberon 5/5/2021
用于提取 QPDF “in.pdf” --pages 。1 -- “输出 .pdf”