FindTransformed.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © 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
{
    // このサンプルは、Transforms サンプルで作成された PDF ファイルを読み込み、読み込まれた
    // ドキュメントの文字列がすべて見つかった場合にそれらをハイライト表示します。
    // このサンプルにおける2つのポイント:
    //   - 元の文書のテキストは図形的に変換されますが、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("座標", 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);
                        }
                    }
                }
                // PDF ドキュメントを保存します。
                doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}