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

'' このサンプルは、PDF/A-3u に準拠したドキュメントを作成する方法を示します。
Public Class PdfA
    Sub CreatePDF(ByVal stream As Stream)
        Dim doc = New GcPdfDocument()
        Dim thedate = New DateTime(1961, 4, 12, 6, 7, 0, DateTimeKind.Utc)

        '' ドキュメントを PDF/A-3u 準拠としてマークします。
        doc.ConformanceLevel = PdfAConformanceLevel.PdfA3u

        Dim fnt = Font.FromFile(Path.Combine("Resources", "Fonts", "arial.ttf"))
        Dim gap = 36

        '' PDF/A-3a では、すべてのコンテンツにタグを付ける必要があるため、描画時に StructElement を作成してデータを入力します。
        Dim sePart = New StructElement("Part")
        doc.StructTreeRoot.Children.Add(sePart)

        Dim tl As TextLayout = Nothing
        '' PDF/A 規格に従ってタグ付けされたサンプルコンテンツを持つ3つのページを追加します。
        For pageNo = 1 To 3
            '' add page
            Dim Page = doc.Pages.Add()
            Dim g = Page.Graphics
            Dim y = 72.0F
            If doc.Pages.Count = 1 Then
                '' 段落要素を作成します。
                Dim seParagraph = New StructElement("P") With {.DefaultPage = Page}
                '' Part 要素に追加します。
                sePart.Children.Add(seParagraph)

                tl = g.CreateTextLayout()
                tl.MarginAll = 72
                tl.MaxWidth = Page.Size.Width

                tl.DefaultFormat.Font = fnt
                tl.DefaultFormat.FontBold = True
                tl.DefaultFormat.FontSize = 20
                tl.Append("PDF/A-3A ドキュメント")

                '' PerformLayout は、新規 TextLayout 内あるいは Clear() メソッドの呼び出し後に自動的に実行されます。
                '' tl.PerformLayout(true);

                '' タグ付けされたコンテンツ内に TextLayout を描画します。
                g.BeginMarkedContent(New TagMcid("P", 0))
                g.DrawTextLayout(tl, PointF.Empty)
                g.EndMarkedContent()

                y = tl.ContentRectangle.Bottom + gap

                seParagraph.ContentItems.Add(New McidContentItemLink(0))
            End If

            '' PDF/A 規格に従ってタグ付けされたいくつかのサンプル段落を追加します。
            For i = 1 To 3
                '' 段落要素を作成します。
                Dim seParagraph = New StructElement("P") With {.DefaultPage = Page}
                '' Part 要素に追加します。
                sePart.Children.Add(seParagraph)

                Dim sb = New StringBuilder()
                sb.Append(String.Format("ページ {1} 上の段落 {0}: ", i, pageNo))
                sb.Append(Environment.NewLine)
                sb.Append(Util.getString_ja(0, 1, 2, 3, 6))
                Dim para = sb.ToString()

                tl.Clear()
                tl.DefaultFormat.FontSize = 14
                tl.DefaultFormat.FontBold = False
                tl.MarginTop = y
                tl.Append(para)

                '' PDF/A 規格に従ってタグ付けされたいくつかのサンプル段落を追加します。
                g.BeginMarkedContent(New TagMcid("P", i))
                g.DrawTextLayout(tl, PointF.Empty)
                g.EndMarkedContent()

                y += tl.ContentHeight + gap

                '' 段落の StructElement にコンテンツ項目を追加します。
                seParagraph.ContentItems.Add(New McidContentItemLink(i))

                '' PDF/A-3 ではファイルをドキュメントに埋め込むことができますが、いずれかのドキュメント要素に関連付ける必要があります。
                '' seParagraph に関連付けられた埋め込みファイルを追加します。
                Dim ef1 = EmbeddedFileStream.FromBytes(doc, Encoding.UTF8.GetBytes(para))
                '' PDF/A の場合は、ModificationDate と MimeType を指定する必要があります。
                ef1.ModificationDate = thedate
                ef1.MimeType = "text/plain"
                Dim fn = String.Format("ページ{0}_段落{1}.txt", pageNo, i)
                Dim fs1 = FileSpecification.FromEmbeddedStream(fn, ef1)
                '' PDF/A の場合は、Relationship を指定する必要があります。
                fs1.Relationship = AFRelationship.Unspecified
                doc.EmbeddedFiles.Add(fn, fs1)
                seParagraph.AssociatedFiles.Add(fs1)
            Next
        Next

        '' PDF/A-3 では、PDF ファイルに透過描画を行うことができます。いくつか追加します。
        Dim gpage = doc.Pages(0).Graphics
        gpage.FillRectangle(New RectangleF(20, 20, 200, 200), Color.FromArgb(40, Color.Red))

        '' PDF/A-3 では、FormXObjects を使用できます。透過したものを追加します。
        Dim r = New RectangleF(0, 0, 144, 72)
        Dim fxo = New FormXObject(doc, r)
        Dim gfxo = fxo.Graphics
        gfxo.FillRectangle(r, Color.FromArgb(40, Color.Violet))
        Dim tf = New TextFormat() With
            {
                .Font = fnt,
                .FontSize = 16,
                .ForeColor = Color.FromArgb(100, Color.Black)
            }
        gfxo.DrawString("FormXObject", tf, r, TextAlignment.Center, ParagraphAlignment.Center)
        gfxo.DrawRectangle(r, Color.Blue, 3)
        gpage.DrawForm(fxo, New RectangleF(300, 250, r.Width, r.Height), Nothing, ImageAlign.ScaleImage)

        '' PDF/A-3 ではファイルをドキュメントに埋め込むことができますが、いずれかのドキュメント要素に関連付ける必要があります。
        Dim ef = EmbeddedFileStream.FromFile(doc, Path.Combine("Resources", "WordDocs", "ProcurementLetter.docx"))
        '' PDF/A の場合は、EmbeddedFile に対して ModificationDate と MimeType を指定する必要があります。
        ef.ModificationDate = thedate
        ef.MimeType = "application/msword"
        Dim fs = FileSpecification.FromEmbeddedFile(ef)
        fs.Relationship = AFRelationship.Unspecified
        doc.EmbeddedFiles.Add("ProcurementLetter.docx", fs)
        '' 埋め込みファイルをドキュメントに関連付けます。
        doc.AssociatedFiles.Add(fs)

        '' 注釈に関連付けられた添付ファイルを追加します。
        Dim sa = New StampAnnotation() With
            {
                .UserName = "Minerva",
                .Font = fnt,
                .Rect = New RectangleF(300, 36, 220, 72)
            }
        sa.Flags = sa.Flags And AnnotationFlags.Print
        '' スタンプ注釈を表す FormXObject を使用します。
        Dim stampFxo = New FormXObject(doc, New RectangleF(PointF.Empty, sa.Rect.Size))
        Dim gstampFxo = stampFxo.Graphics
        gstampFxo.FillRectangle(stampFxo.Bounds, Color.FromArgb(40, Color.Green))
        gstampFxo.DrawString("minerva.jpg に関連する" + vbLf + "スタンプ注釈", tf, stampFxo.Bounds, TextAlignment.Center, ParagraphAlignment.Center)
        gstampFxo.DrawRectangle(stampFxo.Bounds, Color.Green, 3)
        ''
        sa.AppearanceStreams.Normal.Default = stampFxo
        doc.Pages(0).Annotations.Add(sa)
        ef = EmbeddedFileStream.FromFile(doc, Path.Combine("Resources", "Images", "minerva.jpg"))
        ef.ModificationDate = thedate
        ef.MimeType = "image/jpeg"
        fs = FileSpecification.FromEmbeddedFile(ef)
        fs.Relationship = AFRelationship.Unspecified
        doc.EmbeddedFiles.Add("minerva.jpg", fs)
        sa.AssociatedFiles.Add(fs)

        '' タグ付き PDF の規則に準拠しているとしてドキュメントにマークします(PDF/A の場合は必須です)。
        doc.MarkInfo.Marked = True

        '' PDF/A ドキュメントの場合、Metadata.CreatorTool と DocumentInfo.Creator は同じである必要があります。
        doc.Metadata.CreatorTool = doc.DocumentInfo.Creator
        '' PDF/A ドキュメントにはタイトルを指定する必要があります。
        doc.Metadata.Title = "GcPdf ドキュメント"
        doc.ViewerPreferences.DisplayDocTitle = True

        '' PDF ドキュメントを保存します。
        doc.Save(stream)
    End Sub
End Class