Marcar texto en una página PDF con anotación de marcado de texto en .NET

Categoría del blog: PDF.NET

02.02.2021

La anotación de marcado de texto PDF permite marcar texto (resaltar, tachar, subrayar, subrayado ondulado) en una página PDF.
VintaSoft PDF .NET Plug-in proporciona una API que permite agregar programáticamente una anotación de marcado de texto PDF a una página PDF.
El SDK también proporciona la herramienta visual PdfTextMarkupTool, que permite marcar texto visualmente mediante la anotación Marcado de texto PDF en páginas PDF mostradas en WinForms o visores de imágenes WPF. Las anotaciones añadidas son totalmente compatibles con cualquier visor de PDF compatible con la especificación PDF.


Aquí hay un código en C# que demuestra cómo marcar texto programáticamente (resaltar, tachar, subrayar, subrayado ondulado) en una página PDF usando la anotación de marcado de texto PDF:
/// <summary>
/// Highlights specified text in PDF document.
/// </summary>
/// <param name="inputPdfFilename">The input PDF filename.</param>
/// <param name="outputPdfFilename">The output PDF filename.</param>
/// <param name="text">A text that must be highlighted.</param>
public static void HiglightTextInPdfDocument(string inputPdfFilename, string outputPdfFilename, string text)
{
    MarkupTextInPdfDocument(inputPdfFilename, outputPdfFilename, 
        Vintasoft.Imaging.Pdf.Tree.Annotations.PdfAnnotationType.Highlight, System.Drawing.Color.Orange, text);
}

/// <summary>
/// Strikeouts specified text in PDF document.
/// </summary>
/// <param name="inputPdfFilename">The input PDF filename.</param>
/// <param name="outputPdfFilename">The output PDF filename.</param>
/// <param name="text">A text that must be striked out.</param>
public static void StrikeoutTextInPdfDocument(string inputPdfFilename, string outputPdfFilename, string text)
{
    MarkupTextInPdfDocument(inputPdfFilename, outputPdfFilename, 
        Vintasoft.Imaging.Pdf.Tree.Annotations.PdfAnnotationType.StrikeOut, System.Drawing.Color.Red, text);
}

/// <summary>
/// Underlines specified text in PDF document.
/// </summary>
/// <param name="inputPdfFilename">The input PDF filename.</param>
/// <param name="outputPdfFilename">The output PDF filename.</param>
/// <param name="text">A text that must be underlined.</param>
public static void UnderlineTextInPdfDocument(string inputPdfFilename, string outputPdfFilename, string text)
{
    MarkupTextInPdfDocument(inputPdfFilename, outputPdfFilename, 
        Vintasoft.Imaging.Pdf.Tree.Annotations.PdfAnnotationType.Underline, System.Drawing.Color.Green, text);
}

/// <summary>
/// Squiggly undelines specified text in PDF document.
/// </summary>
/// <param name="inputPdfFilename">The input PDF filename.</param>
/// <param name="outputPdfFilename">The output PDF filename.</param>
/// <param name="text">A text that must be squiggly underlined.</param>
public static void SquigglyUnderlineTextInPdfDocument(string inputPdfFilename, string outputPdfFilename, string text)
{
    MarkupTextInPdfDocument(inputPdfFilename, outputPdfFilename, 
        Vintasoft.Imaging.Pdf.Tree.Annotations.PdfAnnotationType.Squiggly, System.Drawing.Color.Blue, text);
}

/// <summary>
/// Markups specified text in PDF document.
/// </summary>
/// <param name="inputPdfFilename">The input PDF filename.</param>
/// <param name="outputPdfFilename">The output PDF filename.</param>
/// <param name="color">The markup annotation color.</param>
/// <param name="annotationType">The markup annotation type.</param>
/// <param name="text">A text to markup.</param>
private static void MarkupTextInPdfDocument(
    string inputPdfFilename,
    string outputPdfFilename,
    Vintasoft.Imaging.Pdf.Tree.Annotations.PdfAnnotationType annotationType,
    System.Drawing.Color color,
    string text)
{
    // open input PDF document
    using (Vintasoft.Imaging.Pdf.PdfDocument document = new Vintasoft.Imaging.Pdf.PdfDocument(inputPdfFilename))
    {
        // for each PDF page
        foreach (Vintasoft.Imaging.Pdf.Tree.PdfPage page in document.Pages)
        {
            // extract text region of PDF page
            Vintasoft.Imaging.Text.TextRegion pageTextRegion = page.ExtractTextRegion(false);

            // search and markup all specified text on PDF page
            int index = 0;
            Vintasoft.Imaging.Text.TextRegion foundText;
            while (true)
            {
                // find next text
                foundText = pageTextRegion.FindText(text, ref index, false);
                if (foundText == null)
                    break;
                index += foundText.Symbols.Length;

                // markup found text
                MarkupText(page, foundText, annotationType, color);
            }
        }

        // save PDF document to output file
        document.SaveChanges(outputPdfFilename);
    }
}

/// <summary>
/// Markups specified text region in PDF page.
/// </summary>
/// <param name="page">The page.</param>
/// <param name="textRegion">The text region to markup.</param>
/// <param name="color">The markup annotation color.</param>
/// <param name="annotationType">The markup annotation type.</param>
private static void MarkupText(
    Vintasoft.Imaging.Pdf.Tree.PdfPage page,
    Vintasoft.Imaging.Text.TextRegion textRegion,
    Vintasoft.Imaging.Pdf.Tree.Annotations.PdfAnnotationType annotationType,
    System.Drawing.Color color)
{
    // create markup annotation of specified type
    Vintasoft.Imaging.Pdf.Tree.Annotations.PdfTextMarkupAnnotation markupAnnotation =
        new Vintasoft.Imaging.Pdf.Tree.Annotations.PdfTextMarkupAnnotation(page, annotationType);

    // set annotation properties
    markupAnnotation.SetTextRegion(textRegion);
    markupAnnotation.Color = color;
    markupAnnotation.Title = System.Environment.UserName;
    markupAnnotation.CreationDate = System.DateTime.Now;

    // generate annotation appearance
    markupAnnotation.UpdateAppearance();

    // add annotation to annotations of PDF page
    if (page.Annotations == null)
        page.Annotations = new Vintasoft.Imaging.Pdf.Tree.Annotations.PdfAnnotationList(page.Document);
    page.Annotations.Add(markupAnnotation);
}


Aquí hay un código en C# que demuestra cómo marcar texto visualmente en una página PDF que se muestra en el visor de imágenes de WinForms:
/// <summary>
/// Sets the PdfTextMarkupTool as current visual tool in specified image viewer.
/// </summary>
/// <param name="imageViewer">The image viewer.</param>
public static void SetPdfTextMarkupTool(Vintasoft.Imaging.UI.ImageViewer imageViewer)
{
    // create an instance of the PdfTextMarkupTool class
    Vintasoft.Imaging.Pdf.UI.PdfTextMarkupTool textMarkupTool = new Vintasoft.Imaging.Pdf.UI.PdfTextMarkupTool();

    // set text markup mode to "Highlight"
    textMarkupTool.MarkupMode = Vintasoft.Imaging.Pdf.UI.PdfTextMarkupToolMode.Highlight;

    // set color of markup annotation to "Orange"
    textMarkupTool.HighlightColor = System.Drawing.Color.Orange;

    // subscribe to the MarkupAnnotationCreated event
    textMarkupTool.MarkupAnnotationCreated += TextMarkupTool_MarkupAnnotationCreated;

    // get TextSelectionTool from image viewer
    Vintasoft.Imaging.UI.VisualTools.TextSelectionTool textSelectionTool = GetTextSelectionTool(imageViewer);

    // set the PdfTextMarkupTool+TextSelectionTool as visual tool of the image viewer
    imageViewer.VisualTool = new Vintasoft.Imaging.UI.VisualTools.CompositeVisualTool(textMarkupTool, textSelectionTool);
}

/// <summary>
/// Returns the text selection tool for specified image viewer.
/// </summary>
/// <param name="imageViewer">The image viewer.</param>
/// <returns>The text selection tool.</returns>
private static Vintasoft.Imaging.UI.VisualTools.TextSelectionTool GetTextSelectionTool(Vintasoft.Imaging.UI.ImageViewer imageViewer)
{
    // search a TextSelectionTool in visual tools of the image viewer
    Vintasoft.Imaging.UI.VisualTools.TextSelectionTool textSelectionTool =
        Vintasoft.Imaging.UI.VisualTools.VisualTool.FindVisualTool<Vintasoft.Imaging.UI.VisualTools.TextSelectionTool>(imageViewer.VisualTool);
    if (textSelectionTool != null)
        return textSelectionTool;

    // create an instance of text selection tool
    return new Vintasoft.Imaging.UI.VisualTools.TextSelectionTool();
}

/// <summary>
/// Handles the MarkupAnnotationCreated event of the PdfTextMarkupTool visual tool.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="Vintasoft.Imaging.Pdf.UI.PdfTextMarkupAnnotationEventArgs" /> instance containing the event data.</param>
private static void TextMarkupTool_MarkupAnnotationCreated(object sender, Vintasoft.Imaging.Pdf.UI.PdfTextMarkupAnnotationEventArgs e)
{
    // set user name as title of text markup annotation
    e.MarkupAnnotation.Title = System.Environment.UserName;
}



Además, el paquete de instalación del VintaSoft Imaging .NET SDK incluye las aplicaciones "PDF Editor Demo" y "WPF PDF Editor Demo", que permiten probar la función de marcado de texto (resaltado, tachado, subrayado y subrayado ondulado) en páginas PDF sin necesidad de programar.

Para resaltar y marcar texto usando la barra de herramientas en "VintaSoft PDF Editor Demo" es necesario:
Aquí hay una captura de pantalla que muestra cómo seleccionar y marcar texto en una página PDF usando la caja de herramientas de "VintaSoft PDF Editor Demo":



Para marcar texto seleccionado usando el menú contextual en "VintaSoft PDF Editor Demo" es necesario:
Aquí hay una captura de pantalla que muestra cómo marcar texto seleccionado en una página PDF usando el menú contextual de "VintaSoft PDF Editor Demo":