.NET のテキスト マークアップ注釈を使用して PDF ページにテキストをマークアップします

ブログ カテゴリ: PDF.NET

2021/02/02

PDF テキスト マークアップ注釈 を使用すると、PDF ページでテキストをマークアップ (強調表示、取り消し線、下線、波線) できます。
VintaSoft PDF .NET Plug-in は、プログラムによって PDF ページに PDF テキスト マークアップ注釈 を追加できる API を提供します。
また、SDKにはビジュアルツールPdfTextMarkupToolが付属しており、WinFormsまたはWPFイメージビューアで表示されたPDFページ上でPDFテキストマークアップ注釈を使用してテキストを視覚的にマークアップできます。追加された注釈は、PDF仕様に準拠したあらゆるPDFビューアと完全に互換性があります。


PDF テキスト マークアップ注釈を使用して PDF ページにプログラムでテキストをマークアップする方法 (強調表示、取り消し線、下線、波線下線) を示す C# コードを以下に示します。
/// <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);
}


WinForms イメージ ビューアーで表示された PDF ページにテキストを視覚的にマークアップする方法を示す C# コードを以下に示します。
/// <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;
}



また、VintaSoft Imaging .NET SDK インストール パッケージには、PDF エディター デモおよび WPF PDF エディター デモ アプリケーションが含まれており、テキスト マークアップ機能 (強調表示、取り消し線、

Vintasoft PDF Editor Demo のツールバーを使用してテキストを強調表示およびマークアップするには、次の操作が必要です。
以下は、Vintasoft PDF Editor Demo のツールボックスを使用して PDF ページ上のテキストを選択してマークアップする方法を示したスクリーンショットです。Vintasoft PDF Editor Demo: Select and markup text on PDF page using toolbox



Vintasoft PDF Editor Demo のコンテキスト メニューを使用して選択したテキストをマークアップするには、次の操作が必要です。
以下は、コンテキスト メニューを使用して PDF ページ上の選択したテキストをマークアップする方法を示したスクリーンショットです。 Vintasoft PDF Editor デモ: Vintasoft PDF Editor Demo: Markup selected text on PDF page using context menu