The Apache PDFBox library is an open source Java tool for working with PDF documents.
—
Comprehensive PDF security features including encryption, decryption, access permissions, password protection, and digital signatures for document integrity and confidentiality.
Encrypt PDF documents with password protection and access control.
// Encryption methods in org.apache.pdfbox.pdmodel.PDDocument
public void encrypt(AccessPermission ap, StandardProtectionPolicy spp) throws IOException;
public boolean isEncrypted();
public void decrypt(String password) throws IOException;
public AccessPermission getCurrentAccessPermission();Control what operations are allowed on encrypted PDF documents.
// Constructor and methods in org.apache.pdfbox.pdmodel.encryption.AccessPermission
public AccessPermission();
public AccessPermission(int permissions);
// Permission queries
public boolean canPrint();
public boolean canPrintDegraded();
public boolean canModify();
public boolean canModifyAnnotations();
public boolean canFillInForm();
public boolean canExtractContent();
public boolean canExtractForAccessibility();
public boolean canAssembleDocument();
// Permission setters
public void setCanPrint(boolean canPrint);
public void setCanPrintDegraded(boolean canPrintDegraded);
public void setCanModify(boolean canModify);
public void setCanModifyAnnotations(boolean canModifyAnnotations);
public void setCanFillInForm(boolean canFillInForm);
public void setCanExtractContent(boolean canExtractContent);
public void setCanExtractForAccessibility(boolean canExtractForAccessibility);
public void setCanAssembleDocument(boolean canAssembleDocument);
// Permission value
public int getPermissionBytes();
public void setPermissionBytes(int permissions);Configure encryption settings and password policies.
// Constructor and methods in org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy
public StandardProtectionPolicy(String ownerPassword, String userPassword, AccessPermission permissions);
// Password management
public String getOwnerPassword();
public String getUserPassword();
public AccessPermission getPermissions();
// Encryption configuration
public void setEncryptionKeyLength(int encryptionKeyLength);
public int getEncryptionKeyLength();
public void setPreferAES(boolean preferAES);
public boolean isPreferAES();Add and verify digital signatures for document authenticity and integrity.
// Constructor and methods in org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature
public PDSignature();
public PDSignature(COSDictionary dict);
// Signature information
public String getName();
public void setName(String name);
public Calendar getSignDate();
public void setSignDate(Calendar signDate);
public String getLocation();
public void setLocation(String location);
public String getReason();
public void setReason(String reason);
public String getContactInfo();
public void setContactInfo(String contactInfo);
// Signature data
public byte[] getContents();
public void setContents(byte[] contents);
public int[] getByteRange();
public void setByteRange(int[] byteRange);
// Signature properties
public COSName getFilter();
public void setFilter(COSName filter);
public COSName getSubFilter();
public void setSubFilter(COSName subFilter);Manage document signatures and verification.
// Signature access in PDDocument
public List<PDSignature> getSignatureDictionaries();
public void addSignature(PDSignature signature) throws IOException;
public void addSignature(PDSignature signature, SignatureInterface signatureInterface) throws IOException;
public void addSignature(PDSignature signature, SignatureInterface signatureInterface, SignatureOptions signatureOptions) throws IOException;
// Signature validation
public boolean verifySignature(PDSignature signature) throws IOException;
public byte[] getSignedContent(PDSignature signature) throws IOException;Define signature creation behavior.
// Interface in org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureInterface
public byte[] sign(InputStream content) throws IOException;Configure signature appearance and behavior.
// Constructor and methods in org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureOptions
public SignatureOptions();
// Page and positioning
public void setPage(int page);
public int getPage();
public void setVisualSignature(PDFormXObject visualSignature);
public PDFormXObject getVisualSignature();
// Signature field configuration
public void setPrefferredSignatureSize(int size);
public int getPreferredSignatureSize();Access low-level security implementations.
// Methods in org.apache.pdfbox.pdmodel.encryption.SecurityHandler
public void prepareDocumentForEncryption(PDDocument doc) throws IOException;
public void decryptDocument(PDDocument doc, DecryptionMaterial decryptionMaterial) throws IOException;
public AccessPermission getCurrentAccessPermission();
public boolean hasProtectionPolicy();PDDocument document = Loader.loadPDF(new File("document.pdf"));
// Create access permissions
AccessPermission permissions = new AccessPermission();
permissions.setCanPrint(true);
permissions.setCanModify(false);
permissions.setCanExtractContent(false);
permissions.setCanModifyAnnotations(false);
// Create protection policy
String ownerPassword = "owner123";
String userPassword = "user123";
StandardProtectionPolicy policy = new StandardProtectionPolicy(ownerPassword, userPassword, permissions);
// Configure encryption
policy.setEncryptionKeyLength(256); // AES-256
policy.setPreferAES(true);
// Apply encryption
document.encrypt(permissions, policy);
document.save("encrypted-document.pdf");
document.close();File file = new File("encrypted-document.pdf");
String password = "user123";
// Load encrypted document with password
PDDocument document = Loader.loadPDF(file, password);
// Check if document is encrypted
if (document.isEncrypted()) {
System.out.println("Document is encrypted");
// Get current permissions
AccessPermission permissions = document.getCurrentAccessPermission();
System.out.println("Can print: " + permissions.canPrint());
System.out.println("Can modify: " + permissions.canModify());
System.out.println("Can extract: " + permissions.canExtractContent());
}
// Work with decrypted document
// ...
document.close();PDDocument document = new PDDocument();
// ... add content to document
// Create restrictive permissions
AccessPermission permissions = new AccessPermission();
permissions.setCanPrint(true); // Allow printing
permissions.setCanPrintDegraded(false); // No degraded printing
permissions.setCanModify(false); // No modifications
permissions.setCanModifyAnnotations(true); // Allow annotation changes
permissions.setCanFillInForm(true); // Allow form filling
permissions.setCanExtractContent(false); // No content extraction
permissions.setCanExtractForAccessibility(true); // Allow accessibility tools
permissions.setCanAssembleDocument(false); // No page manipulation
// Apply with different user/owner passwords
StandardProtectionPolicy policy = new StandardProtectionPolicy("secret_owner", "public_user", permissions);
document.encrypt(permissions, policy);
document.save("restricted-document.pdf");
document.close();PDDocument document = Loader.loadPDF(new File("document.pdf"));
// Create signature dictionary
PDSignature signature = new PDSignature();
signature.setName("John Doe");
signature.setLocation("New York, NY");
signature.setReason("I approve this document");
signature.setSignDate(Calendar.getInstance());
signature.setFilter(COSName.getPDFName("Adobe.PPKLite"));
signature.setSubFilter(COSName.getPDFName("adbe.pkcs7.detached"));
// Implement signature interface
SignatureInterface signatureInterface = new SignatureInterface() {
@Override
public byte[] sign(InputStream content) throws IOException {
// Implement actual signing logic here
// This would typically involve:
// 1. Reading the content to be signed
// 2. Creating a digital signature using private key
// 3. Returning the signature bytes
return new byte[0]; // Placeholder
}
};
// Configure signature options
SignatureOptions signatureOptions = new SignatureOptions();
signatureOptions.setPage(0); // Sign on first page
// Add signature to document
document.addSignature(signature, signatureInterface, signatureOptions);
document.save("signed-document.pdf");
document.close();PDDocument document = Loader.loadPDF(new File("signed-document.pdf"));
// Get all signatures
List<PDSignature> signatures = document.getSignatureDictionaries();
for (PDSignature signature : signatures) {
System.out.println("Signature by: " + signature.getName());
System.out.println("Date: " + signature.getSignDate().getTime());
System.out.println("Location: " + signature.getLocation());
System.out.println("Reason: " + signature.getReason());
// Get signed content for verification
byte[] signedContent = document.getSignedContent(signature);
// Verify signature (implementation depends on your security provider)
boolean isValid = verifySignature(signature, signedContent);
System.out.println("Signature valid: " + isValid);
}
document.close();PDDocument document = Loader.loadPDF(new File("encrypted-document.pdf"));
if (document.isEncrypted()) {
// Access security handler for advanced operations
SecurityHandler securityHandler = document.getEncryption().getSecurityHandler();
if (securityHandler.hasProtectionPolicy()) {
System.out.println("Document has protection policy");
// Get current access permissions
AccessPermission currentPermissions = securityHandler.getCurrentAccessPermission();
// Check specific permissions
if (!currentPermissions.canExtractContent()) {
System.out.println("Content extraction is restricted");
}
}
}
document.close();Install with Tessl CLI
npx tessl i tessl/maven-org-apache-pdfbox--pdfbox