top of page
執筆者の写真Kawahara

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();
            }
        }
閲覧数:832回0件のコメント

最新記事

すべて表示

Visual WebGui販売終了

GrapeCityが販売していたVisual WebGuiが2014年10月22日で販売終了との事。価格は高いが、便利なんだろうなと気になっていた製品だった。 2013年の6月から1年半弱で販売終了となったのに気付いた時は、「買わなくてよかった」と「こんなことあるの?」とい...

C#でのクラスライブラリの設計

C#でクラスライブラリを使用すると複数のプロジェクトで使用できて便利。しかし、どんな単位でクラスライブラリを分割するか悩みながらも下記のように考えていました。 外部コンポーネントの有無 DBの接続先 ODBCの設定要否 .NetframeWorkのバージョン...

Comments


bottom of page