FindTransformed.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 System.Linq;
- using GrapeCity.Documents.Common;
- using GrapeCity.Documents.Pdf;
- using GrapeCity.Documents.Text;
-
- namespace DsPdfWeb.Demos
- {
- // This sample loads the PDF file created by the Transforms sample,
- // finds all occurrences of a string in the loaded document,
- // and highlights these occurrences. Two points of interest about this sample:
- // - The texts in the original document are graphically transformed,
- // but the quadrilaterals supplied by the FindText method allows you to easily
- // highlight the finds even in that case.
- // - The sample inserts a new content stream at index 0 of the page,
- // this ensures that the highlighting is drawn UNDER the original content.
- // (The same approach may be used to add watermarks etc. to existing files.)
- public class FindTransformed
- {
- public int CreatePDF(Stream stream)
- {
- // The original file stream must be kept open while working with the loaded PDF,
- // see @{LoadPDF} for details:
- using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "Transforms.pdf"));
- var doc = new GcPdfDocument();
- doc.Load(fs);
- // Find all 'Text drawn at', using case-sensitive search:
- var finds = doc.FindText(
- new FindTextParams("Text drawn at", false, true),
- OutputRange.All);
-
- // Highlight all finds: first, find all pages where the text was found
- var pgIndices = finds.Select(f_ => f_.PageIndex).Distinct();
- // Loop through pages, on each page insert a new content stream at index 0,
- // so that our highlights go UNDER the original content:
- foreach (int pgIdx in pgIndices)
- {
- var page = doc.Pages[pgIdx];
- PageContentStream pcs = page.ContentStreams.Insert(0);
- var g = pcs.GetGraphics(page);
- foreach (var find in finds.Where(f_ => f_.PageIndex == pgIdx))
- {
- foreach (var ql in find.Bounds)
- {
- // Note the solid color used to fill the polygon:
- g.FillPolygon(ql, Color.CadetBlue);
- g.DrawPolygon(ql, Color.Blue);
- }
- }
- }
- // Done:
- doc.Save(stream);
- return doc.Pages.Count;
- }
- }
- }
-