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;
}



También VintaSoft Imaging .El paquete de instalación de NET SDK incluye la demostración del editor de PDF y la aplicación de demostración del editor de PDF de WPF, que permite probar la función de marcado de texto (resaltado, tachado, subrayado, subrayado ondulado) en una página PDF sin necesidad de codificar.

Para resaltar y marcar texto usando la barra de herramientas en la demostración del editor de PDF de Vintasoft es necesario:
Aquí hay una captura de pantalla que demuestra cómo seleccionar y marcar texto en una página PDF usando la caja de herramientas de Vintasoft PDF Editor Demo: Demostración de Vintasoft PDF Editor: Seleccionar y marcar texto en una página PDF usando la caja de herramientas



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