コード例 #1
0
ファイル: Document.cs プロジェクト: Meitinger/PdfKit
 public override void EnsureNoOpenRenderer()
 {
     // dispose any open renderer
     if (_renderer != null)
     {
         _renderer.Dispose();
         _renderer = null;
     }
 }
コード例 #2
0
ファイル: Document.cs プロジェクト: Meitinger/PdfKit
            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);
            }