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

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