使用Ghostscript

时间:2018-10-30 01:13:43

标签: c# .net ghostscript ghostscript.net

在C#应用程序中,我试图在可导航窗口中显示PDF文档,并带有缩放,平移等选项。我正在使用Ghostscript.NET。例如,从速度来看,Adobe Acrobat Reader看起来仅能够呈现页面的给定部分。我只找到了光栅化整个页面的方法,这不太实用,尤其是在高缩放级别中。是否可以先裁剪出一个矩形(基于计算出的角坐标),然后快速光栅化它而无需其余页面?

我尝试了以下命令:

gswin64.exe -sDEVICE=pdfwrite -o C:/work/marked.pdf -dUseCropBox -c "[/CropBox [300 400 400 600] /PAGES pdfmark"  -f "c:\big boat.pdf"

从技术上讲,这是可行的,但是据我了解,该文档必须在没有其自己的裁剪框的情况下进行定义,否则将无法正常工作。

1 个答案:

答案 0 :(得分:0)

要向页面添加CropBox,您可以使用EndPage过程,方法是在页面末尾而不是开头发送pdfmark,它应该覆盖任何先前存在的CropBox。

或更简单地说,您可以直接直接渲染一部分媒体,这听起来像您想做的一样,并且避免了(可能很长的)处理步骤。

将媒体尺寸设置为要渲染的区域。现在,假设您想要一个2英寸的正方形,离页面底部1英寸。因此,我们首先将介质尺寸设置为2英寸见方,然后对其进行固定,以使任何输入都无法更改它:

-dDEVICEWIDTHPOINTS=144 -dDEVICEHEIGHTPOINTS=144 -dFIXEDMEDIA

如果将其添加到用于渲染PDF文件的命令行中,则会看到2平方英寸的渲染图。当然,现在这是页面的左下角,所以现在我们需要移动媒体位置,以便我们想要的部分位于页面上。为此,我们使用PostScript,特别是页面设备字典中的PageOffet键:

<</PageOffset [-72 0]>> setpagedevice

请注意,我们正在移动页面的左下角,这就是为什么我们使用-72的原因,我们希望该角向下。

由于我们使用的是PostScript,因此需要使用-c和-f开关对其进行介绍:

-c "<</PageOffset [-72 0]>> setpagedevice" -f

因此整个命令行变为:

./gs -dDEVICEWIDTHPOINTS=144 -dDEVICEHEIGHTPOINTS=144 -dFIXEDMEDIA -c "<</PageOffset [-72 0]>> setpagedevice" -f input.pdf

如果您确实要添加CropBox并生成PDF文件,则需要添加EndPage过程,该过程将向每个页面分别添加CropBox:

./gs -sDEVICE=pdfwrite -o ./marked.pdf -c "<</EndPage {0 eq {[/CropBox [300 400 400 600] /PAGE pdfmark pop true}{pop false}ifelse}>>setpagedevice"  -f "c:\big boat.pdf