将多个输入管道输入Ghostscript

时间:2016-10-17 16:44:30

标签: linux curl ghostscript piping process-substitution

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

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

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有机会完成下载之前运行,也许有办法等待这种情况发生。

1 个答案:

答案 0 :(得分:0)

好的,这里有几个问题;

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

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

最后,您无法在命令行上从stdin管道两次。要处理两个文件,您需要编写自己的Ghostscript接口,并使用流接口发送数据,或将它们放在命令行中。

所以: gs file1.pdf file2.pdf

你想要做的事情根本不起作用,并且无论如何都不会阻止创建两个PDF文件,只是Ghostscript会为你创建它们而你却看不到它们。