【问题标题】:Merge multiple PDF files into one with PHP Ghostscript使用 PHP Ghostscript 将多个 PDF 文件合并为一个
【发布时间】:2016-08-24 15:24:34
【问题描述】:

我正在尝试使用带有以下代码的 Ghostscript 合并服务器上的多个 PDF 文件:

$files = array(
        '1.pdf',
        '2.pdf',
        '3.pdf'
);

$output = 'single.pdf';

$cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$output ";

foreach($files as $file)
    $cmd .= "pdfs/$file ";

var_dump(shell_exec($cmd));

我使用的脚本位于根文件夹中,而 PDF 文件位于名为 pdfs 的文件夹中:

/[pdfs]
|__ 1.pdf
|__ 2.pdf
|__ 3.pdf
script.php

文件夹和文件的权限都是777。

但尽管如此,什么都没有发生,返回值为NULL。

那么我做错了什么?使用 Ghostscript 将多个 PDF 文件合并为一个的确切方法是什么?

【问题讨论】:

  • 您是否尝试过回显 $cmd 而不是执行它,以便您可以将其复制并粘贴到终端中以验证该命令是否有效且正常工作?
  • 我可以试试,但我会使用哪个终端?我刚刚检查了我的服务器,我看到 PDF 文件最终被合并并且输出结果是正确的。自上次测试以来,我什么都没做。所以我认为这可能只是时间问题。有没有办法计算需要多长时间?

标签: php pdf ghostscript


【解决方案1】:

只是一个旁注; Ghostscript 不会不“合并”PDF 文件,它可以将多个 PDF 文件作为输入并创建一个全新的 PDF 文件,其视觉外观应与输入相同,但不会合并PDF 文件,输入被完全解释,新文件除了外观与输入文件相同外,别无其他。

那么,您确定 Ghostscript 工作正常吗? 您是否尝试过处理单个 PDF 文件? 有用吗?

如果不是,那么最可能的问题是您的 $PATH 环境变量中没有包含 Ghostscript 可执行文件的目录(这是一个常见问题)。您可以通过在命令行中提供 Ghostscript 可执行文件的完全限定路径来测试这一点,而不是:

$cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$output ";

尝试类似:

$cmd = "/usr/local/bin/gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$output ";

显然,您必须修改路径以匹配您的设置。如果这样可行,那么问题很可能是该目录不在 $PATH 中,您可以添加它或只使用完整路径。

还有一个逻辑错误我帮不上忙;

在我看来,您的“foreach”将为数组中的每个文件调用一次 cmd。这意味着每个文件都将通过调用 Ghostscript 来处理。所以每个文件都会产生一个单独的 PDF 文件。由于它们都使用相同的OutputFile,它们将相互覆盖。

如果您想使用所有文件的输入创建单个输出,您需要准确调用 Ghostscript 一次,而不是每个输入文件一次,并且命令行需要包含所有输入文件。

本质上你现在拥有的是:

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=single.pdf 1.pdf
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=single.pdf 2.pdf
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=single.pdf 3.pdf

你想要的是:

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=single.pdf 1.pdf 2.pdf 3.pdf

由于我对 PHP 一无所知,我无法告诉您如何纠正。

【讨论】:

  • 好吧,首先感谢您的详细评论,但您的方法是错误的,因为foreach 不会为每个文件调用命令,它只是连接字符串变量$cmd。 Ghostscript 使用方法shell_exec 调用,并且只在脚本末尾执行一次。事实上,我的问题已经解决了,只是时间问题。我又等了几分钟,输出的 PDF 文件就在那里。
  • 好吧,我确实说过我不是 PHP 开发人员 :-)
猜你喜欢
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 2014-12-02
  • 2013-11-20
  • 2016-04-27
  • 2022-01-16
  • 2013-03-03
相关资源
最近更新 更多