1

在我的 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"

从技术上讲,哪个有效,但据我了解,必须在没有自己的裁剪框的情况下定义文档,否则它将无法工作。

4

1 回答 1

1

为了添加 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
于 2018-10-30T08:25:07.533 回答