PageFormXObject.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' © MESCIUS inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports System.Numerics
Imports System.Collections.Generic
Imports System.Linq
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.Annotations
Imports GrapeCity.Documents.Pdf.Graphics

'' このサンプルは、一時的な GcPdfDocument に読み込まれた PDF から
'' ページを表す FormXObject を作成し、そのオブジェクトを現在のドキュメントに
'' 描画する方法を示します。
Public Class PageFormXObject
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim g = page.Graphics

        Dim rc = Util.AddNote(
            "下のサムネイルは既存の文書からのページを表します。" +
            "任意の PDF を一時的な GcPdfDocument に読み込み、その各ページを" +
            "表す FormXObject を作成し、それらのオブジェクトを現在の文書に" +
            "サムネイルとしてレンダリングします。同じ FormXObject を複数回" +
            "使用できることを示すために、ミラー変換を適用して各サムネイルを" +
            "2回レンダリングします。",
            page)

        '' レイアウトのパラメータ。
        Dim margin = rc.Left
        Dim pad = 36
        Dim side = (page.Size.Width - margin * 2 - pad) / 2
        Dim ip = New PointF(margin, rc.Bottom + pad)
        '' ミラー変換。
        Dim tr = Matrix3x2.CreateScale(-1, 1) * Matrix3x2.CreateTranslation(page.Size.Width, 0)
        '' オーバーレイされたページキャプションのテキスト形式です。
        Dim clr = Color.DarkRed
        Dim tf = New TextFormat() With
        {
            .Font = StandardFonts.HelveticaBold,
            .FontSize = 16,
            .ForeColor = Color.FromArgb(128, clr)
        }
        '' 任意の PDF を開き、それを一時的なドキュメントに読み込んでページをループし、
        '' それぞれを現在のドキュメントに描画します。
        Using fs = New FileStream(Path.Combine("Resources", "PDFs", "Wetlands.pdf"), FileMode.Open, FileAccess.Read)
            Dim doc1 = New GcPdfDocument()
            doc1.Load(fs)
            '' 読み込まれた PDF のページ用の FormXObject のリストを作成します。
            Dim fxos = New List(Of FormXObject)()
            doc1.Pages.ToList().ForEach(Sub(p_) fxos.Add(New FormXObject(doc, p_)))
            '' 現在のドキュメント内にサムネイルを描画します。
            For i = 0 To fxos.Count - 1
                If (ip.Y + side > page.Size.Height - margin) Then
                    page = doc.NewPage()
                    g = page.Graphics
                    ip = New PointF(margin, margin)
                End If
                Dim rcfx = New RectangleF(ip.X, ip.Y, side, side)
                '' そのまま描画します。
                g.DrawForm(fxos(i), rcfx, Nothing, ImageAlign.ScaleImage)
                g.DrawRectangle(rcfx, clr)
                g.DrawString($"Page {i + 1}", tf, rcfx, TextAlignment.Center, ParagraphAlignment.Center, False)
                '' 反転して描画します。
                g.Transform = tr
                g.DrawForm(fxos(i), rcfx, Nothing, ImageAlign.ScaleImage)
                g.DrawRectangle(rcfx, clr)
                g.Transform = Matrix3x2.Identity
                rcfx.Offset(side + pad, 0)
                g.DrawString($"Reversed page {i + 1}", tf, rcfx, TextAlignment.Center, ParagraphAlignment.Center, False)
                ''
                ip.Y += side + pad
            Next
        End Using
        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class