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

namespace DsPdfWeb.Demos
{
    // このサンプルは、複数の既存の PDF を1つのドキュメントに結合する方法を示します。
    // GcPdfDocument.MergeWithDocument() メソッドにてこの機能が提供されており、
    // 別の PDF のすべてまたは一部のページを現在のドキュメントに挿入することができます。
    // この例では、フォーマットの異なる複数の文書を結合して、1つの PDF ファイルを出力します。
    public class MergePDFs
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();

            using (var fs0 = new FileStream(Path.Combine("Resources", "PDFs", "diodocs_catalog.pdf"), FileMode.Open, FileAccess.Read))
            using (var fs1 = new FileStream(Path.Combine("Resources", "PDFs", "diodocs_a4_full.pdf"), FileMode.Open, FileAccess.Read))
            using (var fs2 = new FileStream(Path.Combine("Resources", "PDFs", "diodocs_pricelist.pdf"), FileMode.Open, FileAccess.Read))
            using (var image = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "PDFMerges.png")))
            {
                doc.Load(fs0);
                // 以降で追加されるナビゲーションリンクのページカウントを保存します。
                var pgNo = doc.Pages.Count;
                var doc1 = new GcPdfDocument();
                doc1.Load(fs1);
                doc.MergeWithDocument(doc1, new MergeDocumentOptions());
                var doc2 = new GcPdfDocument();
                doc2.Load(fs2);
                doc.MergeWithDocument(doc2, new MergeDocumentOptions());

                // ドキュメントの先頭にノートを挿入します。
                var page = doc.Pages.Insert(0);
                var rc = Common.Util.AddNote(
                    "複数の PDF ファイルを読み込み、それらを結合するサンプルです。\n" +
                    "結合した文書に表紙を追加し、結果を1つのファイルとして保存しています。\n" +
                    "また、このメモをクリックすると、2番目の文書の最初のページにジャンプします。\n" +
                    "GcPdfDocument.MergeWithDocument() メソッドを使用すると、現在の文書に別の文書の\n" +
                    "全ページまたは一部のページを追加可能です。\n",
                    page);

                var g = page.Graphics;
                var imageRc = new RectangleF((page.Size.Width - 432) / 2, page.Size.Height / 3, 432, 308);
                g.DrawImage(image, imageRc, null, GCDRAW.ImageAlign.ScaleImage);

                // 2つ目のドキュメントの最初のページにメモを追加します。
                page.Annotations.Add(new LinkAnnotation(rc, new DestinationFit(pgNo + 1)));
                // 終了(ソースが破棄される前にターゲット文書を保存する必要があります)。
                doc.Save(stream);
            }
            return doc.Pages.Count;
        }
    }
}