我对 pdfBox API 有疑问。我正在尝试使用以下代码加密合并的 pdfdocument:这是合并/创建文档的功能 public static void fillMultipleReportsInOne(List<report> reports) throws IOException { PDFMergerUtility PDFmerger = new PDFMergerUtility(); PDDocument resultPDF = new PDDocument(); for (report report : reports) { try { PDDocument pdfDocument = PDDocument.load(new File(SRC + "test.pdf")); // get the document catalog PDAcroForm acroForm = pdfDocument.getDocumentCatalog().getAcroForm(); // as there might not be an AcroForm entry a null check is necessary setFormFields(acroForm, report.getName(), report.getArea(), report.getOperatingActivities(), report.getVocationlaSchool(), report.getWeeklyTopics()); // Save and close the filled out form. PDFmerger.appendDocument(resultPDF, pdfDocument); } catch (Exception e) { e.printStackTrace(); } } encryptPDF(resultPDF, SRC + "merged.pdf");}这是加密的功能: public static PDDocument encryptPDF(PDDocument pddocumentToEncrypt, String SRC) { // Define the length of the encryption key. // Possible values are 40 or 128 (256 will be available in PDFBox 2.0). int keyLength = 128; AccessPermission ap = new AccessPermission(); // Disable printing, everything else is allowed ap.setCanModifyAnnotations(false); ap.setCanFillInForm(false); ap.setCanModify(false); // Owner password (to open the file with all permissions) is "12345" // User password (to open the file but with restricted permissions, is empty here) StandardProtectionPolicy spp = new StandardProtectionPolicy("12334", "", ap); spp.setEncryptionKeyLength(keyLength); spp.setPermissions(ap);我的结果如下所示:结果
1 回答
FFIVE
TA贡献1797条经验 获得超6个赞
打电话
pddocumentToEncrypt.getDocumentCatalog().getAcroForm().refreshAppearances();
为 2.0 版本修复了这个问题。setValue()
当设置 /NeedAppearances 时,该版本不会在调用中设置外观(即表单值的视觉表示) (请参阅 参考资料PDTerminalField.applyChange()
)。/NeedAppearances 设置(如果为真)意味着查看应用程序应该创建外观,以便中间的处理应用程序不需要这样做;我怀疑其中一项或多项权限设置会阻止 Adobe Reader 在显示时对其进行更改。
另一种解决方案是致电
pdfDocument.getDocumentCatalog().getAcroForm().setNeedAppearances(false);
在设置表单值之前。
唯一未解之谜是为什么第一个值在合并文件中可见。
添加回答
举报
0/150
提交
取消