FindAndRedact.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' © MESCIUS 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 内の特定のコンテンツを
'' 検索し、それを墨消しの対象としてマークする方法を示しています。
'' なお、 ApplyRedact サンプルでは、このサンプルで追加された墨消し注釈に
'' 実際にデータを消去するために墨消しを適用する方法を確認できます。
'' このサンプルで使用される 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