Ghostscript.NET - визуализация части документа с событиями DisplayUpdate - PullRequest
0 голосов
/ 08 ноября 2018

Класс 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");

но это не имеет никакого эффекта, ширина и высота ограничены, но смещение не имеет места, т. Е. Всегда отображается нижний левый угол.

...