- 2017-2-28
- Visual C#
前回、iTextSharpの使用準備をしたので、
iTextSharp で PDFへパスワードを設定してみる。
プログラム流れ
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; }
注意:元のファイルにパスワードが設定されている場合は、エラーになります。