C# iTextSharp で PDF へパスワードを設定する。

  • デル株式会社
  • 前回、iTextSharpの使用準備をしたので、
    iTextSharp で PDFへパスワードを設定してみる。

    iTextSharp を取り敢えず使うための入手と設定方法

    プログラム流れ

    1.パスワードを設定したいPDFをPdfReaderに設定
    2.元PDFファイルデータを新しいPDFとして作成しパスワードも設定。
     
     Encryptメソッドへ与えるパスワードは、byte[]で渡す。
     PdfWriter.SetEncryption の場合は、string なんだけども。

     PDFファイルのセキュリティ関連は、下記のページでざっくり記載がある。
     PDFの標準セキュリティ機能

    3.元のPDFを削除し、パスワード設定後のPDFを元のファイル名へ

    色々検索したり、ソースいじってみたりしたんだけど、
    元のPDFへ直接パスワードをかける方法が見つからなかった。。。。
    誰か知ってたら教えて欲しいっす。。

    ソース

    
    using iTextSharp.text.pdf;
    
            /// <summary>
            /// PDFファイルへパスワードを設定する
            /// </summary>
            /// <param name="sPdfPath">
            /// パスワードを設定するPDF
            /// </param>
            /// <param name="sPass1">
            /// ユーザパスワード
            /// </param>
            /// <param name="sPass2">
            /// オーナーパスワード
            /// </param>
            /// <returns>
            /// true:正常
            /// false:異常
            /// </returns> 
            private bool SetPdfPassword( string sPdfPath,
                                         string sPass1,
                                         string sPass2)
            {
                bool bRet = true;
    
                DateTime dtNow = DateTime.Now;
    
                string sLoclTm = String.Format( "{0}{1:D2}{2:D2}{3:D2}{4:D2}{5:D2}{6}", 
                                                dtNow.Year,
                                                dtNow.Month,
                                                dtNow.Day,
                                                dtNow.Hour,
                                                dtNow.Minute,
                                                dtNow.Second,
                                                dtNow.Millisecond );
    
                string sFilePath_PW = sPdfPath + "_" + sLoclTm + "_temp_pw.pdf";
    
                PdfReader objPdfReader = null;
    
                try
                {
                    byte[] byteUSER  = Encoding.ASCII.GetBytes( sPass1 ); // ユーザパスワード
                    byte[] byteOWNER = Encoding.ASCII.GetBytes( sPass2 ); // オーナーパスワード
    
    
                    // 元のファイルが存在するか?
                    if( File.Exists( sPdfPath ) == false )
                    {
                        return false;
                    }
    
                    // PDFリーダに元ファイル設定
                    objPdfReader = new PdfReader( sPdfPath );
    
                    // パスワード設定対象のPDFを作成
                    using ( Stream objStreamOutput = new FileStream( sFilePath_PW, 
                                                                     FileMode.Create, 
                                                                     FileAccess.Write, 
                                                                     FileShare.None ) )
                    {
    
                        // 元PDFファイルデータを新しいPDFとして作成しパスワードも設定する
                        PdfEncryptor.Encrypt( objPdfReader,
                                              objStreamOutput,
                                              byteUSER,
                                              byteOWNER,
                                              PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_PRINTING,
                                              PdfWriter.STRENGTH128BITS );
    
    
                    }
                    
                    objPdfReader.Close();
                    objPdfReader = null;
    
                    // 元のファイルを消してパスワード設定したファイルを元のファイル名へ
                    // 元のファイルを残す場合は、下記2行をコメント
                    File.Delete(sPdfPath);
                    File.Move(sFilePath_PW, sPdfPath);
                }
                catch ( Exception exp )
                {
                    Debug.WriteLine(exp.Message);
    
                    bRet = false;
                }
                finally
                {
                    if( objPdfReader != null )
                    {
                        objPdfReader.Close();
          
                    }
                }
    
                return bRet;
    
            }
    

    注意:元のファイルにパスワードが設定されている場合は、エラーになります。

    関連記事

    ページ上部へ戻る