C# iTextSharp で 複数のPDFを結合し新しいPDFファイルを作成する。

  • デル株式会社
  • 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;
            }
    
    

    終了

    関連記事

    ページ上部へ戻る