我使用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中未定义
答案 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脚本。