FindAndRedact.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' Copyright (c) GrapeCity inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports System.Text.RegularExpressions
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.Annotations
Imports GrapeCity.Documents.Pdf.AcroForms

'' このサンプルでは、テキストマップを使用して PDF 内の特定のコンテンツを
'' 検索し、それを修正対象としてマークする(墨消しを行う)方法を示します。
'' 現在のところ、GcPdf では修正を実際に適用する(すなわち内容を削除する)
'' ことをまだ許可していないことに注意してください。ただし、リダクション注釈を
'' 列挙、追加または編集することは許可されています。
'' 結果の PDF を Acrobat にて開き、修正内容を対話的に確認して適用すること
'' ができます。
'' このサンプルで使用される PDF は TimeSheet によって作成されました。
Public Class FindAndRedact
    Public Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Using fs As New FileStream(Path.Combine("Resources", "PDFs", "TimeSheet.pdf"), FileMode.Open, FileAccess.Read)
            doc.Load(fs)

            '' メモ:Acrobat では、デジタル署名された文書に編集を適用することは許可されて
            '' いないため、まず既存の署名を見つけて削除します。
            RemoveSignatureFields(doc.AcroForm.Fields)

            '' ページをループして、短い日付のように見えるものをすべて削除します。
            For Each page In doc.Pages
                Dim tmap = page.GetTextMap()
                For Each tline In tmap
                    If (Regex.Match(tline.Text.Trim(), "\d+[/-]\w+[/-]\d").Success) Then
                        Dim redact = New RedactAnnotation() With
                            {
                                .Rect = tline.GetCoords().ToRect(),
                                .Color = Color.Red,
                                .Page = page,
                                .MarkBorderColor = Color.Red,
                                .MarkFillColor = Color.Yellow
                            }
                        '' まだ redact.Page = page を設定していない場合は、次のようにします:
                        '' page.Annotations.Add(redact);
                    End If
                Next
            Next
            '' PDF ドキュメントを保存します。
            doc.Save(stream)
            Return doc.Pages.Count
        End Using
    End Function

    '' このコードは、RemoveSignatureFields サンプルからのものです。
    Sub RemoveSignatureFields(ByVal fields As FieldCollection)
        For i = fields.Count - 1 To 0 Step -1
            RemoveSignatureFields(fields(i).Children)
            If TypeOf fields(i) Is SignatureField Then
                fields.RemoveAt(i)
            End If
        Next
    End Sub
End Class