Ghostscript命令行-将参数传递给包含的文件

时间:2018-07-19 12:54:17

标签: node.js pdf ghostscript

我使用node.js和Ghostscript开发pdf转换应用程序。我用gs执行命令行exec()。我的命令定义如下:

let gs_cmd = `
               gs -sDEVICE=pdfwrite \
                  -dPDFX=true \
                  -dPDFACompatibilityPolicy=1 \
                  -sColorConversionStrategy=/CMYK \
                  -sProcessColorModel=DeviceCMYK \
                  -sDefaultCMYKProfile=${icc_profile_file} \
                  -dNoOutputFonts \
                  -dBATCH \
                  -dQUIET \
                  -r${DPI} \
                  -g${w}x${h} \
                  -dPDFFitPage \
                  -NumRenderingThreads=4 \
                  -o ${target_file}-conv.pdf \
                  PDFX_def.ps \
                  @trimbox.in "Trimed" \
                  ${target_file}.pdf
            `;

我对线路有疑问

@trimbox.in "Trimed" \

告诉Ghostscript包含文件并将参数传递给in。我找不到合适的方法来包含可在包含文件中使用的参数。我想将"Trimed"字符串作为$0参数传递,它将在trimbox.in文件中可用。我也尝试使用-t=Trimmed-t="Trimmed",但没有效果。

来自Ghostscript docs第10.1节):

  

@文件名

     
    

使Ghostscript读取文件名并将其内容与命令行相同。 (这主要是为了避免DOS命令行长度限制为DOS的128个字符。)文件中的开关或文件名可以用任意数量的空格(空格,制表符,换行符)分隔;文件大小没有限制。

  
     

-文件名arg1 ...
  -+文件名arg1 ...

     
    

像往常一样将下一个参数作为文件名,但采用所有其余参数(即使它们具有开关的语法形式),并在userdict(不是systemdict)中将名称​​ ARGUMENTS 定义为运行文件之前,这些字符串的数组。当Ghostscript完成执行文件后,它会返回外壳。

  

如何实现?

运行命令会导致错误:

  

错误:/ Trimed中未定义

1 个答案:

答案 0 :(得分:0)

首先,您应该查看Ghostscript许可证,以确保您的使用符合该许可证(AGPL v3)。请注意,这包括软件即服务应用程序。

“ Trimed”不是Ghostscript开关,也不是输入文件的名称,所以是的,您会得到一个错误。您不能将参数“传递”到@file,因为Ghostscript实际上将其视为包含一堆开关的文件。没有没有命令替代之类的东西。因此,@ file指定的文件中不能包含$ 0。

所以当你说:

  

@ PDFX_def_trimbox.ps“修剪” \

     

告诉Ghostscript包含文件并将参数传递给   在

恐怕你不正确。使用@file语法时,无法将参数“传递”到文件。

您尚未说出“ PDFX_def_trimbox.ps”文件中的内容,并且我怀疑(因为.ps)这是一个PostScript程序。您不能使用具有@file语法的PostScript程序,因为PostScript程序不是一系列Ghostscript开关。

那么您在哪里:

-sDEVICE=pdfwrite \
-dPDFX=true\

等,您可以将所有这些开关放入@file指定的文件中。但是您不能在其中放置任何PostScript。

还有其他一些问题。您已指定NumRenderingThreads = 4,该操作什么都不做,因为pdfwrite设备(通常)不进行任何渲染,它会尽可能多地保留输入数据。因此pdfwrite会完全忽略此参数。

出于类似的原因,-r参数没有用。对于pdfwrite而言,它仅影响转换的准确性。您不应在没有充分理由的情况下进行设置。

您应将-sColorConversionStrategy = / CMYK设置为= -sColorConversionStrategy = CMYK -dColorConversionStrategy = / CMYK。 -s使用字符串,-d使用数字或名称。

-g设置页面的宽度和高度(以像素为单位),这不是一个好的计划,这取决于分辨率。您应该改为-dDEVICEWIDTHPOINTS和-dDEVICEHEIGHTPOINTS,并且不要设置分辨率。

-编辑-

-在下面回应评论-

如果要让PDF文件包含300 dpi的图像,则需要创建一个正确尺寸的页面,以便在其上进行绘制时,图像的位图数据为300 dpi。

因此,例如,如果您有一个600像素乘900像素的图像,则为了使该图像达到300 dpi,您必须使介质尺寸为2英寸乘3英寸,即144乘216磅。更改pdfwrite设备的分辨率完全不会影响分辨率。设置-g和-r会更改介质大小,但不会更改图像的分辨率,尽管如果还设置了-dPDFFitPage,则是的,它将重新缩放图像以适合介质,这更改其大小。分辨率.....

我不知道您的原始图像是否为300 dpi,如果是原始图像,并且SVG到PDF的转换保持了这种水平,那么您根本不必担心介质的大小和分辨率,pdfwrite设备将保持那里有什么。

关于@file语法,您不能这样做:

-c“ [{ThisPage} << / TrimBox [$ 0 $ 1 $ 2 $ 3] >> / PUT pdfmark”

通过@ comamnd提供的文件中的

,因为正如我所说,在Ghostscript对文件内容执行的处理中没有变量替换。这不是bash脚本。