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

namespace DsPdfWeb.Demos
{
    // このサンプルは、PDF内の特定のURLへのすべてのリンクを検索して削除する方法を示します。  
    // まず、削除対象のURLを指す ActionURI を持つすべてのリンク注釈を検索し、  
    // 次に redaction を使用して、見つかったリンク領域内のすべてのコンテンツを消去します。  
    // redaction には赤いオーバーレイが使用され、消去された領域を視覚的に示します。  
    //
    // このサンプルで使用されるPDF(リンクがそのままの状態のもの)は、FindAndHighlight サンプルで確認できます。
    public class RedactLinks
    {
        public int CreatePDF(Stream stream)
        {
            // 削除する必要があるリンクを含むPDFを読み込みます。
            var doc = new GcPdfDocument();
            using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "fendo-13-1005722.pdf"));
            doc.Load(fs);

            // "frontiersin.org"を含むすべてのリンクを削除します。
            const string targetUrl = "frontiersin.org";

            // 関連するリンクの注釈をすべて検索します。
            var linkAnnotations = new HashSet<LinkAnnotation>();
            foreach (var page in doc.Pages)
            {
                foreach (var a in page.Annotations)
                {
                    if (a is LinkAnnotation la && la.Action is ActionURI actUri)
                    {
                        if (!string.IsNullOrEmpty(actUri.URI) && actUri.URI.Contains(targetUrl))
                        {
                            linkAnnotations.Add(la);
                        }
                    }
                }
            }
            // 見つかったリンクをループし、それぞれに注釈を追加します。
            foreach (var la in linkAnnotations)
            {
                foreach (var page in la.Pages)
                {
                    // ループで注釈を追加できるようにするには、page.Annotations のコピーを作成する必要があります。
                    var annots = page.Annotations.Where(a_ => a_ == la).ToList();
                    foreach (var a in annots)
                    {
                        page.Annotations.Add(new RedactAnnotation()
                        {
                            Rect = la.Rect,
                            OverlayFillColor = Color.Red
                        });
                    }
                }
            }
            // 編集を適用します。
            doc.Redact();

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