RemoveDuplicateImages.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 System.Collections.Generic;

namespace DsPdfWeb.Demos
{
    // 同一の画像を含む PDF を結合すると、デフォルトでは、
    // 結果の PDF には同じ画像のコピーが複数含まれることになります。
    // PDF が必要以上に大きくならないようにするために、DsPdf は PDF をスキャンし、
    // 重複を見つけて削除するメソッド GcPdfDocument.RemoveDuplicateImages() を提供します。

    // MergeDocumentOptions クラスにも RemoveDuplicateImages プロパティがあります。
    // これを使用すると、PDF を結合するときに重複画像を一度にスキャン/削除できます。
    // (しかし、デフォルトでは false です。理由としては、結合された PDF で重複イメージが発生するケースは
    // 一般的ではない事、さらに重複画像のスキャンが結合のパフォーマンスに影響を与える可能性があるためです。)

    // また、重複した画像を含む複数の PDF を結合する場合は、最初にすべての PDF を結合することをお勧めします。
    // 次に、このデモで示されているように、GcPdfDocument.RemoveDuplicateImages() を 1 回呼び出すだけで、
    // 結合された PDF からすべての重複画像を一度に削除できます。
    
    // このデモでは、同じ会社ロゴを含む複数のサンプル請求書を結合します。
    // 次に、GcPdfDocument.RemoveDuplicateImages() を呼び出し、その呼び出しの前後で結果の PDF のサイズを比較します。
    
    //フォントを最適化したい場合は、
    // OptimizeFonts を参照してください。
    public class RemoveDuplicateImages
    {
        static FileStream MergePDFs(GcPdfDocument dest, string fpath)
        {
            GcPdfDocument d = new GcPdfDocument();
            var fs = File.OpenRead(fpath);
            d.Load(fs);
            dest.MergeWithDocument(d);
            return fs;
        }

        public int CreatePDF(Stream stream)
        {
            // 入力ファイル名:
            const int N = 7;
            var fpaths = new List<string>(N);
            for (int i = 1; i <= 7; i++)
                fpaths.Add(Path.Combine("Resources", "PDFs", $"DsDemoInvoice{i}.pdf"));
            // クリーンアップを促進
            var fss = new List<FileStream>();
            string tempPdfBefore = null, tempPdfAfter = null;
            try
            {
                var doc = new GcPdfDocument();
                // 請求書を 1 つの PDF に結合:
                for (int i = 0; i < N; i++)
                    fss.Add(MergePDFs(doc, fpaths[i]));

                // 重複を削除する前と後の、結合された PDF サイズを比較:
                tempPdfBefore = Path.GetTempFileName();
                doc.Save(tempPdfBefore);
                var sizeBefore = new FileInfo(tempPdfBefore).Length;
                doc.RemoveDuplicateImages();
                tempPdfAfter = Path.GetTempFileName();
                doc.Save(tempPdfAfter);
                var sizeAfter = new FileInfo(tempPdfAfter).Length;
                Common.Util.AddNote(String.Format(
                    "このドキュメント (マージによって生成された) で GcPdfDocument.RemoveDuplicateImages() メソッドを使用します。" +
                    "同じ会社ロゴを持つ複数のデモ請求書PDFのサイズが {0:N0} バイトから {1:N0} バイトに減少しました。",
                    sizeBefore, sizeAfter),
                    doc.Pages.Insert(0));
                doc.Save(stream);
                return doc.Pages.Count;
            }
            finally
            {
                if (tempPdfBefore != null)
                    File.Delete(tempPdfBefore);
                if (tempPdfAfter != null)
                    File.Delete(tempPdfAfter);
                fss.ForEach(fs_ => fs_.Dispose());
            }
        }
    }
}