Merge / convert multiple PDF files into one PDF 技术背景 在日常工作和学习中,我们常常需要将多个PDF文件合并成一个PDF文件,以方便查看、分享和存储。不同的操作系统和使用场景下,有多种工具和方法可以实现这一需求。
实现步骤 pdfunite pdfunite
是 poppler
的一部分,安装概率较高,使用也比 pdftk
简单。
1 pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
为避免覆盖文件,可先检查输出文件是否存在:
1 2 3 export output_file=out.pdf && \ ! test -e $output_file && \ pdfunite in-1.pdf in-2.pdf in-n.pdf $output_file
Ghostscript 1 gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=merged.pdf mine1.pdf mine2.pdf
对于低分辨率的PDF,可使用以下改进命令:
1 gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdf
qpdf 1 qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
Python + PyPDF2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 from pathlib import Pathfrom PyPDF2 import PdfMergerimport 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)
sejda-console 1 sejda-console merge -f file1.pdf file2.pdf -o merged.pdf
PyMuPDF 1 2 3 4 5 6 7 8 import fitz fout = fitz.open () flist = ["1.pdf" , "2.pdf" ]for f in flist: fin = fitz.open (f) fout.insertPDF(fin) fin.close() fout.save("joined.pdf" )
convert 1 convert -density 300x300 -quality 100 mine1.pdf mine2.pdf merged.pdf
1 2 pip install pdftools pdftools merge file1.pdf file2.pdf file3.pdf -o output.pdf
macOS 快捷操作 选择PDF文件。 右键单击选中的文件。 选择 Quick actions > Create PDF 。 Apache PDFBox 1 java -jar pdfbox-app-x.y.z.jar PDFMerger "Source PDF files (2 ..n)" "Target PDF file"
pdfcpu 1 pdfcpu merge c.pdf a.pdf b.pdf
pdfconcat 1 pdfconcat -o out.pdf 1.pdf 2.pdf
pdfjoin 1 pdfjoin image.jpg '-' doc_only_first_pages.pdf '1,2' doc_with_all_pages.pdf '-'
Bash脚本检查合并错误 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/bin/bash PDFOUT=_all_merged.pdfrm -f "${PDFOUT} " for f in *.pdfdo printf "processing %-50s" "$f ..." >&2 if [ -f "$PDFOUT " ]; then 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
最佳实践 对于少量PDF文件的合并,pdfunite
和 qpdf
是简单快捷的选择。 当需要处理大量PDF文件或对合并后的文件质量有较高要求时,Ghostscript 是一个不错的选择。 如果需要对PDF文件进行更复杂的操作,如选择特定页面进行合并,pdfjoin
或 Python 库(如 PyPDF2、PyMuPDF)会更合适。 常见问题 Argument list too long :当使用 pdfunite
合并大量文件时,可能会出现此错误。可以使用 Python 脚本或 find
命令结合 Ghostscript 来处理。文件覆盖问题 :使用 pdfunite
时,务必指定输出文件名,否则可能会覆盖最后一个输入文件。可以通过检查文件是否存在来避免。