複数の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();
}
}
Comments