C#にてPDFファイルを結合

複数のPDFファイル一つのファイルにまとめるにはiTextSharpを使う。こちらを参考にさせて頂きました。これによって、結合できるがWebアプリ上でテンポラリファイルを生成とかカッコ悪い。

ということで、MemoryStreamに対応させました。が・・・copy.close時にMemoryStreamが閉じられてしまう。とりあえず、doc.close();とcopy.close();をコメントにしてみると、ファイル上で結合したものと比較して末尾が切れてる。

結局、

copy.CloseStream = false

がポイントでした。

 

        public static void fnJoinPdf(MemoryStream ms1, MemoryStream ms2, MemoryStream msJoin)
        {
            Document doc = null;    // 出力ファイルDocument
            PdfCopy copy = null;    // 出力ファイルPdfCopy
            MemoryStream[] aryMsStream = { ms1, ms2 }; // 入力ファイルを配列化
            try
            {
                //-------------------------------------------------------------------------------------
                // ファイル件数分、ファイル結合
                //-------------------------------------------------------------------------------------
                for (int i = 0; i < aryMsStream.Length; i++)
                {
                    // リーダー取得
                    PdfReader reader = new PdfReader(aryMsStream[i].ToArray());
                    // 入力ファイル1を出力ファイルの雛形にする
                    if (i == 0)
                    {
                        // Document作成
                        doc = new Document(reader.GetPageSizeWithRotation(1));
                        // 出力ファイルPdfCopy作成
                        copy = new PdfCopy(doc, msJoin);
                        copy.CloseStream = false;
                        // 出力ファイルDocumentを開く
                        doc.Open();
                        // 文章プロパティ設定
                        doc.AddKeywords((string)reader.Info["Keywords"]);
                        doc.AddAuthor((string)reader.Info["Author"]);
                        doc.AddTitle((string)reader.Info["Title"]);
                        doc.AddCreator((string)reader.Info["Creator"]);
                        doc.AddSubject((string)reader.Info["Subject"]);
                    }
                    // PDFコンテンツを取得、copyオブジェクトに追加
                    for (int iPageCnt = 1; iPageCnt <= reader.NumberOfPages; iPageCnt++)
                    {
                        PdfImportedPage page = copy.GetImportedPage(reader, iPageCnt);
                        copy.AddPage(page);
                    }
                    // フォーム入力を結合
                    PRAcroForm form = reader.AcroForm;
                    if (form != null)
                        copy.CopyAcroForm(reader);
                    // リーダーを閉じる
                    reader.Close();
                }
            }
            finally
            {
                if (copy != null)
                    copy.Close();
                if (doc != null)
                    doc.Close();
            }
        }

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です