public override void EnsureNoOpenRenderer() { // dispose any open renderer if (_renderer != null) { _renderer.Dispose(); _renderer = null; } }
protected override Image DoRenderPage(int pageNumber, float dpiX, float dpiY, double scaleFactor, int rotate, Action <Image> progressiveUpdate, Func <bool> cancellationCallback) { // try to render the page var image = (Bitmap)null; var newRenderer = false; Retry: try { // ensure there is a renderer if (_renderer == null) { newRenderer = true; _renderer = new GhostscriptRenderer(); DoRunInitialize(_renderer); } // clear the output buffers _renderer.StdOut.Clear(); _renderer.StdErr.Clear(); // hook up the poll event var poll = new EventHandler <CancelEventArgs>((o, e) => e.Cancel = cancellationCallback()); if (cancellationCallback != null) { _renderer.Poll += poll; } try { // hook up the progressive update event var update = new EventHandler <GhostscriptRendererEventArgs>((o, e) => { if (image == null) { progressiveUpdate(e.Image); } }); if (progressiveUpdate != null) { _renderer.Update += update; } try { // hook up the page event var page = new EventHandler <GhostscriptRendererEventArgs>((o, e) => image = e.Image); _renderer.Page += page; try { // set the page settings and run the page _renderer.Run(string.Format(CultureInfo.InvariantCulture, "<<\n/HWResolution [{0} {1}]\n/Orientation {2}\n>> setpagedevice\n", dpiX * scaleFactor, dpiY * scaleFactor, (rotate / 90) % 4)); DoRunPage(_renderer, pageNumber); } finally { // remove the page event _renderer.Page -= page; } } finally { // remove the progressive update event if (progressiveUpdate != null) { _renderer.Update -= update; } } } finally { // remove the poll event if (cancellationCallback != null) { _renderer.Poll -= poll; } } } catch (Exception) { // dispose the renderer and image EnsureNoOpenRenderer(); if (image != null) { image.Dispose(); image = null; } // try again if we used an old renderer (sometimes it fails) if (!newRenderer) { goto Retry; } // re-throw the error throw; } // ensure there is an image if (image == null) { throw new InvalidOperationException(string.Format(Resources.Document_PageNotRendered, pageNumber)); } // set the resolution and return the image image.SetResolution(dpiX, dpiY); return(image); }