HousePlanAllLayers.cs
//
// This code is part of Document Solutions for PDF demos.
// Copyright (c) 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
{
    // This sample creates a multi-layer PDF document from a set of PDFs
    // each of which shows a certain part of an electrical plan of a house.
    // Each PDF is added as a separate layer. The resulting PDF provides
    // optional content that allows the user to selectively see parts of
    // the electrical wiring of a house (e.g. just the HVAC setup, or
    // just the outlets, etc.).
    // Note that this example is similar to HousePlanLayers, but unlike
    // that sample, here ALL content is added as layers (in HousePlanLayers,
    // the full electrical plan content does not belong to any layer).
    public class HousePlanAllLayers
    {
        public int CreatePDF(Stream stream)
        {
            // The list of PDF names' parts identifying their semantics:
            var fnames = new List<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",
            };
            // The common base name:
            var fbase = "how_to_read_electrical_plans_";
            // The directory containing the PDFs:
            var dir = Path.Combine("Resources", "PDFs");

            var doc = new GcPdfDocument();
            var page = doc.Pages.Add();
            var g = page.Graphics;
            var disposables = new List<IDisposable>();
            // Combine all PDFs into a single document as layers on the first page:
            for (int i = 0; i < fnames.Count; ++i)
            {
                var iname = fnames[i];
                var idoc = new GcPdfDocument();
                var ifs = File.OpenRead(Path.Combine(dir, fbase + iname));
                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();
            }
            // Make the last layer visible by default:
            doc.OptionalContent.SetLayerDefaultState(fnames.Last(), true);

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

            // Dispose file streams:
            disposables.ForEach(d_ => d_.Dispose());
            return doc.Pages.Count;
        }
    }
}