在 php 脚本中使用 Ghostscript

问题描述 投票:0回答:3

将 Laravel 用于 Web 应用程序,我使用 https://github.com/clegginabox/pdf-merger 来合并 pdf 文件,并在尝试将两个 pdf 文件合并在一起(其中一个版本超过版本 1.4)时遇到以下错误:

Exception in pdf_parser.php line 133:

This document (C:\path-to-doc\file.pdf) probably uses a compression technique 
which is not supported by the free parser shipped with FPDI. 
(See https://www.setasign.com/fpdi-pdf-parser for more details)

in pdf_parser.php line 133

我按照以下答案中的建议使用 Ghostscript 将 1.4 以上的任何 pdf 转换为 1.4,以便合并可以正常工作。

FPDF 错误:此文档 (testcopy.pdf) 可能使用了 FPDI 附带的免费解析器不支持的压缩技术

我已成功安装 Ghostscript 并将其添加到我的路径中。为了进行测试,我有一个 1.5 版本的示例 pdf 文件,名为

test.pdf
,我从 Windows 终端运行以下命令:

gswin64 -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=new-file.pdf test-file.pdf

我的

new-file.pdf
和 1.4 版本一样好。

现在我有以下 php 脚本,当从网络浏览器运行时,它会连续加载。如果我让它运行一下,有时会创建一个新文件,但它的大小约为 3kb,并且是空白的,而且原始 pdf 文件有时会变成空白?!

<?php

shell_exec( "gswin64 -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=new-file.pdf test-file.pdf");

echo 'done';

有什么想法我做错了吗?

php pdf ghostscript shell-exec
3个回答
7
投票

正要发布这个问题并弄清楚了,所以为了其他人的利益而继续回答。

我在超级用户上阅读了这个答案https://superuser.com/questions/200188/reading-a-pdf-file-for-testing-in-ghostscript#answer-200784

这部分是灯泡

如果您在 Windows 上使用 Ghostscript,您将有两个可执行文件:

  1. gswin32c.exe
  2. gswin32.exe

第一个是从 DOS 内部运行 box'(即 cmd.exe 窗口)——交互或非交互。它打印 所有 stderr/stdout 消息都进入 cmd.exe 窗口,并且还期望 可以在其中输入任何输入命令。

第二个打开一个单独的窗口用于“交互”:打印 stderr/stdout 来分隔窗口,并期望那里有命令。

所以我更改了我的 php 脚本以使用

gswin64c
并从命令响应中输出文本:

$output = shell_exec( "gswin64c -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=new-file.pdf test.pdf");

echo "<pre>$output</pre>";

这表明我引用了错误的文件名,即

test-file.pdf
而不是
test.pdf

Error: /undefinedfilename in (test-file.pdf)
Operand stack:

Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push
Dictionary stack:
   --dict:1192/1684(ro)(G)--   --dict:0/20(G)--   --dict:78/200(L)--
Current allocation mode is local
Last OS error: No such file or directory

更新文件名后一切正常!

更新

回应玛莎在问题中的评论......

“将其添加到我的路径中”是什么意思?预先感谢。

当您将可执行文件或一组可执行文件的位置添加到 PATH 环境变量时,它允许从任何位置从命令行调用可执行文件。例如,您可以在将 Ghostscript 添加到路径后从

C:\youruser\Desktop
调用 GhostScript,而不是位于 GhostScript 文件所在的文件夹
C:\gs\bin
或其他任何文件夹中。

有时您正在安装的软件会自动为您执行此操作,有时您需要自己手动执行此操作(如 Ghostscript 的情况)。

如何将可执行文件添加到PATH环境变量:

  1. 我的电脑
  2. 属性
  3. 高级系统设置
  4. 环境变量
  5. 然后将可执行文件附加到用户变量/PATH 或系统变量/Path 中现有值的末尾 - 如果您使用用户变量,它将仅适用于您的用户;如果您使用系统变量,它将适用于所有用户

温馨提示:

  • windows
    键 +
    pause
  • 可跳至步骤 3
  • 您必须用分号分隔路径变量中的新条目
    ;

如果您用谷歌搜索“将 exe 添加到我的路径窗口”之类的内容,我相信您会找到大量有关此的信息。希望这有帮助!


1
投票

由于某种原因,Apache 没有获取 Windows PATH 环境变量,我找到的解决方案是在双引号之间写入 gs 可执行文件的完整路径(如果其中有空格)。

exec('"C:\Program Files\gs\gs9.27\bin\gs.exe" -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -dGraphicsAlphaBits=4 -sOutputFile=test.png test.pdf ');

0
投票

向 PDF 文件添加注释。

exec('"gswin32c.exe" -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPreserveAnnots=false -dAutoRotatePages=/None -sFONTPATH="C:/WINDOWS/Fonts" -sOutputFile="'.$outputFile.'" -sPDFPassword="'.$inputFilePassword.'" -f "'.$inputFile.'"')
© www.soinside.com 2019 - 2024. All rights reserved.