StartEndDoc.cs
// 完毕:
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
{
    // 演示如何使用更少的内存创建大型文档。
    // 
    // GcDocs.Pdf 提供两种创建 PDF 文件的方法:
    // - 通常更方便的方法:首先完全构建文档,
    //   添加文本、图形和其他元素。然后在文档上调用 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.Font = StandardFonts.Times;
            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} 页 Lorem Ipsum\n\n", N), tf0);
            var tf1 = new TextFormat(tf0) { FontSize = 14, FontItalic = true };
            tl.Append(string.Format("生成于 {0}", Common.Util.TimeNow().ToString("R")), 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.LoremIpsum(1));
                tl.PerformLayout(true);
                doc.NewPage().Graphics.DrawTextLayout(tl, PointF.Empty);
                tl.Clear();
            }
            // 注意:使用 StartDoc/EndDoc 时,某些操作(例如下面的操作)会抛出错误:
            //    doc.Pages.Insert(0);
            // 
            // 完成 - 调用 EndDoc 而不是 Save():
            doc.EndDoc();
            return doc.Pages.Count;
        }
    }
}