Merge / convert multiple PDF files into one PDF

Merge / convert multiple PDF files into one PDF

技术背景

在日常工作和学习中,我们常常需要将多个PDF文件合并成一个PDF文件,以方便查看、分享和存储。不同的操作系统和使用场景下,有多种工具和方法可以实现这一需求。

实现步骤

pdfunite

pdfunitepoppler 的一部分,安装概率较高,使用也比 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 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)

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

Python + pdftools

1
2
pip install pdftools
pdftools merge file1.pdf file2.pdf file3.pdf -o output.pdf

macOS 快捷操作

  1. 选择PDF文件。
  2. 右键单击选中的文件。
  3. 选择 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.pdf
rm -f "${PDFOUT}"

for f in *.pdf
do
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文件的合并,pdfuniteqpdf 是简单快捷的选择。
  • 当需要处理大量PDF文件或对合并后的文件质量有较高要求时,Ghostscript 是一个不错的选择。
  • 如果需要对PDF文件进行更复杂的操作,如选择特定页面进行合并,pdfjoin 或 Python 库(如 PyPDF2、PyMuPDF)会更合适。

常见问题

  • Argument list too long:当使用 pdfunite 合并大量文件时,可能会出现此错误。可以使用 Python 脚本或 find 命令结合 Ghostscript 来处理。
  • 文件覆盖问题:使用 pdfunite 时,务必指定输出文件名,否则可能会覆盖最后一个输入文件。可以通过检查文件是否存在来避免。

Merge / convert multiple PDF files into one PDF
https://119291.xyz/posts/merge-convert-multiple-pdf-files-into-one-pdf/
作者
ww
发布于
2025年5月29日
许可协议