将多个PDF文件合并/转换为一个PDF

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

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

convert file1.pdf file2.pdf merged.pdf

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

1019178 次浏览

对不起,我设法用谷歌和一点运气找到了答案:)

感兴趣的人;

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

考虑到#0波普勒的一部分,它有更高的安装机会,用法也比#1简单:

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

pdfjoin a.pdf b.pdf还将创建一个新的b-joined.pdf,其内容为a.pdf和b.pdf

尝试好的幽灵脚本

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

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

干杯!!

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

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

您可以直接使用转换命令,

e. g.

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

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

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

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

Apache PDFBoxhttp://pdfbox.apache.org/

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

用法:java-jarpdfbox-app-x.y.z.jarPDF Merger”源PDF文件(2… n)”目标PDF文件”

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

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

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

我第二个pdfunite建议。然而,当我试图合并>2kPDF文件时,我得到了Argument list too long错误。

我为此转向Python和两个外部包:PyPDF2(处理所有与PDF相关的事情)和自然分类(对目录的文件名进行“自然”排序)。如果这可以帮助某人:

from PyPDF2 import PdfFileMergerimport natsortimport 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-206952235merger = 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)

使用Pythonhttps://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

此工具支持以下

  • 添加
  • 插入
  • 删除
  • 旋转
  • 斯普利特
  • 合并
  • Zip

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

https://github.com/MrLeeh/pdftools

作为PyMuPDF(MuPDF的Python绑定)的开发人员之一,我有偏见。

你可以很容易地用它做你想做的事情(以及更多)。

#-------------------------------------------------import fitz         # the binding PyMuPDFfout = fitz.open()  # new PDF for joined outputflist = ["1.pdf", "2.pdf", ...]  # list of filenames to be joined
for f in flist:fin = fitz.open(f)  # open an input filefout.insertPDF(fin) # append ffin.close()
fout.save("joined.pdf")#-------------------------------------------------

就是这样。有几个选项可用于仅选择页面范围、维护联合目录、反转页面顺序或更改页面旋转等。等等。

我们在PyPi上。

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

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

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

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

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

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

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

它基本上是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

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

我遇到了一些PDF合并产生一些错误消息的问题。因为它是相当多的试验和错误找到损坏的PDF,我写了一个脚本。

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

#!/bin/bash
PDFOUT=_all_merged.pdfrm -f "${PDFOUT}"
for f in *.pdfdoprintf "processing %-50s" "$f  ..." >&2if [ -f "$PDFOUT" ]; then# https://stackoverflow.com/questions/8158584/ghostscript-to-merge-pdfs-compresses-the-result#  -dPDFSETTINGS=/prepressstatus=$(gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="${PDFOUT}.new" "${PDFOUT}" "$f" 2> /dev/null)if [ "$status" ]thenecho "gs ERROR: $status" >&2elseecho "successful" >&2fimv "${PDFOUT}.new" "${PDFOUT}"elsecp "$f" "${PDFOUT}"echo "successful" >&2fidone

示例输出:

processing inp1.pdf  ...                                     successfulprocessing inp2.pdf  ...                                     successful

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

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

它带有包texlive-out-utils

如果您想将所有PDF文件加入到一个目录中,您可以使用查找来做到这一点

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

将查找当前目录中的所有PDF,并在父目录中创建out.pdf。可能是有用的,如果他们正在寻找一个快速的方法来做一个完整的目录与ghost脚本。

pdfcpu工作得很好:

pdfcpu merge c.pdf a.pdf b.pdf

https://pdfcpu.io/core/merge

pdfconcat -o out.pdf 1.pdf 2.pdf

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

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

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]