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

时间:2010-03-24 12:56:47

标签: linux pdf merge command-line-interface

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

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

convert file1.pdf file2.pdf merged.pdf

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

24 个答案:

答案 0 :(得分:1220)

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

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf

答案 1 :(得分:456)

尝试好鬼影:

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

通过这种方式,你不需要安装任何其他东西,只需使用你已经安装在系统中的东西(至少在我的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

欢呼声!!

答案 2 :(得分:448)

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

对于那些感兴趣的人;

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

pdftk file1.pdf file2.pdf cat output output.pdf

OR

gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf ...

这又可以直接传送到pdf2ps。

答案 3 :(得分:46)

同样pdfjoin a.pdf b.pdf将创建一个新的b-joined.pdf,内容为.pdf和b.pdf

答案 4 :(得分:35)

您可以直接使用convert命令

e.g。

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf

答案 5 :(得分:21)

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

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

答案 6 :(得分:15)

pdfunite可以合并整个PDF。例如,如果要使用file1.pdf的第2-7页和file2.pdf的第1,3,4页,则必须使用pdfseparate将文件拆分为单独的PDF,以便将每个页面分配给{ {1}}。

到那时,您可能想要一个带有更多选项的程序。 pdfunite是我发现的处理PDF的最佳工具。 qpdf更大且更慢,由于它对gcj的依赖,因此Red Hat / Fedora不打包它。其他PDF实用程序具有Mono或Python依赖项。我发现pdftk生成的输出文件比使用qpdfpdfseparate将页面组合成30页输出PDF的要小得多,输出970kB与1,6450 kB。因为pdfunite的命令行更多,所以它的命令行不是那么简单。合并文件1和文件2的原始请求可以通过

执行
qpdf

答案 7 :(得分:12)

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

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

  

用法:java -jar pdfbox-app-x.y.z.jar PDFMerger“源PDF文件(2 ..n)”“目标PDF文件”

答案 8 :(得分:10)

使用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

此工具支持以下

  • 添加
  • 插入
  • 删除
  • 旋转
  • 分割
  • 合并
  • 邮编

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

https://github.com/MrLeeh/pdftools

答案 9 :(得分:8)

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

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

答案 10 :(得分:8)

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

它保留了书签,链接注释,acroforms等。它实际上有很多你可以玩的选项,只需运行sejda-console merge -h就可以看到它们。

答案 11 :(得分: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)

答案 12 :(得分:4)

我有偏见是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上。

答案 13 :(得分:4)

尽管这不是命令行解决方案,但它可以帮助find <virtualenv> -type l -delete virtualenv -p $(which python3) <virtualenv> 用户:

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

答案 14 :(得分:4)

这是我使用的一种方法,它易于实现。这需要 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');

答案 15 :(得分:3)

我喜欢Chasmo的想法,但我更喜欢使用像

这样的优点
convert $(ls *.pdf) ../merged.pdf

将多个源文件提供给convert会导致将它们合并为一个通用的pdf。此命令将实际目录中具有.pdf扩展名的所有文件合并到父目录中的merged.pdf

答案 16 :(得分:3)

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

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

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

pdftools --input-file file1.pdf --input-file file2.pdf --output output.pdf

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

pdftools --input-dir ./dir_with_pdfs --output output.pdf

答案 17 :(得分:1)

PdfCpu 效果很好:

pdfcpu merge c.pdf a.pdf b.pdf

https://pdfcpu.io/core/merge

答案 18 :(得分:1)

pdfconcat -o out.pdf 1.pdf 2.pdf

``pdfconcat 是一个用 ANSI C 编写的小而快速的命令行实用程序,可以将多个 PDF 文件连接(合并)为一个长 PDF 文档。''

答案 19 :(得分:1)

我从终端使用 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]

答案 20 :(得分:0)

其他答案很好,但是如果您不能在本地合并PDF(无论您是在共享托管环境中还是出于其他原因),它们都将无济于事。

如果您正在寻找用于远程合并PDF的API,可以尝试使用api2pdf,该端点具有将PDF合并在一起的端点。文档为here

答案 21 :(得分:0)

bash脚本,用于检查合并错误

我遇到了问题,一些pdf合并产生了一些错误消息。 由于要查找损坏的pdf相当多的尝试和错误,因此我为此编写了一个脚本。

以下bash脚本将一个文件夹中的所有可用pdf逐一合并,并在每次合并后显示成功状态。只需将其复制到pdf文件夹中,然后从那里执行。 / p>

    #!/bin/bash
    
    PDFOUT=_all_merged.pdf
    rm -f ${PDFOUT}
    
    for f in $(ls *.pdf)
    do
      printf "processing %-50s" "$f  ..."
      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`
        nChars=`echo -n "${status}" | wc -c`
        if [ $nChars -gt 0 ]
        then
          echo "gs ERROR"
        else
          echo "successfully"
        fi
        mv "${PDFOUT}.new" ${PDFOUT}
      else
        cp "$f" ${PDFOUT}
        echo "successfully"
      fi
    done

示例输出:

processing inp1.pdf  ...                                     successfully
processing inp2.pdf  ...                                     successfully

答案 22 :(得分:0)

另一个有用的选项是您还想选择要合并的文档内的页面:

static void Main(string[] args)
{
    int TestValue = 0;
    Console.WriteLine(TestValue);
    TestingMethod(ref TestValue);
    Console.WriteLine(TestValue);
    TestingMethod(ref TestValue);
    Console.WriteLine(TestValue);
}

static void TestingMethod(ref int Start)
{
    Start++;
}

它带有包 texlive-extra-utils

答案 23 :(得分:0)

如果你想用 Ghostscript 将所有 PDF 文件加入一个目录中,你可以使用 find 来做到这一点。举个例子

find . -name '*.pdf' -exec gs -o -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=../out.pdf {} +

会在当前目录中查找所有pdf,并在父目录中创建out.pdf。 如果他们正在寻找一种使用 ghostscript 快速完成整个目录的方法,可能会很有用。

相关问题