StrikeoutParagraph.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using System.Linq;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.TextMap;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Pdf.Annotations;
using System.Threading;
using System.Collections.Generic;
using GrapeCity.Documents.Common;

namespace DsPdfWeb.Demos
{
    // このサンプルでは、テキストマークアップ注釈の取り消し線を使用して、
    // 特定のフレーズ「Several species」で始まる段落を取り消し表示する方法を紹介しています。
    public class StrikeoutParagraph
    {
        public int CreatePDF(Stream stream)
        {
            // PDF を読み込みます。
            var doc = new GcPdfDocument();
            using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "Wetlands.pdf"));
            doc.Load(fs);

            // 「Several species」で始まる最初の段落を取り消し表示します。
            ITextParagraph para = null;
            foreach (var p in doc.Pages)
            {
                var paras = p.GetTextMap().Paragraphs;
                para = paras.FirstOrDefault(p_ => p_.GetText().StartsWith("Several species"));
                if (para != null)
                    break;
            }
            if (para == null)
                return doc.Pages.Count; // 発生しないはず

            // テキストマークアップ注釈の取り消し線を追加します。
            var markup = new TextMarkupAnnotation()
            {
                Page = para.Page,
                MarkupType = TextMarkupType.StrikeOut,
                Color = Color.Red
            };

            // 段落内のすべてのテキストフラグメントの座標を取得し、
            // 注釈領域に追加します。
            List<Quadrilateral> area = new List<Quadrilateral>();
            foreach (var run in para.Runs)
            {
                foreach (var frag in run)
                {
                    // テキストフラグメントのインデックスを取得します。
                    int index = 0;
                    var line = frag.Line;
                    var frags = line.RunFragments;
                    for (int i = 0; i < frags.Count && frags[i] != frag; ++i)
                        index += frags[i].Count;
                    // フラグメントの座標(四角形)を注釈領域に追加します。
                    area.Add(frag.Line.GetCoords(index, frag.Count));
                }
            }
            markup.Area = area;

            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}