VintaSoft Imaging .NET SDK 12.3: Documentation for .NET developer
In This Topic
    PDF: Manage rendering of PDF content
    In This Topic
    Management of PDF content rendering allows to control the rendering process of PDF page:

    To manage the rendering of PDF content it is necessary to:

    PdfContentRenderer class provides to the derived classes the following methods for overriding the rendering of content:

    Each overriden method takes the parameter context of PdfContentRenderingContext type. PdfContentRenderingContext class stores parameters of current rendering process and can be used for getting and changing parameters of current rendering process:

    Here is an example that shows how to override rendering algorithm and render PDF pages with different settings:
    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
    



    Demo applications PdfEditorDemo/PdfReaderDemo

    Demo applications PdfReaderDemo and PdfEditorDemo/WpfPdfEditorDemo allow to manage the rendering process of PDF pages (enable/disable drawing of text, images, graphics, etc) and contain source codes of the custom PDF content renderer.