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

'' 少ない消費メモリ量で大規模ドキュメントを作成する方法を示します。
'' 
'' DsPdf では、PDF ファイルを作成するための2つの方法を提供しています。
'' - 通常のより便利な方法:
''   はじめに文書を完全に構築し、テキスト、グラフィックスなどの要素を追加します。
''   次に、ファイルの名前、または保存先のストリームを渡して、文書の Save() を呼び出します。
''   このアプローチでは、すでに作成されたコンテンツを変更することができます。
''   文書内の任意の場所にページを挿入したり、すでに追加されたページを変更することができます。
'' 
'' - StartDoc/EndDoc メソッド:
''   文書の StartDoc() メソッドを呼び出すことによって、文書にコンテンツを追加する前に、
''   最初に保存するストリームを提供します。すべてのコンテンツはそのストリームに直接書き込まれ、
''   元のページに戻って更新することはできません。文書を完成させるには、EndDoc() メソッドを
''   呼び出します。アクションが許可されていない場合は、例外がスローされます。
''   このアプローチは多少制限されていますが(このモードでは Linearized を true に設定することは
''   できません)、メモリ使用量が少なく、非常に大量の文書を作成する場合にとくに適しています。
'' 
'' このサンプルは、StartDoc/EndDoc アプローチを示しています。
'' 
'' 本質的に同じコードで、StartDoc/EndDoc を使用しない方法については、LargeDocument2
'' を参照してください。また、LinearizedPdf も参照してください。
Public Class StartEndDoc
    Function CreatePDF(ByVal stream As Stream) As Integer
        '' 生成するページ数を設定します。
        Dim N = Util.LargeDocumentIterations
        Dim doc = New GcPdfDocument()
        '' この呼び出しによって文書の作成が開始されます。
        doc.StartDoc(stream)
        '' テキストを保持/書式設定するための TextLayout を準備します。
        Dim tl = New TextLayout(72) With {
            .MaxWidth = doc.PageSize.Width,
            .MaxHeight = doc.PageSize.Height,
            .MarginAll = 72
        }
        tl.DefaultFormat.Font = StandardFonts.Times
        tl.DefaultFormat.FontSize = 12
        '' タイトルページの開始。
        tl.FirstLineIndent = 0
        Dim fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "yumin.ttf"))
        Dim tf0 = New TextFormat() With {.FontSize = 24, .FontBold = True, .Font = fnt}
        tl.Append(String.Format("大規模なドキュメント" + vbLf + "{0} ページのテキストデータ" + vbLf + vbLf, N), tf0)
        Dim tf1 = New TextFormat(tf0) With {.FontSize = 14, .FontItalic = True}
        tl.Append(String.Format("生成日時: {0}", Util.TimeNow()), tf1)
        tl.TextAlignment = TextAlignment.Center
        tl.PerformLayout(True)
        doc.Pages.Add().Graphics.DrawTextLayout(tl, PointF.Empty)
        tl.Clear()
        tl.FirstLineIndent = 36
        tl.TextAlignment = TextAlignment.Leading
        '' ドキュメントを生成します。
        For pageIdx = 1 To N
            tl.Append(Util.getString_ja(1, 0, 1))
            tl.PerformLayout(True)
            doc.NewPage().Graphics.DrawTextLayout(tl, PointF.Empty)
            tl.Clear()
        Next
        '' 注:StartDoc/EndDoc を使用しているときは、特定の操作(たとえば、以下の操作)でエラーが発生することがあります。
        ''     doc.Pages.Insert(0);
        '' 
        '' 終了 - Save() の代わりに EndDoc() を呼び出します。
        doc.EndDoc()
        Return doc.Pages.Count
    End Function
End Class