Класс 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");
но это не имеет никакого эффекта, ширина и высота ограничены, но смещение не имеет места, т. Е. Всегда отображается нижний левый угол.