TagParagraphs.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// Copyright (c) GrapeCity inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Pdf.Structure;
using GrapeCity.Documents.Pdf.MarkedContent;

namespace GcPdfWeb.Samples.Basics
{
    // このサンプルは、タグ付き(構造化)PDFを作成する方法を示しています。
    // タグを表示/閲覧するには、Adobe Acrobat Pro でドキュメントを開き、
    // [表示]-[ナビゲーションパネル]-[タグ]に移動します。
    public class TagParagraphs
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var rnd = Common.Util.NewRandom();
            int pageCount = rnd.Next(3, 7);

            // Part 要素を作成します。これには P(段落)要素が含まれます。
            StructElement sePart = new StructElement("Part");
            doc.StructTreeRoot.Children.Add(sePart);

            // いくつかのページを追加し、各ページに段落を追加してタグ付けします。
            for (int pageIndex = 0; pageIndex < pageCount; ++pageIndex)
            {
                // ページを追加します。
                var page = doc.Pages.Add();
                var g = page.Graphics;
                const float margin = 36;
                const float dy = 18;

                // いくつかの段落を追加します。
                int paraCount = rnd.Next(1, 5);
                float y = margin;
                for (int i = 0; i < paraCount; ++i)
                {
                    // 段落要素を作成します。
                    StructElement seParagraph = new StructElement("P") { DefaultPage = page };
                    // Part 要素に追加します。
                    sePart.Children.Add(seParagraph);

                    // 段落を作成します。
                    var tl = g.CreateTextLayout();
                    tl.DefaultFormat.Font = StandardFonts.Helvetica;
                    tl.DefaultFormat.FontSize = 12;
                    tl.Append(Common.Util.getString_ja(1, 0, 5,5,10));
                    tl.MaxWidth = page.Size.Width;
                    tl.MarginLeft = tl.MarginRight = margin;
                    tl.PerformLayout(true);

                    // タグ付きコンテンツ内に TextLayout を描画します。
                    g.BeginMarkedContent(new TagMcid("P", i));
                    g.DrawTextLayout(tl, new PointF(0, y));
                    g.EndMarkedContent();

                    y += tl.ContentHeight + dy;

                    // 段落の StructElement にコンテンツ項目を追加します。
                    seParagraph.ContentItems.Add(new McidContentItemLink(i));
                }
            }

            // ドキュメントをタグ付きとしてマークします。
            doc.MarkInfo.Marked = true;

            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}