HousePlanAllLayers.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 

using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.Layers;
using GrapeCity.Documents.Pdf.Annotations;
using GrapeCity.Documents.Pdf.Graphics;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos
{
    // このサンプルでは、住宅の電気設計図の一部分を示した PDF のセットから、
    // マルチレイヤーの PDF ドキュメントを作成しています。
    // それぞれの PDF は別のレイヤーとして追加されます。 
    // 結果として出力された PDF では、住宅の電気配線の一部(例:空調の設定だけ、
    // コンセントだけなど)を選択的に閲覧できるオプションコンテンツ(レイヤー)を
    // 利用することができます。
    // なお、このサンプルは HousePlanLayers と似ていますが、そちらとは異なり、
    // こちらはすべてのコンテンツがレイヤーとして追加されます。(HousePlanLayersでは、
    // 「完全な電気設計図」のコンテンツはどのレイヤーにも属していません。)
    public class HousePlanAllLayers
    {
        public int CreatePDF(Stream stream)
        {
            // ドキュメントの内容がわかるファイル名部分の一覧
            var fnames = new List<(string, string)>()
            {
                ( "full_electrical_plan.pdf",      "完全な電気設計図" ),
                ( "all_outlets.pdf",               "すべてのコンセント" ),
                ( "data_plan_and_detectors.pdf",   "データプランと検知器" ),
                ( "HVAC_with_wiring.pdf",          "配線を含む空調設定" ),
                ( "lighting_plan.pdf",             "照明プラン" ),
                ( "lighting_plan_with_wiring.pdf", "配線を含む照明プラン" ),
                ( "security_system_plan.pdf",      "セキュリティシステム" )
            };
            // 共通の PDF ファイル名
            var fbase = "how_to_read_electrical_plans_";
            // PDF が配置されたディレクトリ
            var dir = Path.Combine("Resources", "PDFs");

            var doc = new GcPdfDocument();
            var page = doc.Pages.Add();
            var g = page.Graphics;
            var disposables = new List<IDisposable>();
            // すべての PDF を1ページ目のレイヤーとして1つのドキュメントにまとめます。
            for (int i = 0; i < fnames.Count; ++i)
            {
                var fname = fnames[i].Item1;
                var iname = fnames[i].Item2;
                var idoc = new GcPdfDocument();
                var ifs = File.OpenRead(Path.Combine(dir, fbase + fname));
                idoc.Load(ifs);
                disposables.Add(ifs);
                doc.OptionalContent.AddLayer(iname);
                doc.OptionalContent.SetLayerDefaultState(iname, false);
                g.BeginLayer(iname);
                g.DrawPdfPage(idoc.Pages[0], page.Bounds);
                g.EndLayer();
            }
            // 最後のレイヤーをデフォルトで表示するようにします。
            doc.OptionalContent.SetLayerDefaultState(fnames.Last().Item2, true);

            // Save the PDF:
            doc.Save(stream);

            // ファイルストリームを廃棄します。
            disposables.ForEach(d_ => d_.Dispose());
            return doc.Pages.Count;
        }
    }
}