MarkupPerWord.cs
- //
- // This code is part of Document Solutions for PDF demos.
- // Copyright (c) MESCIUS inc. All rights reserved.
- //
- using System;
- using System.IO;
- using System.Drawing;
- using GrapeCity.Documents.Pdf;
- using GrapeCity.Documents.Text;
- using GrapeCity.Documents.Pdf.Annotations;
- using System.Collections.Generic;
- using GrapeCity.Documents.Pdf.TextMap;
- using GrapeCity.Documents.Common;
-
- namespace DsPdfWeb.Demos
- {
- // This example shows how to find all occurrences of two words in a PDF document and
- // highlight each of those words with different color using text markup highlight annotations.
- // Points of interest in this code:
- // - We use separate FindText() calls for each word. To speed up the searches,
- // for each page we cache the text map and reuse it in the two FindText() calls.
- // While the performance improvement is minor in the case of two words, it would
- // be significant if the task were to find multiple words (e.g. when building a word index,
- // as illustrated in the WordIndex example which uses a similar approach.
- // - In order to highlight each of the two words using a different color,
- // on each page we create one highlight markup annotation per word.
- public class MarkupPerWord
- {
- public int CreatePDF(Stream stream)
- {
- const string word0 = "JavaScript";
- const string word1 = "framework";
-
- // Load the PDF:
- var doc = new GcPdfDocument();
- using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "CompleteJavaScriptBook.pdf"));
- doc.Load(fs);
-
- // A FindTextParams for each of the search words:
- var ft0 = new FindTextParams(word0, wholeWord: false, matchCase: false, regex: false);
- var ft1 = new FindTextParams(word1, wholeWord: false, matchCase: false, regex: false);
-
- // Find and highlight words on the pages, caching and reusing the text map
- // of each page for the two searches:
- foreach (var p in doc.Pages)
- {
- // Find and highlight the first word:
- var textMap = p.GetTextMap();
- TextMarkupAnnotation markup0 = null;
- List<Quadrilateral> area0 = null;
- textMap.FindText(ft0, fp_ => {
- markup0 ??= new TextMarkupAnnotation()
- {
- Subject = word0,
- Page = doc.Pages[fp_.PageIndex],
- MarkupType = TextMarkupType.Highlight,
- Color = Color.Cyan
- };
- area0 ??= new List<Quadrilateral>();
- foreach (var b in fp_.Bounds)
- area0.Add(b);
- });
- if (markup0 != null)
- markup0.Area = area0;
-
- // Find and highlight the second word:
- TextMarkupAnnotation markup1 = null;
- List<Quadrilateral> area1 = null;
- textMap.FindText(ft1, fp_ => {
- markup1 ??= new TextMarkupAnnotation()
- {
- Subject = word1,
- Page = doc.Pages[fp_.PageIndex],
- MarkupType = TextMarkupType.Highlight,
- Color = Color.Fuchsia
- };
- area1 ??= new List<Quadrilateral>();
- foreach (var b in fp_.Bounds)
- area1.Add(b);
- });
- if (markup1 != null)
- markup1.Area = area1;
- }
-
- // Done:
- doc.Save(stream);
- return doc.Pages.Count;
- }
- }
- }
-