如何将多个PDF文件合并/转换为一个大PDF文件?
我尝试了以下操作,但是目标文件的内容不符合预期:
convert file1.pdf file2.pdf merged.pdf
我需要一个非常简单/基本的命令行(CLI)解决方案。最好的办法是,如果我可以将合并/转换的输出直接传送到管道中pdf2ps
(就像我在前面的问题中最初尝试的那样:Linux管道(转换-> pdf2ps-> lp))。
如何将多个PDF文件合并/转换为一个大PDF文件?
我尝试了以下操作,但是目标文件的内容不符合预期:
convert file1.pdf file2.pdf merged.pdf
我需要一个非常简单/基本的命令行(CLI)解决方案。最好的办法是,如果我可以将合并/转换的输出直接传送到管道中pdf2ps
(就像我在前面的问题中最初尝试的那样:Linux管道(转换-> pdf2ps-> lp))。
Answers:
考虑到这pdfunite
是poppler的一部分,因此它有较高的安装机会,使用也比pdftk
以下方法简单:
pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
pdfunite *.pdf out.pdf
假设该目录中不存在其他pdf,并且其顺序由“ *”保留。如果未保留,则使用范围:filename_ {0..9} .pdf解决。
尝试好的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
这样,您无需安装其他任何东西,只需使用系统中已经安装的内容即可(至少在我的产品中默认都包含这两者)。
希望这可以帮助,
更新:首先感谢您的所有好评!只是一个对您可能有用的提示,在谷歌搜索后,我发现了一种精妙的技巧来缩小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
干杯!!
gs
运行非常快,而且压缩很多。但是,使用此参数后,质量有了很大提高:-dPDFSETTINGS=/prepress
-dPDFSETTINGS=/prepress
旋转太宽的页面会产生很好的效果,并且使水平滚动条变得令人讨厌。
.bash_profile
,您将获得一个不错的快捷方式:pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }
如果您需要大量使用该命令,则可以节省一些键入时间。用法如下所示:pdfmerge merged.pdf mine1.pdf mine2.pdf
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
。来自文档:“为方便起见,您可以使用该-o
选项,然后使用如上所述的输出文件规范。该-o
选项还设置-dBATCH
和-dNOPAUSE
选项。这是一种ghostscript
用来转换一个或多个输入文件的快速方法。”
抱歉,我设法使用Google自己找到了答案,还有些运气:)
对于那些感兴趣的人;
我在我们的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中。
gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
pdftk file1.pdf file2.pdf cat output out.pdf
将合并后的文件输出为out.pdf
pdftk
由于缺少依赖项,因此不适用于EL7系统libgcj
。
如果您有多个文件并且不想一一键入名称,这是最简单的解决方案:
qpdf --empty --pages *.pdf -- out.pdf
也pdfjoin a.pdf b.pdf
将创造一个新的b-joined.pdf
与a.pdf和b.pdf的内容
您可以直接使用convert命令,
例如
convert sub1.pdf sub2.pdf sub3.pdf merged.pdf
convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf
,但是生成的文件大小可能太大。我建议convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdf
代替。
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,6450 kB)要小得多。因为它提供了更多选项,所以它qpdf
的命令行不是那么简单。合并文件1和文件2的原始请求可以通过
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
pdftk
,因为它依赖于gcj
,我相信对此已经失去了支持。尽管通过搜索了pdf操作工具pacman -Ss pdf
,但我还是错过了。感谢您的回答!我应该收到更多赞誉,因此它会在pdfunite
或的建议旁边显示pdftk
。
Apache PDFBox http://pdfbox.apache.org/
PDFMerger此应用程序将获取pdf文档列表并将其合并,将结果保存到新文档中。
用法:java -jar pdfbox-app-xyzjar PDFMerger“源PDF文件(2 ..n)”“目标PDF文件”
使用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
该工具支持以下内容
您可以在下面的链接中找到更多详细信息,它是开源的
gs
(上面列出的所有变体),两个PDF(2MB和500Kb)的简单合并需要几分钟才能完成,并产生40MB的文件!pdftools
使用相同的文件大小立即完成。
您可以使用sejda-console,免费和开放源代码。解压缩并运行 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
推荐。但是,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)
date +%s
-.pdf'&& pdfunite output-*。pdf output.pdf(这将创建500个按顺序处理的文件批次,使生成的临时文件以正确的顺序排序,并产生适当的输出文件;之后您需要清理临时文件)
这是我使用的一种有效且易于实现的方法。这将需要两个FPDF和FPDI可以在这里下载库:
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绑定)的开发人员之一,我有偏见。
您可以轻松地用它(以及更多)做您想做的事。骨架代码如下所示:
#-------------------------------------------------
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上。
我喜欢Chasmo的想法,但是我喜欢利用诸如
convert $(ls *.pdf) ../merged.pdf
提供多个源文件可convert
导致将它们合并为通用pdf。此命令将.pdf
实际目录中所有带有扩展名的文件合并到merged.pdf
父目录中。
$(ls *.pdf)
来代替简单的通配符*.pdf
?
ls *.pdf
通配符会失去对合并文件顺序的控制。在一个示例中,以下列表: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)。