我正在使用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。
我唯一的问题是,在压缩过程中,页面无法重新加载,并挂起,直到过程完成。
当我重新加载页面时,有没有一种方法可以杀死进程,或者有没有更好的方法来处理这种类型的应用程序?
1条答案
按热度按时间lztngnrs1#
Ghostscript不是一个压缩器,远远不是,它是一个打印文件重写器。这意味着文件通常可以更大,而不是更小的组件被添加。
以这个例子为例,它在一个页面中涵盖了许多不同类型的常见PDF功能。
x1c 0d1x的数据
需要注意的是文件更大,对象丢失。
源有60个对象,转换有68个,为什么有区别?
以及
字符串
因此,总体而言,文件已被减少到一个更大的标准兼容的文件。大多数PDF已经优化压缩,所以试图重新压缩一般是一个灾难的路线,每个对象一个接一个的自定义目标,需要确定现有的对象压缩是否足够好,以快速解压缩或是否可以取得收益(罕见的B&W图像文件除外)。
请注意,一个非常相似的源文件在不同的GhostScript运行时字节数减半(即使包括添加的字体),而没有干扰1.7的功能或/ebook分辨率,所以只是简单地“重建”。它确定压缩可以“更好”的一些对象,并删除任何!
具体到你的问题是,GS(与所有PDF操作一样)必须独占处理器使用100%的输入和输出文件,直到所有线程完成,过程自然完成。因此,实际上是一个串行任务,内部使用并行进程,通常不能外部线程。