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;
}
}
}