我正在使用 Apache PDFBox库以可填写的PDF格式(AcroFrom)填写信息。完成信息填写后,我需要写一个新的PDF文件(以不可编辑的格式)。
我尝试了setReadOnly()方法,该方法在AccessPermission类中可用。但我仍然可以编辑新创建的PDF文档中的值。
代码:
private static PDDocument _pdfDocument;
public static void main(String[] args) {
String originalPdf = "C:/sample/Original.pdf";
String targetPdf = "C:/sample/target.pdf";
try {
populateAndCopy(originalPdf, targetPdf);
-----------
-----------
-----------
-----------
}
} // Main method complted
private static void populateAndCopy(String originalPdf, String targetPdf) throws IOException, COSVisitorException {
_pdfDocument = PDDocument.load(originalPdf);
_pdfDocument.getNumberOfPages();
_pdfDocument.getCurrentAccessPermission().setCanModify(false);
_pdfDocument.getCurrentAccessPermission().setReadOnly();
System.out.println(_pdfDocument.getCurrentAccessPermission().isReadOnly());
_pdfDocument.save(targetPdf);
_pdfDocument.close();
}
请帮我解决这个问题。
答案 0 :(得分:1)
您的代码未设置任何加密,这就是问题所在。
试试这个:
AccessPermission ap = new AccessPermission();
ap.setCanModify(false);
ap.setReadOnly();
StandardProtectionPolicy spp = new StandardProtectionPolicy("owner-password", "", ap);
spp.setEncryptionKeyLength(128);
doc.protect(spp);
doc.save(targetPdf);
doc.close();
我设置了128作为密钥长度,因为1.8不支持256而且40太短。
用户可以在没有密码的情况下打开文档(请参阅空密码参数),但他只有受限制的权限。
答案 1 :(得分:0)
public static void main(String[] args) {
try {
String formTemplate = "xyz.pdf";
// load the document
PDDocument pdfDocument = PDDocument.load(new File(formTemplate));
// get the document catalog
PDAcroForm acroForm = pdfDocument.getDocumentCatalog().getAcroForm();
// as there might not be an AcroForm entry a null check is necessary
if (acroForm != null)
{
// Retrieve an individual field and set its value.
PDTextField field1 = (PDTextField) acroForm.getField( "_lastName" );
field1.setValue("pppp");
PDTextField field2 = (PDTextField) acroForm.getField( "_firstName" );
field2.setValue(aaaa");
}
// flatten() method saves the PDF read only
acroForm.flatten();
// Save and close the filled out form.
pdfDocument.save("xyz.pdf");
pdfDocument.close();
System.out.println("Done!!");
} catch(Exception e) {
e.printStackTrace();
}
}