将多个输入通过管道传输到 Ghostscript

Piping multiple inputs into Ghostscript

我正在尝试使用 Ghostscript 创建一个单行 Linux 命令来组合两个从 URL 下载的 PDF 文件。但是,我不想创建任何临时文件(一切都应该在内存中完成)。

以下命令似乎不起作用(我尝试通过进程替换来实现)。

gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=combined.pdf <(curl http://example.com/one.pdf) <(curl http://example.com/two.pdf)

当我运行这个命令时,它给我以下错误。

**** Warning:  An error occurred while reading an XREF table.
**** The file has been damaged.  This may have been caused
**** by a problem while converting or transfering the file.
**** Ghostscript will attempt to recover the data.
Error: /ioerror in --run--
Current allocation mode is local
Last OS error: Illegal seek
GPL Ghostscript 9.18: Unrecoverable error, exit code 1

我相信正在发生的事情是 Ghostscript 命令在两个输入的 PDF 有机会完成下载之前 运行,也许有一种等待这种情况发生的方法。

好的,这里有几个问题;

首先,Ghostscript 和 pdfwrite 设备不会合并 PDF 文件。输入被完全解释,转换为图形基元,并被发送到设备。渲染设备使用图形库将图元渲染为位图,矢量设备创建图元的高级表示并以适当的语言将其写入输出。因此,请务必注意,输出文件的内容与输入文件的内容无关。只有渲染时的视觉结果应该相同。

其次,你无法避免临时文件。如果您通过 stdin 将 PDF 文件通过管道传输到 Ghostscript,那么它只会创建一个临时文件并将整个文件存储在其中。这是必要的,因为 PDF 文件需要随机访问才能被解释。

最后,您不能在命令行中两次从标准输入进行管道传输。要处理两个文件,您需要编写自己的 Ghostscript 接口并使用流接口发送数据,或者将它们都放在命令行上。

所以: gs file1.pdf file2.pdf

您尝试执行的操作根本行不通,并且在任何情况下都不会阻止创建这两个 PDF 文件,只是 Ghostscript 会在您看不到它们的地方为您创建它们。