我正在使用 Laravel 10 构建一个 PDF 压缩器应用程序。我正在使用 Process 类在服务器上执行 Ghostscript 命令:
$cmd = "gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile={$output} {$input}";
$process = new Process(explode(' ', $cmd));
$process->setTimeout(3600);
$process->run();
以上代码按预期工作,压缩PDF已成功生成。
我遇到的唯一问题是在压缩过程中,页面无法重新加载并挂起,直到过程完成。
有没有办法可以在重新加载页面时终止进程,或者有更好的方法来处理此类应用程序吗?
Ghostscript 不是压缩器,远非如此,它是打印文件重写器。这意味着随着组件的添加,文件通常会更大而不是更小。
以这个例子为例,它在一页中涵盖了许多不同类型的常见 PDF 功能。
需要注意的是文件较大且对象丢失。
源有 60 个对象,而转换有 68 个对象 那么为什么有区别呢?
嗯
该版本已从 1.7(最常见)降级为 lessor 1.4,因此,如果可能,任何 1.5、1.6 或 1.7 功能都会在 1.4 兼容对象中重新生成(可能需要将某些功能转换为 2 个或更多对象,但这可能并不总是可能的。
有一些字体需要改变,这通常会添加更多或更少的对象。如果以静默方式运行(-q 或 -dQUITE),您将看不到是否因字体而出现任何挂起。
Loading font Helvetica (or substitute) from %rom%Resource/Font/NimbusSans-Regular
Loading CIDFont KaiTi_GB2312 substitute from %rom%Resource/CIDFSubst/DroidSansFallback.ttf
Loading CIDFont STSong-Light substitute from %rom%Resource/CIDFSubst/DroidSansFallback.ttf
因此,总体而言,文件已缩减为更大、更标准兼容的文件。
具体到您的问题是,GS(与所有 PDF 操作一样)必须独占处理器使用 100% 的输入和输出文件,直到所有线程完成并且该过程自然完成。因此,实际上,串行任务在内部使用并行进程,通常无法在外部线程化。