FindTransformed.cs
// 完毕:
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
{
    // 此示例​​加载由Transforms示例创建的PDF文件,
    // 查找加载文档中所有出现的字符串,
    // 并强调这些事件。该样本有两点值得关注:
    // - 原始文档中的文本经过图形转换,
    //   但是 FindText 方法提供的四边形可以让您轻松
    //   即使在这种情况下也要突出显示发现。
    // - 该示例在页面的索引 0 处插入新的内容流,
    //   这可确保突出显示在原始内容下绘制。
    //   (可以使用相同的方法向现有文件添加水印等。)
    public class FindTransformed
    {
        public int CreatePDF(Stream stream)
        {
            // 在处理加载的 PDF 时,原始文件流必须保持打开状态,
            // 详情请参阅@{LoadPDF}:
            using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "Transforms.pdf"));
            var doc = new GcPdfDocument();
            doc.Load(fs);
            // 使用区分大小写的搜索查找所有“文本绘制于”:
            var finds = doc.FindText(
                new FindTextParams("Text drawn at", false, true),
                OutputRange.All);

            // 突出显示所有找到的内容:首先,查找找到该文本的所有页面
            var pgIndices = finds.Select(f_ => f_.PageIndex).Distinct();
            // 循环页面,在每个页面上在索引 0 处插入一个新的内容流,
            // 这样我们的亮点就在原始内容之下:
            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)
                    {
                        // 注意用于填充多边形的纯色:
                        g.FillPolygon(ql, Color.CadetBlue);
                        g.DrawPolygon(ql, Color.Blue);
                    }
                }
            }
            // 完毕:
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}