Hello PDFBox team,
I am writing this email to ask for guidance about the use of PDFBox sdk.
I have downloaded PDFBox sdk and tried some samples given with it. I am
interested in the encryption feature. I tried the password encryption and
its working fine. But when I try to do certificate based encryption, it
gives me run-time error. The exception I get is,
java.lang.RuntimeException: Could not find a suitable javax.crypto provider
at
org.apache.pdfbox.pdmodel.encryption.PublicKeySecurityHandler.createDERForRecipient(PublicKeySecurityHandler.java:419)
at
org.apache.pdfbox.pdmodel.encryption.PublicKeySecurityHandler.computeRecipientsField(PublicKeySecurityHandler.java:388)
at
org.apache.pdfbox.pdmodel.encryption.PublicKeySecurityHandler.prepareDocumentForEncryption(PublicKeySecurityHandler.java:322)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1277)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1229)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1095)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1067)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1055)
at createpdf.CreatePDF_1.main(CreatePDF_1.java:77)
Caused by: java.security.NoSuchAlgorithmException: 1.2.840.113549.3.2
KeyGenerator not available
at javax.crypto.KeyGenerator.<init>(KeyGenerator.java:169)
at javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:223)
at
org.apache.pdfbox.pdmodel.encryption.PublicKeySecurityHandler.createDERForRecipient(PublicKeySecurityHandler.java:413)
... 8 more
And the code I have written is,
package createpdf;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
import org.apache.pdfbox.pdmodel.encryption.PublicKeyProtectionPolicy;
import org.apache.pdfbox.pdmodel.encryption.PublicKeyRecipient;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
public class CreatePDF_1 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
String fileName = "EmptyPdf.pdf"; // name of our file
try{
PDDocument doc = new PDDocument(); // creating instance of pdfDoc
doc.addPage(new PDPage()); // adding page in pdf doc file
/////////////////////////
AccessPermission ap = new AccessPermission();
PublicKeyProtectionPolicy ppp = new PublicKeyProtectionPolicy();
PublicKeyRecipient recip = new PublicKeyRecipient();
recip.setPermission(ap);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream inStream = new FileInputStream("user1.cer");
X509Certificate certificate =
(X509Certificate)cf.generateCertificate(inStream);
inStream.close();
InputStream in = new FileInputStream("user1.cer");
CertificateFactory cF = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cF.generateCertificate(in);
in.close();
try{
recip.setX509(cert);
ppp.addRecipient(recip);
ppp.setEncryptionKeyLength(40);
doc.protect(ppp);
} catch (Exception e) {
e.printStackTrace();
}
/////////////////////////
try {
doc.save(fileName); // saving as pdf file with name perm
doc.close(); // cleaning memory
} catch(Exception e) {
e.printStackTrace();
}
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
I have imported the jar file named pdfbox-app-2.0.2.jar as library. The
build environment is NetBeans IDE 8.1 with java version 8. Kindly guide me
about the issue.
Regards,