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; }
終了