iTextSharp で 複数のPDFファイルを結合するプログラム。
結合したい用途は結構有るんじゃないかと。
今回は、ディレクトリに格納されている全てのPDFを結合するプログラム。
プログラム流れ
1.結合対象のPDFが格納されているディレクトリを検索し、PDFファイルのリストを作成
2.リストを元にPDFを結合し出力する。
【余談】
今回は、結合後のPDFを作成するために、「PdfCopy」を使用しています。
「PdfWriter」でもできるんですが、サイズの違うPDF(例えばA4とハガキサイズとか)を結合する時に、
指定サイズより小さいPDFが指定サイズの背景に重なる形で結合されました。
毎回、サイズ指定すれば良いのだと考えましたが、「PdfCopy」の方が簡単だった。。
ソース
using System;
using System.IO;
using System.Diagnostics;
using System.Text;
using System.Collections.Generic;
using iTextSharp.text;
using iTextSharp.text.pdf;
private void button1_Click(object sender, EventArgs e)
{
string sOutPDFPath = @"D:\PdfFileDir\結合後ファイル.pdf";
string sDir = @"D:\PdfFileDir";
List<string> sStrList = new List<string>();
// PDFファイルのリスト取得
if ( GetAllFileList(sDir, "*.pdf", ref sStrList ) == false)
{
//なんか失敗
return;
}
// PDFファイル結合処理
if( JoinPdf(sOutPDFPath, sStrList) == false )
{
//なんか失敗
return;
}
}
/// <summary>
/// リスト内のPDFを結合しPDFを作成する
/// </summary>
/// <param name="sOutPDFPath">
/// 結合後のPDFファイルパス(フルパス)
/// </param>
/// <param name="sStrList">
/// 結合対象のPDFファイルパスを格納したリスト
/// </param>
/// <returns>
/// true:正常
/// false:異常
/// </returns>
private bool JoinPdf( string sOutPDFPath, List<string> sStrList )
{
bool bRet = true;
Document objITextDoc = null;
PdfCopy objPDFCopy = null;
try
{
objITextDoc = new Document();
objPDFCopy = new PdfCopy( objITextDoc, new FileStream( sOutPDFPath, FileMode.Create ) );
objITextDoc.Open();
// 出力するPDFのプロパティを設定
objITextDoc.AddKeywords("キーワードです。");
objITextDoc.AddAuthor ("zero0nine.com");
objITextDoc.AddTitle ("結合したPDFファイルです。");
objITextDoc.AddCreator ("PDFファイル結合くん");
objITextDoc.AddSubject ("結合したPDFファイル");
// ソートが必要ない場合は、コメント
sStrList.Sort();
// 結合対象ファイル分ループ
sStrList.ForEach( sPdfList =>
{
Debug.WriteLine(sPdfList);
PdfReader objPdfReader = new PdfReader(sPdfList); // 結合元のPDFファイル読込
objPDFCopy.AddDocument( objPdfReader ); // 結合元のPDFファイルを追加(全ページ)
objPdfReader.Close();
});
}
catch (Exception exp)
{
Debug.WriteLine(exp.Message);
bRet = false;
}
finally
{
objITextDoc.Close();
objPDFCopy.Close();
}
return bRet;
}
/// <summary>
/// 指定ディレクトリのファイルリストを返却する
/// </summary>
/// <param name="sDirPath">
/// 検索対象のディレクトリ
/// </param>
/// <param name="searchPattern">
/// 検索文字列(*.pdf など)
/// </param>
/// <param name="sStrList">
/// 返却用のListオブジェクト List<string[]>
/// xmlxmlxml</param>
/// <returns>
/// true:正常
/// false:以上
/// </returns>
public bool GetAllFileList( string sDirPath,
string searchPattern,
ref List<string> sStrList)
{
bool bRet = true;
IEnumerable<string> sFiles;
try
{
// ディレクトリのファイル一覧取得
sFiles = Directory.EnumerateFiles( sDirPath, searchPattern );
foreach (string currentFile in sFiles)
{
sStrList.Add(currentFile);
Debug.WriteLine(currentFile);
}
}
catch (Exception e)
{
Debug.WriteLine(e.Message);
bRet = false;
}
return bRet;
}
終了











