GhostscriptViewer类在触发事件方面做得很好,使我能够逐渐更新图像,并且用户看到图形正在成形-漂亮。我想将此机制保留在应用程序中。
但是,我无法弄清楚如何将某些PostScript馈送到GhostscriptViewer,以便呈现文档的裁剪部分。这是我可以使用GhostscriptViewerDeviceHandler进行的操作:
GhostscriptViewerDeviceHandler dev = new GhostscriptViewerDeviceHandler(GhostscriptPngDeviceType.Png16m);
dev.GraphicsAlphaBits = GhostscriptImageDeviceAlphaBits.V_4;
dev.TextAlphaBits = GhostscriptImageDeviceAlphaBits.V_4;
dev.ResolutionXY = new GhostscriptImageDeviceResolution((int)resolutionEdit.Value, (int)resolutionEdit.Value);
dev.InputFiles.Add(@"C:\work\pdf-tagger\data\bigboat.pdf");
dev.Pdf.FirstPage = 1;
dev.Pdf.LastPage = 1;
if (cbCrop.Checked)
{
dev.CustomSwitches.Add("-dDEVICEWIDTHPOINTS=" + ((int)(sizeWidth.Value)).ToString());
dev.CustomSwitches.Add("-dDEVICEHEIGHTPOINTS=" + ((int)(sizeHeight.Value)).ToString());
dev.CustomSwitches.Add("-dFIXEDMEDIA");
// this thing here!
dev.PostScript = String.Format(@"
<<
/PageOffset[{0} {1}]
>> setpagedevice", -offsetX.Value, offsetY.Value);
}
此代码有效,由于仅渲染了裁剪的部分,因此渲染时间有所减少。但是在这种情况下,我无法对渲染进度做出反应并显示部分渲染的图像。 因此,控制偏移量的PostScript-我也尝试通过GhostscriptViewer.CustomSwitches来应用它,如下所示:
_viewer = new GhostscriptViewer();
_viewer.ProgressiveUpdateInterval = 100;
_viewer.Dpi = (int)resolutionEdit.Value;
if (cbCrop.Checked)
{
_viewer.CustomSwitches.Add("-dDEVICEWIDTHPOINTS=" + ((int)(sizeWidth.Value)).ToString());
_viewer.CustomSwitches.Add("-dDEVICEHEIGHTPOINTS=" + ((int)(sizeHeight.Value)).ToString());
_viewer.CustomSwitches.Add("-dFIXEDMEDIA");
_viewer.CustomSwitches.Add(String.Format(@"-c <<
/PageOffset[{0} {1}]
>> setpagedevice", -offsetX.Value, offsetY.Value));
}
_viewer.CustomSwitches.Add("-f");
但它没有任何作用,宽度和高度受到限制,但是偏移不会发生,即我总是渲染左下角。