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