VintaSoft Imaging .NET SDK 15.1: Документация для .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-контента.