VintaSoft Imaging .NET SDK 14.0: Документация для .NET разработчика
В этом разделе
    PDF: Управление рендерингом PDF-контента
    В этом разделе
    Управление рендерингом PDF-контента позволяет контролировать процесс рендеринга PDF страницы:
    Для управления процессом рендеринга PDF-контента необходимо:
    Класс PdfContentRenderer предоставляет производным классам следующие методы для переопределения процесса рендеринга PDF-контента:
    Каждый переопределенный метод принимает параметр 'context' типа PdfContentRenderingContext. Класс PdfContentRenderingContext хранит параметры текущего процесса рендеринга и может быть использован для получения и изменения параметров рендеринга:
    Вот C#/VB.NET код, который демонстрирует, как переопределить алгоритм рендеринга и выводить PDF страницы с различными настройками:
    class PdfContentRendererExample
    {
        /// <summary>
        /// Shows how manage rendering of PDF page, i.e. render PDF page without images,
        /// render PDF page without text, etc
        /// </summary>
        /// <param name="pdfFilename">The filename of PDF document.</param>
        public static void TestCustomContentRenderer(string pdfFilename)
        {
            // output TIFF file name format string
            string outputFileName = System.IO.Path.Combine(
                System.IO.Path.GetDirectoryName(pdfFilename), 
                System.IO.Path.GetFileNameWithoutExtension(pdfFilename));
            outputFileName = outputFileName + "_{0}.tif";
    
            // custom renderer
            CustomContentRenderer renderer;
    
            // create image collection
            using (Vintasoft.Imaging.ImageCollection images = 
                new Vintasoft.Imaging.ImageCollection())
            {
                // open source PDF file
                images.Add(pdfFilename);
    
                // render PDF pages without images
                renderer = new CustomContentRenderer();
                renderer.DrawImages = false;
                RenderPdfUseContentRenderer(images, string.Format(outputFileName, "withoutImages"), renderer);
    
                // render PDF pages and invert rendered images
                renderer = new CustomContentRenderer();
                renderer.ImageProcessing = new Vintasoft.Imaging.ImageProcessing.Color.InvertCommand();
                RenderPdfUseContentRenderer(images, string.Format(outputFileName, "invertImages"), renderer);
    
                // render PDF pages without path filling
                renderer = new CustomContentRenderer();
                renderer.FillAreaUseShadingPatterns = false;
                renderer.FillPaths = false;
                renderer.FillPathsUseShadingPatterns = false;
                renderer.FillPathsUseTilingPatterns = false;
                RenderPdfUseContentRenderer(images, string.Format(outputFileName, "withoutFillPath"), renderer);
    
                // render PDF pages without path drawing
                renderer = new CustomContentRenderer();
                renderer.DrawPaths = false;
                RenderPdfUseContentRenderer(images, string.Format(outputFileName, "withoutDrawPath"), renderer);
    
                // render PDF pages without text
                renderer = new CustomContentRenderer();
                renderer.DrawText = false;
                RenderPdfUseContentRenderer(images, string.Format(outputFileName, "withoutText"), renderer);
    
                // clear image collection and dispose images
                images.ClearAndDisposeItems();
            }
        }
    
        /// <summary>
        /// Renders the PDF file using specified content renderer.
        /// </summary>
        /// <param name="images">The images to render.</param>
        /// <param name="outputTiffFileName">Name of the output tiff file.</param>
        /// <param name="renderer">The renderer.</param>
        public static void RenderPdfUseContentRenderer(
            Vintasoft.Imaging.ImageCollection images,
            string outputTiffFileName,
            Vintasoft.Imaging.Pdf.PdfContentRenderer renderer)
        {
            // create PDF rendering settings
            Vintasoft.Imaging.Codecs.Decoders.PdfRenderingSettings settings = 
                new Vintasoft.Imaging.Codecs.Decoders.PdfRenderingSettings();
            // specify the custom PDF content renderer
            settings.ContentRenderer = renderer;
            // specify PDF rendering settings for images (PDF pages)
            images.SetRenderingSettings(settings);
    
            // create TIFF encoder
            using (Vintasoft.Imaging.Codecs.Encoders.TiffEncoder encoder = 
                new Vintasoft.Imaging.Codecs.Encoders.TiffEncoder())
                // save PDF pages to a TIFF file
                images.SaveSync(outputTiffFileName, encoder);
        }
    
    
        /// <summary>
        /// Provides functionality for overriding algorithms of PDF content rendering.
        /// </summary>
        public class CustomContentRenderer : Vintasoft.Imaging.Pdf.PdfContentRenderer
        {
    
            #region Fields
    
            /// <summary>
            /// Determines that string is drawing.
            /// </summary>
            bool _stringDrawing = false;
    
            #endregion
    
    
    
            #region Properties
    
            bool _drawAnnotations = true;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must draw
            /// annotations on PDF page.
            /// </summary>
            public bool DrawAnnotations
            {
                get
                {
                    return _drawAnnotations;
                }
                set
                {
                    _drawAnnotations = value;
                }
            }
    
            bool _drawForms = true;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must draw
            /// form XObjects on PDF page.
            /// </summary>
            public bool DrawForms
            {
                get
                {
                    return _drawForms;
                }
                set
                {
                    _drawForms = value;
                }
            }
    
            bool _drawImages = true;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must draw
            /// images on PDF page.
            /// </summary>
            public bool DrawImages
            {
                get
                {
                    return _drawImages;
                }
                set
                {
                    _drawImages = value;
                }
            }
    
            bool _drawInlineImages = true;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must draw
            /// inline images on PDF page.
            /// </summary>
            public bool DrawInlineImages
            {
                get
                {
                    return _drawInlineImages;
                }
                set
                {
                    _drawInlineImages = value;
                }
            }
    
            bool _drawPaths = true;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must draw
            /// graphics paths on PDF page.
            /// </summary>
            public bool DrawPaths
            {
                get
                {
                    return _drawPaths;
                }
                set
                {
                    _drawPaths = value;
                }
            }
    
            bool _fillPaths = true;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must fill
            /// graphics paths on PDF page.
            /// </summary>
            public bool FillPaths
            {
                get
                {
                    return _fillPaths;
                }
                set
                {
                    _fillPaths = value;
                }
            }
    
            bool _fillPathsUseTilingPatterns = true;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must fill
            /// graphics paths use tiling patterns on PDF page.
            /// </summary>
            public bool FillPathsUseTilingPatterns
            {
                get
                {
                    return _fillPathsUseTilingPatterns;
                }
                set
                {
                    _fillPathsUseTilingPatterns = value;
                }
            }
    
            bool _fillPathsUseShadingPatterns = true;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must fill
            /// graphics paths use shading patterns on PDF page.
            /// </summary>
            public bool FillPathsUseShadingPatterns
            {
                get
                {
                    return _fillPathsUseShadingPatterns;
                }
                set
                {
                    _fillPathsUseShadingPatterns = value;
                }
            }
    
    
            bool _fillAreaUseShadingPatterns = true;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must fill
            /// all visible area use tiling patterns on PDF page.
            /// </summary>
            public bool FillAreaUseShadingPatterns
            {
                get
                {
                    return _fillAreaUseShadingPatterns;
                }
                set
                {
                    _fillAreaUseShadingPatterns = value;
                }
            }
    
            bool _drawText = true;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must draw
            /// text on PDF page.
            /// </summary>
            public bool DrawText
            {
                get
                {
                    return _drawText;
                }
                set
                {
                    _drawText = value;
                }
            }
    
            bool _drawInvisibleText = false;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must draw
            /// invisible text on PDF page.
            /// </summary>
            public bool DrawInvisibleText
            {
                get
                {
                    return _drawInvisibleText;
                }
                set
                {
                    _drawInvisibleText = value;
                }
            }
    
            bool _setClipPaths = true;
            /// <summary>
            /// Gets or sets a value indicating whether the renderer must set
            /// clip paths.
            /// </summary>
            public bool SetClipPaths
            {
                get
                {
                    return _setClipPaths;
                }
                set
                {
                    _setClipPaths = value;
                }
            }
    
            float _linesWeigth = 1;
            /// <summary>
            /// Gets or sets the lines weigth, in percents.
            /// </summary>
            public float LinesWeigth
            {
                get
                {
                    return _linesWeigth;
                }
                set
                {
                    _linesWeigth = value;
                }
            }
    
            Vintasoft.Imaging.ImageProcessing.ProcessingCommandBase _imageProcessing = null;
            /// <summary>
            /// Gets or sets the image processing command that apply
            /// before an image draws on PDF page.
            /// </summary>
            public Vintasoft.Imaging.ImageProcessing.ProcessingCommandBase ImageProcessing
            {
                get
                {
                    return _imageProcessing;
                }
                set
                {
                    _imageProcessing = value;
                }
            }
    
            #endregion
    
    
    
            #region Methods
    
            /// <summary>
            /// Draws a text string.
            /// </summary>
            /// <param name="context">The rendering context.</param>
            /// <param name="charCodes">The codes, in font encoding, of text characters.</param>
            public override void DrawString(Vintasoft.Imaging.Pdf.PdfContentRenderingContext context, ulong[] charCodes)
            {
                // if text must be drawn AND text is visible
                if (_drawText && context.GraphicsState.TextRenderingMode != 
                    Vintasoft.Imaging.Text.TextRenderingMode.Invisible)
                {
                    _stringDrawing = true;
                    base.DrawString(context, charCodes);
                    _stringDrawing = false;
                }
                // if invisible text must be drawn AND text is invisible
                else if (_drawInvisibleText && context.GraphicsState.TextRenderingMode == 
                    Vintasoft.Imaging.Text.TextRenderingMode.Invisible)
                {
                    context.GraphicsState.TextRenderingMode = Vintasoft.Imaging.Text.TextRenderingMode.Fill;
                    base.DrawString(context, charCodes);
                    context.GraphicsState.TextRenderingMode = Vintasoft.Imaging.Text.TextRenderingMode.Invisible;
                }
            }
    
            /// <summary>
            /// Draws path using specified pen.
            /// </summary>
            /// <param name="context">The rendering context.</param>
            /// <param name="path">The path to draw.</param>
            /// <param name="pen">The pen to use for drawing path.</param>
            public override void DrawPath(
                Vintasoft.Imaging.Pdf.PdfContentRenderingContext context,
                Vintasoft.Imaging.Drawing.IGraphicsPath path,
                Vintasoft.Imaging.Drawing.IDrawingPen pen)
            {
                // if path must be drawn
                if ((_drawPaths && !_stringDrawing) || (_drawText && _stringDrawing))
                {
                    // if path is not a path of text symbol
                    if (_linesWeigth != 1 && !_stringDrawing)
                    {
                        float oldWidth = pen.Width;
                        pen.Width *= _linesWeigth;
                        base.DrawPath(context, path, pen);
                        pen.Width = oldWidth;
                    }
                    else
                    {
                        base.DrawPath(context, path, pen);
                    }
                }
            }
    
            /// <summary>
            /// Fills path using specified brush.
            /// </summary>
            /// <param name="context">The rendering context.</param>
            /// <param name="path">The path to fill.</param>
            /// <param name="brush">The brush to use for filling path.</param>
            public override void FillPath(
                Vintasoft.Imaging.Pdf.PdfContentRenderingContext context,
                Vintasoft.Imaging.Drawing.IGraphicsPath path,
                Vintasoft.Imaging.Drawing.IDrawingBrush brush)
            {
                // if path must be filled
                if ((_fillPaths && !_stringDrawing) || (_drawText && _stringDrawing))
                    base.FillPath(context, path, brush);
            }
    
            /// <summary>
            /// Fills path using specified pattern.
            /// </summary>
            /// <param name="context">The rendering context.</param>
            /// <param name="path">The path to fill.</param>
            /// <param name="pattern">The pattern to use for filling path.</param>
            public override void FillPath(
                Vintasoft.Imaging.Pdf.PdfContentRenderingContext context,
                Vintasoft.Imaging.Drawing.IGraphicsPath path,
                Vintasoft.Imaging.Pdf.Tree.Patterns.PdfGraphicalPattern pattern)
            {
                if (!_fillPathsUseShadingPatterns && pattern is Vintasoft.Imaging.Pdf.Tree.Patterns.ShadingPattern)
                    return;
                if (!_fillPathsUseTilingPatterns && pattern is Vintasoft.Imaging.Pdf.Tree.Patterns.TilingPattern)
                    return;
                base.FillPath(context, path, pattern);
            }
    
            /// <summary>
            /// Fills all visible areas using specified shading pattern.
            /// </summary>
            /// <param name="context">The rendering context.</param>
            /// <param name="shadingPattern">The shading pattern.</param>
            public override void FillArea(
                Vintasoft.Imaging.Pdf.PdfContentRenderingContext context,
                Vintasoft.Imaging.Pdf.Tree.ShadingPatterns.PdfShadingPattern shadingPattern)
            {
                if (_fillAreaUseShadingPatterns)
                    base.FillArea(context, shadingPattern);
            }
    
            /// <summary>
            /// Draws a form XObject.
            /// </summary>
            /// <param name="context">The rendering context.</param>
            /// <param name="formResource">The form XObject to draw.</param>
            public override void DrawFormXObject(
                Vintasoft.Imaging.Pdf.PdfContentRenderingContext context,
                Vintasoft.Imaging.Pdf.Tree.PdfFormXObjectResource formResource)
            {
                if (_drawForms)
                    base.DrawFormXObject(context, formResource);
            }
    
            /// <summary>
            /// Draws an annotation.
            /// </summary>
            /// <param name="context">The rendering context.</param>
            /// <param name="annotation">The annotation to draw.</param>
            /// <param name="appearanceForm">The annotation appearance form.</param>
            public override void DrawAnnotation(
                Vintasoft.Imaging.Pdf.PdfContentRenderingContext context,
                Vintasoft.Imaging.Pdf.Tree.Annotations.PdfAnnotation annotation,
                Vintasoft.Imaging.Pdf.Tree.PdfFormXObjectResource appearanceForm)
            {
                if (_drawAnnotations)
                    base.DrawAnnotation(context, annotation, appearanceForm);
            }
    
            /// <summary>
            /// Intersects current clip region with specified clip path.
            /// </summary>
            /// <param name="context">The rendering context.</param>
            /// <param name="clipPath">The clip path.</param>
            public override void IntersectClip(
                Vintasoft.Imaging.Pdf.PdfContentRenderingContext context,
                Vintasoft.Imaging.Drawing.IGraphicsPath clipPath)
            {
                if (_setClipPaths)
                    base.IntersectClip(context, clipPath);
            }
    
            /// <summary>
            /// Draws an image resource.
            /// </summary>
            /// <param name="context">The rendering context.</param>
            /// <param name="imageResource">The image XObject resource to draw.</param>
            public override void DrawImageResource(
                Vintasoft.Imaging.Pdf.PdfContentRenderingContext context,
                Vintasoft.Imaging.Pdf.Tree.PdfImageResource imageResource)
            {
                if (!_drawImages && !imageResource.IsInline)
                    return;
                if (!_drawInlineImages && imageResource.IsInline)
                    return;
                base.DrawImageResource(context, imageResource);
            }
    
            /// <summary>
            /// Draws an image.
            /// </summary>
            /// <param name="context">The rendering context.</param>
            /// <param name="image">The image to draw.</param>
            /// <param name="points">Array of three System.Drawing.PointF structures that
            /// define a parallelogram on rendering content where image must be drawn.</param>
            public override void DrawImage(
                Vintasoft.Imaging.Pdf.PdfContentRenderingContext context,
                Vintasoft.Imaging.VintasoftImage image,
                System.Drawing.PointF[] points)
            {
                // if image must be processed
                if (ImageProcessing != null &&
                    ImageProcessing.IsPixelFormatSupported(image.PixelFormat))
                {
                    lock (image)
                        using (Vintasoft.Imaging.VintasoftImage tempImage = ImageProcessing.Execute(image))
                            base.DrawImage(context, tempImage, points);
                }
                else
                {
                    base.DrawImage(context, image, points);
                }
            }
    
            /// <summary>
            /// Creates a new object that is a copy of this instance.
            /// </summary>
            /// <returns>
            /// A new object that is a copy of this instance.
            /// </returns>
            public override object Clone()
            {
                CustomContentRenderer result = new CustomContentRenderer();
    
                result._drawAnnotations = _drawAnnotations;
                result._drawForms = _drawForms;
                result._drawImages = _drawImages;
                result._drawInlineImages = _drawInlineImages;
                result._drawInvisibleText = _drawInvisibleText;
                result._drawPaths = _drawPaths;
                result._drawText = _drawText;
                result._fillAreaUseShadingPatterns = _fillAreaUseShadingPatterns;
                result._fillPaths = _fillPaths;
                result._fillPathsUseShadingPatterns = _fillPathsUseShadingPatterns;
                result._fillPathsUseTilingPatterns = _fillPathsUseTilingPatterns;
                if (_imageProcessing != null)
                    result._imageProcessing = 
                        (Vintasoft.Imaging.ImageProcessing.ProcessingCommandBase)_imageProcessing.Clone();
                result._linesWeigth = _linesWeigth;
                result._setClipPaths = _setClipPaths;
    
                return result;
            }
    
            #endregion
    
        }
    
    }
    
    Class PdfContentRendererExample
        ''' <summary>
        ''' Shows how manage rendering of PDF page, i.e. render PDF page without images,
        ''' render PDF page without text, etc
        ''' </summary>
        ''' <param name="pdfFilename">The filename of PDF document.</param>
        Public Shared Sub TestCustomContentRenderer(pdfFilename As String)
            ' output TIFF file name format string
            Dim outputFileName As String = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(pdfFilename), System.IO.Path.GetFileNameWithoutExtension(pdfFilename))
            outputFileName = outputFileName & "_{0}.tif"
    
            ' custom renderer
            Dim renderer As CustomContentRenderer
    
            ' create image collection
            Using images As New Vintasoft.Imaging.ImageCollection()
                ' open source PDF file
                images.Add(pdfFilename)
    
                ' render PDF pages without images
                renderer = New CustomContentRenderer()
                renderer.DrawImages = False
                RenderPdfUseContentRenderer(images, String.Format(outputFileName, "withoutImages"), renderer)
    
                ' render PDF pages and invert rendered images
                renderer = New CustomContentRenderer()
                renderer.ImageProcessing = New Vintasoft.Imaging.ImageProcessing.Color.InvertCommand()
                RenderPdfUseContentRenderer(images, String.Format(outputFileName, "invertImages"), renderer)
    
                ' render PDF pages without path filling
                renderer = New CustomContentRenderer()
                renderer.FillAreaUseShadingPatterns = False
                renderer.FillPaths = False
                renderer.FillPathsUseShadingPatterns = False
                renderer.FillPathsUseTilingPatterns = False
                RenderPdfUseContentRenderer(images, String.Format(outputFileName, "withoutFillPath"), renderer)
    
                ' render PDF pages without path drawing
                renderer = New CustomContentRenderer()
                renderer.DrawPaths = False
                RenderPdfUseContentRenderer(images, String.Format(outputFileName, "withoutDrawPath"), renderer)
    
                ' render PDF pages without text
                renderer = New CustomContentRenderer()
                renderer.DrawText = False
                RenderPdfUseContentRenderer(images, String.Format(outputFileName, "withoutText"), renderer)
    
                ' clear image collection and dispose images
                images.ClearAndDisposeItems()
            End Using
        End Sub
    
        ''' <summary>
        ''' Renders the PDF file using specified content renderer.
        ''' </summary>
        ''' <param name="images">The images to render.</param>
        ''' <param name="outputTiffFileName">Name of the output tiff file.</param>
        ''' <param name="renderer">The renderer.</param>
        Public Shared Sub RenderPdfUseContentRenderer(images As Vintasoft.Imaging.ImageCollection, outputTiffFileName As String, renderer As Vintasoft.Imaging.Pdf.PdfContentRenderer)
            ' create PDF rendering settings
            Dim settings As New Vintasoft.Imaging.Codecs.Decoders.PdfRenderingSettings()
            ' specify the custom PDF content renderer
            settings.ContentRenderer = renderer
            ' specify PDF rendering settings for images (PDF pages)
            images.SetRenderingSettings(settings)
    
            ' create TIFF encoder
            Using encoder As New Vintasoft.Imaging.Codecs.Encoders.TiffEncoder()
                ' save PDF pages to a TIFF file
                images.SaveSync(outputTiffFileName, encoder)
            End Using
        End Sub
    
    
        ''' <summary>
        ''' Provides functionality for overriding algorithms of PDF content rendering.
        ''' </summary>
        Public Class CustomContentRenderer
            Inherits Vintasoft.Imaging.Pdf.PdfContentRenderer
    
            #Region "Fields"
    
            ''' <summary>
            ''' Determines that string is drawing.
            ''' </summary>
            Private _stringDrawing As Boolean = False
    
            #End Region
    
    
    
            #Region "Properties"
    
            Private _drawAnnotations As Boolean = True
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must draw
            ''' annotations on PDF page.
            ''' </summary>
            Public Property DrawAnnotations() As Boolean
                Get
                    Return _drawAnnotations
                End Get
                Set
                    _drawAnnotations = value
                End Set
            End Property
    
            Private _drawForms As Boolean = True
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must draw
            ''' form XObjects on PDF page.
            ''' </summary>
            Public Property DrawForms() As Boolean
                Get
                    Return _drawForms
                End Get
                Set
                    _drawForms = value
                End Set
            End Property
    
            Private _drawImages As Boolean = True
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must draw
            ''' images on PDF page.
            ''' </summary>
            Public Property DrawImages() As Boolean
                Get
                    Return _drawImages
                End Get
                Set
                    _drawImages = value
                End Set
            End Property
    
            Private _drawInlineImages As Boolean = True
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must draw
            ''' inline images on PDF page.
            ''' </summary>
            Public Property DrawInlineImages() As Boolean
                Get
                    Return _drawInlineImages
                End Get
                Set
                    _drawInlineImages = value
                End Set
            End Property
    
            Private _drawPaths As Boolean = True
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must draw
            ''' graphics paths on PDF page.
            ''' </summary>
            Public Property DrawPaths() As Boolean
                Get
                    Return _drawPaths
                End Get
                Set
                    _drawPaths = value
                End Set
            End Property
    
            Private _fillPaths As Boolean = True
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must fill
            ''' graphics paths on PDF page.
            ''' </summary>
            Public Property FillPaths() As Boolean
                Get
                    Return _fillPaths
                End Get
                Set
                    _fillPaths = value
                End Set
            End Property
    
            Private _fillPathsUseTilingPatterns As Boolean = True
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must fill
            ''' graphics paths use tiling patterns on PDF page.
            ''' </summary>
            Public Property FillPathsUseTilingPatterns() As Boolean
                Get
                    Return _fillPathsUseTilingPatterns
                End Get
                Set
                    _fillPathsUseTilingPatterns = value
                End Set
            End Property
    
            Private _fillPathsUseShadingPatterns As Boolean = True
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must fill
            ''' graphics paths use shading patterns on PDF page.
            ''' </summary>
            Public Property FillPathsUseShadingPatterns() As Boolean
                Get
                    Return _fillPathsUseShadingPatterns
                End Get
                Set
                    _fillPathsUseShadingPatterns = value
                End Set
            End Property
    
    
            Private _fillAreaUseShadingPatterns As Boolean = True
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must fill
            ''' all visible area use tiling patterns on PDF page.
            ''' </summary>
            Public Property FillAreaUseShadingPatterns() As Boolean
                Get
                    Return _fillAreaUseShadingPatterns
                End Get
                Set
                    _fillAreaUseShadingPatterns = value
                End Set
            End Property
    
            Private _drawText As Boolean = True
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must draw
            ''' text on PDF page.
            ''' </summary>
            Public Property DrawText() As Boolean
                Get
                    Return _drawText
                End Get
                Set
                    _drawText = value
                End Set
            End Property
    
            Private _drawInvisibleText As Boolean = False
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must draw
            ''' invisible text on PDF page.
            ''' </summary>
            Public Property DrawInvisibleText() As Boolean
                Get
                    Return _drawInvisibleText
                End Get
                Set
                    _drawInvisibleText = value
                End Set
            End Property
    
            Private _setClipPaths As Boolean = True
            ''' <summary>
            ''' Gets or sets a value indicating whether the renderer must set
            ''' clip paths.
            ''' </summary>
            Public Property SetClipPaths() As Boolean
                Get
                    Return _setClipPaths
                End Get
                Set
                    _setClipPaths = value
                End Set
            End Property
    
            Private _linesWeigth As Single = 1
            ''' <summary>
            ''' Gets or sets the lines weigth, in percents.
            ''' </summary>
            Public Property LinesWeigth() As Single
                Get
                    Return _linesWeigth
                End Get
                Set
                    _linesWeigth = value
                End Set
            End Property
    
            Private _imageProcessing As Vintasoft.Imaging.ImageProcessing.ProcessingCommandBase = Nothing
            ''' <summary>
            ''' Gets or sets the image processing command that apply
            ''' before an image draws on PDF page.
            ''' </summary>
            Public Property ImageProcessing() As Vintasoft.Imaging.ImageProcessing.ProcessingCommandBase
                Get
                    Return _imageProcessing
                End Get
                Set
                    _imageProcessing = value
                End Set
            End Property
    
            #End Region
    
    
    
            #Region "Methods"
    
            ''' <summary>
            ''' Draws a text string.
            ''' </summary>
            ''' <param name="context">The rendering context.</param>
            ''' <param name="charCodes">The codes, in font encoding, of text characters.</param>
            Public Overrides Sub DrawString(context As Vintasoft.Imaging.Pdf.PdfContentRenderingContext, charCodes As ULong())
                ' if text must be drawn AND text is visible
                If _drawText AndAlso context.GraphicsState.TextRenderingMode <> Vintasoft.Imaging.Text.TextRenderingMode.Invisible Then
                    _stringDrawing = True
                    MyBase.DrawString(context, charCodes)
                    _stringDrawing = False
                ' if invisible text must be drawn AND text is invisible
                ElseIf _drawInvisibleText AndAlso context.GraphicsState.TextRenderingMode = Vintasoft.Imaging.Text.TextRenderingMode.Invisible Then
                    context.GraphicsState.TextRenderingMode = Vintasoft.Imaging.Text.TextRenderingMode.Fill
                    MyBase.DrawString(context, charCodes)
                    context.GraphicsState.TextRenderingMode = Vintasoft.Imaging.Text.TextRenderingMode.Invisible
                End If
            End Sub
    
            ''' <summary>
            ''' Draws path using specified pen.
            ''' </summary>
            ''' <param name="context">The rendering context.</param>
            ''' <param name="path">The path to draw.</param>
            ''' <param name="pen">The pen to use for drawing path.</param>
            Public Overrides Sub DrawPath(context As Vintasoft.Imaging.Pdf.PdfContentRenderingContext, path As Vintasoft.Imaging.Drawing.IGraphicsPath, pen As Vintasoft.Imaging.Drawing.IDrawingPen)
                ' if path must be drawn
                If (_drawPaths AndAlso Not _stringDrawing) OrElse (_drawText AndAlso _stringDrawing) Then
                    ' if path is not a path of text symbol
                    If _linesWeigth <> 1 AndAlso Not _stringDrawing Then
                        Dim oldWidth As Single = pen.Width
                        pen.Width *= _linesWeigth
                        MyBase.DrawPath(context, path, pen)
                        pen.Width = oldWidth
                    Else
                        MyBase.DrawPath(context, path, pen)
                    End If
                End If
            End Sub
    
            ''' <summary>
            ''' Fills path using specified brush.
            ''' </summary>
            ''' <param name="context">The rendering context.</param>
            ''' <param name="path">The path to fill.</param>
            ''' <param name="brush">The brush to use for filling path.</param>
            Public Overrides Sub FillPath(context As Vintasoft.Imaging.Pdf.PdfContentRenderingContext, path As Vintasoft.Imaging.Drawing.IGraphicsPath, brush As Vintasoft.Imaging.Drawing.IDrawingBrush)
                ' if path must be filled
                If (_fillPaths AndAlso Not _stringDrawing) OrElse (_drawText AndAlso _stringDrawing) Then
                    MyBase.FillPath(context, path, brush)
                End If
            End Sub
    
            ''' <summary>
            ''' Fills path using specified pattern.
            ''' </summary>
            ''' <param name="context">The rendering context.</param>
            ''' <param name="path">The path to fill.</param>
            ''' <param name="pattern">The pattern to use for filling path.</param>
            Public Overrides Sub FillPath(context As Vintasoft.Imaging.Pdf.PdfContentRenderingContext, path As Vintasoft.Imaging.Drawing.IGraphicsPath, pattern As Vintasoft.Imaging.Pdf.Tree.Patterns.PdfGraphicalPattern)
                If Not _fillPathsUseShadingPatterns AndAlso TypeOf pattern Is Vintasoft.Imaging.Pdf.Tree.Patterns.ShadingPattern Then
                    Return
                End If
                If Not _fillPathsUseTilingPatterns AndAlso TypeOf pattern Is Vintasoft.Imaging.Pdf.Tree.Patterns.TilingPattern Then
                    Return
                End If
                MyBase.FillPath(context, path, pattern)
            End Sub
    
            ''' <summary>
            ''' Fills all visible areas using specified shading pattern.
            ''' </summary>
            ''' <param name="context">The rendering context.</param>
            ''' <param name="shadingPattern">The shading pattern.</param>
            Public Overrides Sub FillArea(context As Vintasoft.Imaging.Pdf.PdfContentRenderingContext, shadingPattern As Vintasoft.Imaging.Pdf.Tree.ShadingPatterns.PdfShadingPattern)
                If _fillAreaUseShadingPatterns Then
                    MyBase.FillArea(context, shadingPattern)
                End If
            End Sub
    
            ''' <summary>
            ''' Draws a form XObject.
            ''' </summary>
            ''' <param name="context">The rendering context.</param>
            ''' <param name="formResource">The form XObject to draw.</param>
            Public Overrides Sub DrawFormXObject(context As Vintasoft.Imaging.Pdf.PdfContentRenderingContext, formResource As Vintasoft.Imaging.Pdf.Tree.PdfFormXObjectResource)
                If _drawForms Then
                    MyBase.DrawFormXObject(context, formResource)
                End If
            End Sub
    
            ''' <summary>
            ''' Draws an annotation.
            ''' </summary>
            ''' <param name="context">The rendering context.</param>
            ''' <param name="annotation">The annotation to draw.</param>
            ''' <param name="appearanceForm">The annotation appearance form.</param>
            Public Overrides Sub DrawAnnotation(context As Vintasoft.Imaging.Pdf.PdfContentRenderingContext, annotation As Vintasoft.Imaging.Pdf.Tree.Annotations.PdfAnnotation, appearanceForm As Vintasoft.Imaging.Pdf.Tree.PdfFormXObjectResource)
                If _drawAnnotations Then
                    MyBase.DrawAnnotation(context, annotation, appearanceForm)
                End If
            End Sub
    
            ''' <summary>
            ''' Intersects current clip region with specified clip path.
            ''' </summary>
            ''' <param name="context">The rendering context.</param>
            ''' <param name="clipPath">The clip path.</param>
            Public Overrides Sub IntersectClip(context As Vintasoft.Imaging.Pdf.PdfContentRenderingContext, clipPath As Vintasoft.Imaging.Drawing.IGraphicsPath)
                If _setClipPaths Then
                    MyBase.IntersectClip(context, clipPath)
                End If
            End Sub
    
            ''' <summary>
            ''' Draws an image resource.
            ''' </summary>
            ''' <param name="context">The rendering context.</param>
            ''' <param name="imageResource">The image XObject resource to draw.</param>
            Public Overrides Sub DrawImageResource(context As Vintasoft.Imaging.Pdf.PdfContentRenderingContext, imageResource As Vintasoft.Imaging.Pdf.Tree.PdfImageResource)
                If Not _drawImages AndAlso Not imageResource.IsInline Then
                    Return
                End If
                If Not _drawInlineImages AndAlso imageResource.IsInline Then
                    Return
                End If
                MyBase.DrawImageResource(context, imageResource)
            End Sub
    
            ''' <summary>
            ''' Draws an image.
            ''' </summary>
            ''' <param name="context">The rendering context.</param>
            ''' <param name="image">The image to draw.</param>
            ''' <param name="points">Array of three System.Drawing.PointF structures that
            ''' define a parallelogram on rendering content where image must be drawn.</param>
            Public Overrides Sub DrawImage(context As Vintasoft.Imaging.Pdf.PdfContentRenderingContext, image As Vintasoft.Imaging.VintasoftImage, points As System.Drawing.PointF())
                ' if image must be processed
                If ImageProcessing IsNot Nothing AndAlso ImageProcessing.IsPixelFormatSupported(image.PixelFormat) Then
                    SyncLock image
                        Using tempImage As Vintasoft.Imaging.VintasoftImage = ImageProcessing.Execute(image)
                            MyBase.DrawImage(context, tempImage, points)
                        End Using
                    End SyncLock
                Else
                    MyBase.DrawImage(context, image, points)
                End If
            End Sub
    
            ''' <summary>
            ''' Creates a new object that is a copy of this instance.
            ''' </summary>
            ''' <returns>
            ''' A new object that is a copy of this instance.
            ''' </returns>
            Public Overrides Function Clone() As Object
                Dim result As New CustomContentRenderer()
    
                result._drawAnnotations = _drawAnnotations
                result._drawForms = _drawForms
                result._drawImages = _drawImages
                result._drawInlineImages = _drawInlineImages
                result._drawInvisibleText = _drawInvisibleText
                result._drawPaths = _drawPaths
                result._drawText = _drawText
                result._fillAreaUseShadingPatterns = _fillAreaUseShadingPatterns
                result._fillPaths = _fillPaths
                result._fillPathsUseShadingPatterns = _fillPathsUseShadingPatterns
                result._fillPathsUseTilingPatterns = _fillPathsUseTilingPatterns
                If _imageProcessing IsNot Nothing Then
                    result._imageProcessing = DirectCast(_imageProcessing.Clone(), Vintasoft.Imaging.ImageProcessing.ProcessingCommandBase)
                End If
                result._linesWeigth = _linesWeigth
                result._setClipPaths = _setClipPaths
    
                Return result
            End Function
    
            #End Region
    
        End Class
    
    End Class
    



    Демо приложения PdfEditorDemo/PdfReaderDemo

    Демо приложения PdfReaderDemo и PdfEditorDemo/WpfPdfEditorDemo позволяют управлять процессом рендеринга PDF страниц (включать/выключать отрисовку текста, изображений, графики и т.д.) и содержат исходные коды пользовательского рендерера PDF-контента.