1.Apache FOP1.1の新機能
Apache FOP 1.1が、ついにリリースされました。私にとって一番の目玉は、暗号化鍵の鍵長が、RC4 40bit から,高強度のRC4 128bitを利用できるようになったことです。巷には、PDFのセキュリティを解除するソフトや、オンラインのサービスが展開されていますので、PDFのパスワードの管理はしっかりしたいところです。デフォルトでは、暗号鍵の長さは、40bitなので、明示的に指定しなければなりません。図 1. EncryptPDF.javaでは、42行目で高強度のRC4 128bitを使用するようにしています。また、38行目で、印刷の品質を設定しています。「Apache™ FOP: PDF encryption.」にて、レンダラのオプションで設定できる項目が記載されています。文書を開くパスワードで、PDFを開いた場合と、権限パスワードで、PDFを開いた場合で、PDFの文書プロパティの「PDFの文書に関する制限の概要」に違いがあります。
(SyntaxHighlighterを使用して、プログラムを掲載しています。ブラウザー上で、各々の図の右上のアイコンをマウスでクリックすることで、ソースを表示したり、クリップボードにコピーしたり、印刷したりできます。注意点として、「さらに記事を読み込む」のリンクで、この記事を読み込んだ場合に、SyntaxHighlighterによる表示が不正になる場合がありますので、恐れ入りますが、タイトルをクリックして再表示して下さい。)
図 1. EncryptPDF.java
package com.wordpress.okulejp.encryptpdf; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import javax.xml.transform.Result; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamSource; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.Fop; import org.apache.fop.apps.FopFactory; import org.apache.fop.apps.MimeConstants; import org.apache.fop.pdf.PDFEncryptionParams; public class EncryptPDF { public static void main(String[] args) { OutputStream out = null; try { FopFactory fopFactory = FopFactory.newInstance(); FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); fopFactory.setUserConfig(new File("fop.xconf")); out = new FileOutputStream("src/com/wordpress/okulejp/encryptpdf/encrypt.pdf"); out = new BufferedOutputStream(out); //セキュリティ設定。 PDFEncryptionParams encryptionParams = new PDFEncryptionParams(); //文書を開くパスワード設定。 encryptionParams.setUserPassword("user"); //権限パスワード設定。 encryptionParams.setOwnerPassword("owner"); //印刷可否設定。 encryptionParams.setAllowPrint(true); //高解像度印刷可否設定。 encryptionParams.setAllowPrintHq(true); //内容のコピー可否設定。 encryptionParams.setAllowCopyContent(false); //暗号鍵の鍵長の指定。 encryptionParams.setEncryptionLengthInBits(128); //レンダラのオプションを設定する。 foUserAgent.getRendererOptions().put("encryption-params", encryptionParams); Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out); File fofile = new File("src/com/wordpress/okulejp/encryptpdf/encryptPDF.fo"); Result result = new SAXResult(fop.getDefaultHandler()); StreamSource streamSource = new StreamSource(fofile); TransformerFactory trf = TransformerFactory.newInstance(); Transformer transformer = trf.newTransformer(); //PDF出力。 transformer.transform(streamSource, result); } catch (Exception e) { e.printStackTrace(); System.exit(1); } finally { try { if (out != null) { out.close(); } } catch (IOException io) { io.printStackTrace(); System.exit(1); } } } }
図 2. encryptPDF.fo
<?xml version="1.0" encoding="Shift_JIS"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" language="ja"> <fo:layout-master-set> <fo:simple-page-master page-width="210mm" page-height="297mm" margin-top="0mm" margin-left="0mm" margin-right="0mm" margin-bottom="0mm" master-name="PageMaster"> <fo:region-body margin-top="15mm" margin-left="15mm" margin-right="15mm" margin-bottom="15mm" /> <fo:region-before extent="15mm" /> <fo:region-after extent="15mm" /> <fo:region-start extent="15mm" /> <fo:region-end extent="15mm" /> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="PageMaster"> <fo:flow flow-name="xsl-region-body"> <fo:block font-family="MS 明朝" font-size="xx-large">Hellow encrypted PDF</fo:block> </fo:flow> </fo:page-sequence> </fo:root>
図 3. 暗号化したPDF(クリックするとPDFを表示します。権限パスワードは、「owner」です。文書を開くパスワードは、「user」です。)
2.最後に
このブログ記事が、実際のシステム開発に役立った方は、ぜひいいねボタンを押してください。またコメントもよろしくお願いいたします。(コメントするのに電子メールアドレス、名前、ウェブサイトは必須ではありません。入力なしで匿名でコメント可能です。)
©中條勝徳 and okulejp.com, 2012.