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

alc*_*hol 986 linux pdf merge command-line-interface

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

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

convert file1.pdf file2.pdf merged.pdf
Run Code Online (Sandbox Code Playgroud)

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

Hub*_*rio 1293

考虑到这pdfunite是poppler的一部分,它有更高的安装机会,使用也比pdftk以下更简单:

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
Run Code Online (Sandbox Code Playgroud)

  • 只要确保你记得提供out.pdf,否则它会覆盖你命令中的最后一个文件,叹息. (390认同)
  • 您可以使用:`pdfunite*.pdf out.pdf`假设该目录中不存在其他pdf,并且它们的顺序由"*"保留.如果未保留,则使用范围:filename_ {0..9} .pdf解决它. (62认同)
  • 它很快,但似乎打破了超链接.见http://blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs/ (18认同)
  • 不能推荐这个.生成的PDF的大小太大了.例如:Pdfunite为我提供了75MB的文件,而Ghostscript将所有内容打包为1MB. (16认同)
  • pdfunite的包是debian中的poppler-utils,但可能不会出现在旧的debian版本中. (9认同)
  • 嗯...... @Torben我刚用这个实用程序将300多个pdf(总共13MB)打包成一个PDF文件,最后得到了一个12MB的文件.也许是你使用的版本?我在OpenSUSE 12.2上,使用pdfunite版本0.20.0. (6认同)
  • @Aaaron我的评论有点误导.我的意思是pdfunite不优化文件大小.例如:当我使用pdfunite时,10个类似的pdf(用于演示的幻灯片)为1MB导致~10MB pdf.使用ghostscript,得到的pdf <1MB. (2认同)
  • 我提供的pdf无法使用“未实现的功能:无法合并加密的文件('MR1418_introduction.pdf')”。但是pdftk能够处理它,尽管警告我没有一些不需要的密码。 (2认同)
  • `sudo apt-get install poppler-utils` (2认同)
  • 小心!最后一个输入参数是程序写入输出的位置,因此,如果您不小心忘记了 `out.pdf` 并执行了 `pdfunite in1.pdf in2.pdf` 而不是 `pdfunite in1.pdf in2.pdf out.pdf`,那么您会你会不小心把“in1.pdf”写在“in2.pdf”上面,毁掉了它!不要那样做。 (2认同)

Ger*_*ery 487

试试好鬼影:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=merged.pdf mine1.pdf mine2.pdf
Run Code Online (Sandbox Code Playgroud)

或者甚至通过这种方式获得低分辨率PDF的改进版本(感谢Adriano指出这一点):

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdf
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,输出分辨率都比使用转换的这种方式更高更好:

convert -density 300x300 -quality 100 mine1.pdf mine2.pdf merged.pdf
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您不需要安装任何其他东西,只需使用已安装在系统中的内容(至少在我的rhel中都默认使用).

希望这可以帮助,

更新:首先感谢您的所有好评!只是一个可能对你们有用的提示,在谷歌搜索之后,我找到了一个缩小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
Run Code Online (Sandbox Code Playgroud)

干杯!!

  • 不错的提示,`gs`运行速度非常快,而且压缩很多.然而,在我使用这个参数后,质量提高了很多:`-dPDFSETTINGS =/prepress` (27认同)
  • 将以下行添加到`.bash_profile`中,你有一个很好的捷径:`pdfmerge(){gs -dBATCH -dNOPAUSE -q -sDEVICE = pdfwrite -dPDFSETTINGS =/prepress -sOutputFile = $ @; 如果你必须经常使用这个命令,这可以节省你一些打字.用法如下:`pdfmerge merged.pdf mine1.pdf mine2.pdf` (23认同)
  • 我发现`-dPDFSETTINGS =/prepress`具有非常好的旋转页面的效果,这些页面太宽并且迫使恼人的水平滚动条. (3认同)
  • @Winny我需要添加`dPrinted=false`来保留超链接。否则它会破坏除第一个 pdf 之外的所有 pdf 的链接。请参阅 https://tex.stackexchange.com/questions/245801/local-hyperlinks-broken-after-pdf-processing-with-ghostscript (3认同)
  • 我试图找到-dBATCH标志的描述,但找不到。即使是男人也没说什么。但是很棒,而且没有任何其他程序! (2认同)
  • @EnanAjmain我用了 `gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=output.pdf a.pdf b.pdf c.pdf` 这对我有用 (2认同)
  • 可以将gs -dBATCH -dNOPAUSE -q -sDEVICE = pdfwrite -dPDFSETTINGS = / prepress -sOutputFile = merged.pdf mine1.pdf mine2.pdf缩短为gs -q -sDEVICE = pdfwrite -dPDFSETTINGS = / prepress- o merged.pdf mine1.pdf mine2.pdf`。从[Documentation](https://www.ghostscript.com/doc/current/Use.htm#File_output)中:“为方便起见,您可以使用`-o`选项,后接上述输出文件规范。 “ -o”选项还设置了“ -dBATCH”和“ -dNOPAUSE”选项。这是一种快速调用“ ghostscript”来转换一个或多个输入文件的方法。 (2认同)

alc*_*hol 481

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

对于有兴趣的人;

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

pdftk file1.pdf file2.pdf cat output output.pdf
Run Code Online (Sandbox Code Playgroud)

要么

gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf ...
Run Code Online (Sandbox Code Playgroud)

这反过来可以直接传送到pdf2ps.

  • 使用ghostscript也可能有效:`gs -q -sPAPERSIZE = letter -dNOPAUSE -dBATCH -sDEVICE = pdfwrite -sOutputFile = out.pdf in1.pdf in2.pdf in3.pdf ...` (81认同)
  • 值得一提的是,pdftk可以合并加密的pdf,而pdfunite不能 (14认同)
  • `pdftk file1.pdf file2.pdf cat output out.pdf`将合并文件输出为`out.pdf` (12认同)
  • 与转换默认选项相比,使用pdftk提供更好的分辨率. (3认同)
  • 由于缺少依赖项libgcj,因此pdftk对EL7系统不可用。 (2认同)
  • pdftk很整洁,因为您可以轻松地[选择页面范围](https://www.pdflabs.com/docs/pdftk-cli-examples/)进行合并:pdftk A = file1.pdf B = file2.pdf目录A1-3 B1输出.pdf (2认同)

rod*_*gob 48

pdfjoin a.pdf b.pdf将创造一个新的b-joined.pdf与a.pdf和b.pdf的内容

  • pdfunite通常运行良好,但如果它说"未实现的功能:无法合并加密文件",pdfjoin是一个不错的选择.无论出于何种原因,pdfjoin都不会抱怨加密. (5认同)
  • 这很简洁,但打破了超链接. (4认同)
  • pdfjoin(pdflatex)因包含大量页面的文件而失败.无法合并到1k页文件. (2认同)

SaT*_*aTa 47

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

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

  • 尽管很难理解复杂的选项,但 qpdf 是一个非常方便且强大的工具。在线文档可在[此处](http://qpdf.sourceforge.net/files/qpdf-manual.html) (7认同)
  • qpdf 似乎破坏了文档中的超链接 (5认同)
  • 到目前为止,这似乎是最简单的 (2认同)

Noo*_*oor 35

你可以直接使用convert命令,

例如

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf
Run Code Online (Sandbox Code Playgroud)

  • 这不是无损的. (40认同)
  • 这涉及将所有内容转换为光栅图像,看起来绝对不是最好的,特别是在处理基于文本的PDF时. (21认同)
  • 不要使用转换为postscript或PDF文件,除非你从矢量转到栅格,永远不会回去.很难夸大这是一个坏主意. (15认同)
  • 你可以`convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf`,但是得到的文件大小可能太大了.我建议`convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdf`. (12认同)
  • 几乎是OP所描述的不起作用的副本 (3认同)

ski*_*age 26

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
Run Code Online (Sandbox Code Playgroud)

  • 这么多。例如,抛物线因为依赖于“ gcj”而不再打包“ pdftk”,我相信对此已经放弃了。尽管通过`pacman -Ss pdf`搜索pdf操作工具,但我还是错过了。感谢您的回答!我应该收到更多的赞誉,因此它会在pdfunite或pdftk的建议旁边显示。 (2认同)

小智 14

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

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

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


Dev*_*hon 14

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

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


Rav*_*ati 11

使用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 
Run Code Online (Sandbox Code Playgroud)

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

此工具支持以下内容

  • 插入
  • 去掉
  • 旋转
  • 分裂
  • 合并
  • 压缩

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

https://github.com/MrLeeh/pdftools


小智 8

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

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

  • 不要使用转换为postscript或PDF文件,除非你从矢量转到栅格,永远不会回去.很难夸大这是一个坏主意. (6认同)

And*_*dio 8

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

它保留书签,链接注释,acroforms等.它实际上有很多你可以玩的选项,只是运行sejda-console merge -h来查看它们.


Dob*_*ron 8

我从终端使用 qpdf 并在 Windows (Mobaxterm) 和 Linux 上为我工作,例如在新文件 C.pdf 中将 A.pdf 与 B.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]

  • 这是一个被低估的答案。“qpdf”工具很棒 (2认同)

Jor*_*Kie 6

我倾向于成为 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")
#-------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

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

我们在 PyPi 上。


Gre*_*sky 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)
Run Code Online (Sandbox Code Playgroud)

  • "参数列表太长"表示您正在查看shell为环境分配的缓冲区大小 - 实际上并不是该工具的限制.在这种情况下,切换到Python可能会有点过分,因为您可以批处理:find input -name\*.pdf | xargs -P1 -n500 sh -c'pdfunite"$ @"output -`date +%s`.pdf'&& pdfunite output - *.pdf output.pdf(这将创建500个连续处理的批处理文件,生成临时结果文件按正确的顺序排序,并生成一个合适的输出文件;之后你需要清理临时文件) (4认同)

rtr*_*trt 5

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

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

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

pdftools --input-file file1.pdf --input-file file2.pdf --output output.pdf
Run Code Online (Sandbox Code Playgroud)

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

pdftools --input-dir ./dir_with_pdfs --output output.pdf
Run Code Online (Sandbox Code Playgroud)