haa*_*kym 1 php pdf shell-exec ghostscript
将 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
Run Code Online (Sandbox Code Playgroud)
我按照以下答案中的建议使用 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.pdf1.4 版。
现在我有以下 php 脚本,当从 Web 浏览器运行时,它会连续加载。如果我让它运行一下,有时会创建一个新文件,但它的大小为 3kb 并且是空白的,并且原始 pdf 文件有时也为空白?!
<?php
shell_exec( "gswin64 -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=new-file.pdf test-file.pdf");
echo 'done';
Run Code Online (Sandbox Code Playgroud)
任何想法我做错了什么?
正要发布这个问题并弄清楚了,所以继续回答并为他人谋福利。
我在超级用户https://superuser.com/questions/200188/reading-a-pdf-file-for-testing-in-ghostscript#answer-200784上阅读了这个答案
这部分是灯泡
如果您在 Windows 上使用 Ghostscript,您将有两个可执行文件:
gswin32c.exegswin32.exe第一个是从“DOS 框”(即 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>";
Run Code Online (Sandbox Code Playgroud)
这表明我引用了错误的文件名 ietest-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
Run Code Online (Sandbox Code Playgroud)
更新文件名后,一切正常!
更新
回应玛莎在问题中的评论......
“将它添加到我的路径中”是什么意思?提前致谢。
当您向 PATH 环境变量添加可执行文件或一组可执行文件的位置时,它允许从任何位置从命令行调用可执行文件。例如,您可以C:\youruser\Desktop在将其添加到您的路径后调用 ghostscript ,而不是在您的 ghostscript 文件所在的文件夹C:\gs\bin或任何文件夹中。
有时您正在安装的软件会自动为您执行此操作,有时您需要自己手动执行此操作(就像 ghostscript 的情况一样)。
如何将可执行文件添加到 PATH 环境变量:
提示:
windows+ 键可以跳到第 3 步pause;如果您在谷歌上搜索诸如“将 exe 添加到我的路径窗口”之类的内容,我相信您会找到很多关于此的信息。希望这有帮助!