提问人:alcohol 提问时间:3/24/2010 最后编辑:Communityalcohol 更新时间:5/30/2023 访问量:1114556
将多个PDF文件合并/转换为一个PDF [已关闭]
Merge / convert multiple PDF files into one PDF [closed]
问:
这个问题似乎不是关于特定的编程问题、软件算法或程序员主要使用的软件工具。如果您认为该问题在另一个 Stack Exchange 站点上是主题,您可以发表评论以解释该问题可能在哪里得到回答。
2年前关闭。
社区在 10 个月前审查了是否重新讨论这个问题,并将其关闭:
原始关闭原因未解决
如何将多个PDF文件合并/转换为一个大的PDF文件?
我尝试了以下方法,但目标文件的内容与预期不符:
convert file1.pdf file2.pdf merged.pdf
我需要一个非常简单/基本的命令行 (CLI) 解决方案。最好的是,如果我可以将合并/转换的输出直接转换为(正如我之前在这里提出的问题中最初尝试的那样:Linux 管道(转换 -> pdf2ps -> lp))。pdf2ps
答:
对不起,我自己用谷歌找到了答案,有点运气:)
对于那些感兴趣的人;
我在 debian 服务器上安装了 pdftk (pdf toolkit),并使用以下命令获得了所需的输出:
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
考虑到 pdfunite
是 poppler 的一部分,它被安装的机会更高,使用也比 pdftk
更简单:
⚠ 重要提示:请确保您记得提供 out.pdf
,否则它将覆盖命令⚠中的最后一个输入文件
pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
更安全的解决方案可能包括
针对输出文件的不存在测试
export output_file=out.pdf && \
! test -e $output_file && \
pdfunite in-1.pdf in-2.pdf in-n.pdf $output_file
评论
pdfunite *.pdf out.pdf
还将创建一个包含 a.pdf 和 b 内容的新.pdfpdfjoin a.pdf b.pdf
b-joined.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
这样,您就不需要安装任何其他东西,只需使用系统中已经安装的内容(至少两者都默认在我的盒子中)。
更新#1:首先感谢您的所有好评!只是一个可能对你们有用的提示,在谷歌搜索之后,我发现了一个缩小 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
更新#2:如果您需要“刻录”编辑内容并压缩使用 Acrobat 制作的 PDF,这将有所帮助:
gs -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dPDFSETTINGS=/screen -dEmbedAllFonts=true -dSubsetFonts=true -dColorImageDownsampleType=/Bicubic -dColorImageResolution=144 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=144 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=144 -sOutputFile=compressed.pdf withedits.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
dPrinted=false
如果要将所有下载的图像转换为一个pdf,请执行
convert img{0..19}.jpg slides.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
我喜欢 Chasmo 的想法,但我更喜欢利用诸如
convert $(ls *.pdf) ../merged.pdf
提供多个源文件会导致将它们合并到一个通用的 pdf 中。此命令将实际目录中所有带有扩展名的文件合并到父目录中。convert
.pdf
merged.pdf
评论
$(ls *.pdf)
*.pdf
ls *.pdf
Apache PDFBox http://pdfbox.apache.org/
PDFMerger 此应用程序将获取 pdf 文档列表并合并它们,将结果保存在新文档中。
用法:java -jar pdfbox-app-x.y.z.jar PDFMerger “源PDF文件(2 ..n)“ ”目标 PDF 文件”
这是我使用的一种有效且易于实现的方法。这将需要 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');
您可以使用 sejda-console,免费和开源。
解压缩并运行sejda-console merge -f file1.pdf file2.pdf -o merged.pdf
它保留了书签、链接注释、杂物等。它实际上有很多选项可供您使用,只需运行即可查看所有选项。sejda-console merge -h
评论
我支持这项建议。但是,当我尝试合并> 2k PDF 文件时,我遇到了错误。pdfunite
Argument list too long
我求助于Python和两个外部包:PyPDF2(用于处理所有与PDF相关的内容)和natsort(用于对目录的文件名进行“自然”排序)。如果这可以帮助某人:
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)
评论
date +%s
使用 PyPI 中的 pdftools
。
下载 tar.gz 文件并解压缩并运行如下命令
python pdftools-1.1.0/pdfmerge.py -o output.pdf -d file1.pdf file2.pdf file3
在运行上述命令之前,您应该安装 python3
此工具支持以下内容
- 加
- 插入
- 删除
- 旋转
- 分裂
- 合并
- 拉链
您可以在 GitHub 上找到更多详细信息,它是开源的
评论
gs
pdftools
我是 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 上。
pdfunite
合并整个 PDF 是可以的。例如,如果您想要 file1 中的第 2-7 页.pdf以及 file2.pdf 中的第 1、3、4 页,则必须使用将文件拆分为单独的 PDF,以便每个页面提供给 .pdfseparate
pdfunite
在这一点上,您可能想要一个具有更多选项的程序。 是我发现的用于操作 PDF 的最佳实用程序。 更大更慢,Red Hat/Fedora 不会打包它,因为它依赖于 gcj。其他 PDF 实用程序具有 Mono 或 Python 依赖项。我发现生成的输出文件比使用和将页面组装成 30 页的输出 PDF 要小得多,分别为 970kB 和 1,6450 kB。因为它提供了更多的选项,所以的命令行并不那么简单;合并 file1 和 file2 的原始请求可以通过以下方式执行qpdf
pdftk
qpdf
pdfseparate
pdfunite
qpdf
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
评论
pdftk
gcj
pacman -Ss pdf
pdfunite
pdftk
qpdf --collate --empty --pages odd.pdf even.pdf z-1 -- merged.pdf
如果您有多个文件并且不想逐个输入名称,这是最简单的解决方案:
qpdf --empty --pages *.pdf -- out.pdf
评论
qpdf
echo *.pdf | tr ' ' $'\n'
虽然它不是命令行解决方案,但它可以帮助用户:macos
- 选择您的 PDF 文件
- 右键单击突出显示的文件
- 选择快速操作>创建 PDF
评论
您可以看到使用免费和开源的pdftools(免责声明:我是它的作者)。
它基本上是 Latex 包的 Python 接口。pdfpages
要逐个合并 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.pdf
rm -f "${PDFOUT}"
for f in *.pdf
do
printf "processing %-50s" "$f ..." >&2
if [ -f "$PDFOUT" ]; then
# https://stackoverflow.com/questions/8158584/ghostscript-to-merge-pdfs-compresses-the-result
# -dPDFSETTINGS=/prepress
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
输出示例:
processing inp1.pdf ... successful
processing inp2.pdf ... successful
另一个选项,有用的是您还想选择要合并的文档中的页面:
pdfjoin image.jpg '-' doc_only_first_pages.pdf '1,2' doc_with_all_pages.pdf '-'
它带有软件包 texlive-extra-utils
评论
texlive-extra-utils
pdfjoin
My texlive-extra-utils
如果您想使用 Ghostscript 将所有 PDF 文件联接到一个目录中,您可以使用 find 来做到这一点。下面是一个示例
find . -name '*.pdf' -exec gs -o -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=../out.pdf {} +
将在当前目录中找到所有pdf,并在父目录中创建.pdf。 如果他们正在寻找一种使用 ghostscript 快速完成整个目录的方法,可能会很有用。
PdfCpu效果很好:
pdfcpu merge c.pdf a.pdf b.pdf
评论
pdfconcat -o out.pdf 1.pdf 2.pdf
''pdfconcat 是一个用 ANSI C 编写的小型快速命令行实用程序,可以将多个 PDF 文件连接(合并)成一个长 PDF 文档。”
我从终端使用了 qpdf 并在 Windows (Mobaxterm) 和 Linux 上为我工作,例如,在新文件 C.pdf .pdf将 A.pdf 与 B 连接起来的命令是:
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
下一个:firewalld 端口转发失败
评论
convert
pdftk PDF1.pdf PDF2.pdf cat output PDF3.pdf
工作正常