kingFisherでは、Javaで生成したPDFをメール送付又は、ダウンロードできることを考えていますが、受け取り者が編集できてしまうのは具合が悪く、読み取りはフリーですが、更新は不可とするためパスワードを付与してみます。
実現するには、org.apache.pdfbox.pdmodel.encryption.AccessPermissionと、org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicyクラスを使用します。
指定方法は以下
//制限を設定
AccessPermission objAp = new AccessPermission();
objAp.setCanAssembleDocument(false);
objAp.setCanExtractContent(false);
objAp.setCanExtractForAccessibility(false);
objAp.setCanFillInForm(false);
objAp.setCanModify(false);
objAp.setCanModifyAnnotations(false);
objAp.setCanPrint(false);
objAp.setCanPrintDegraded(false);
// ap.setReadOnly();
StandardProtectionPolicy spp = new StandardProtectionPolicy("12345", "", objAp);
spp.setEncryptionKeyLength(128);
document.protect(spp);
具体例を示しますと、まず引数にファイル名を渡し、PDF生成部分を呼び出す部分
File pdfOut = new File("C:\\Work\\testpdf001secure.pdf");
createPdf(pdfOut);
呼び出されるPDF作成部分
protected void createPdf(File pdfOut) throws IOException{
// 空のドキュメントオブジェクトを作成します
try(PDDocument document = new PDDocument()) {
//制限を設定
AccessPermission objAp = new AccessPermission();
objAp.setCanAssembleDocument(false);
objAp.setCanExtractContent(false);
objAp.setCanExtractForAccessibility(false);
objAp.setCanFillInForm(false);
objAp.setCanModify(false);
objAp.setCanModifyAnnotations(false);
objAp.setCanPrint(false);
objAp.setCanPrintDegraded(false);
// ap.setReadOnly();
StandardProtectionPolicy spp = new StandardProtectionPolicy("12345", "", objAp);
spp.setEncryptionKeyLength(128);
document.protect(spp);
// 新しいページのオブジェクトを作成します
PDRectangle rectangle = PDRectangle.A4;
PDPage page = new PDPage(rectangle);
document.addPage(page);
try (TrueTypeCollection ttcG = new TrueTypeCollection(new File("C:/Windows/Fonts/msgothic.ttc"));
TrueTypeCollection ttcM = new TrueTypeCollection(new File("C:/Windows/Fonts/msmincho.ttc"))) {
TrueTypeFont ttfG = ttcG.getFontByName("MS-Gothic");
PDFont fontG = PDType0Font.load(document, ttfG, true);
TrueTypeFont ttfM = ttcM.getFontByName("MS-Mincho");
PDFont fontM = PDType0Font.load(document, ttfM, true);
try(PDPageContentStream contentStream = new PDPageContentStream(document, page)){
//文字出力
contentStream.beginText();
contentStream.setFont(fontG, 14);
contentStream.newLineAtOffset(10, rectangle.getHeight() - 40);
contentStream.showText( "この文字はフォント MSゴシックです" );
contentStream.endText();
//文字出力
contentStream.beginText();
contentStream.setFont(fontM, 14);
contentStream.newLineAtOffset(10, rectangle.getHeight() - 70);
contentStream.showText( "この文字はフォント MS明朝です" );
contentStream.endText();
}
// ドキュメントを保存します
document.save(pdfOut);
}
}
}
作成されたPDFを開きプロパティを見てみると、パスワードが設定されているのが分かります
0 件のコメント:
コメントを投稿