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