我正在使用PDFBox 2.0.8并尝试使用提供给jar文件的命令行选项进行PDF解密。有几个PDF文件导致错误,说这些只能用所有者密码解密(好的)但是我能够使用QPDF的在线工具删除PDF密码。
现在我担心的是,我可以使用与PDFBox相同的选项解密PDF而不用担心所有者/用户密码保留吗? (我想是的,因为相同的密码能够使用Acrobat打开PDF,并通过提供相同的密码来保存decyrpted PDF副本。)
我当前的命令行示例
java -jar "D:\pdfbox.jar" Decrypt -password xxxxxxxx
"D:\uploads\Jjre2pJsC-7KerheiZ8OUt079E7d4dlS.pdf"
我得到的例外:
2018-06-13 - 09:52:30 - error: SaveDecryptedPDF > Failed > Error: Command
failed: java -jar "D:\pdfbox.jar" Decrypt -password xxxxxxxx
"D:\uploads\Jjre2pJsC-7KerheiZ8OUt079E7d4dlS.pdf"
Exception in thread "main" java.io.IOException: Error: You are only allowed to
decrypt a document with the owner password.
at org.apache.pdfbox.tools.Decrypt.decrypt(Decrypt.java:154)
at org.apache.pdfbox.tools.Decrypt.main(Decrypt.java:64)
at org.apache.pdfbox.tools.PDFBox.main(PDFBox.java:52)
如果我有一个有效的PDF密码并且我能够通过手动提供密码和PDF阅读器应用程序来打开PDF文件,那么请大家建议我是否可以在没有所有者/用户密码约束的情况下实现解密。
答案 0 :(得分:2)
显然,密码,用户和所有者在技术上都允许解密整个文档。但是语义上存在差异,与使用所有者密码打开相同PDF的人相比,使用用户密码打开PDF的人只能访问PDF。
不同的库和工具在不同程度上遵循这些语义。有些甚至完全忽略了这种区别。
另一方面,PDFBox Decrypt
工具显式尝试遵循这些语义,只允许所有者解密PDF:
AccessPermission ap = document.getCurrentAccessPermission();
if(ap.isOwnerPermission())
{
document.setAllSecurityToBeRemoved(true);
document.save( outfile );
}
else
{
throw new IOException(
"Error: You are only allowed to decrypt a document with the owner password." );
}
(org.apache.pdfbox.tools.Decrypt
方法decrypt
)
因此,使用该工具,您无法仅提供用户密码来解密PDF。但是,如果您准备更改工具代码并重新编译命令行工具,那么必要的更改是显而易见的。