PDFBox加载函数性能问题:9页PDF加载耗时53分钟求优化方案
检查PDF是否加密的优化方案(PDFBox 2.0.24 + Java 8)
你的问题核心是不需要加载完整PDF就能判断是否加密,原代码用PDDocument.load会全量解析文档内容(包括页面、资源等),这是导致耗时过长的根本原因。以下是具体优化方案:
一、PDFBox原生优化方案
使用PDFParser仅解析PDF的基础结构,跳过页面内容加载,直接获取加密状态:
import org.apache.pdfbox.io.RandomAccessRead; import org.apache.pdfbox.io.RandomAccessFile; import org.apache.pdfbox.pdfparser.PDFParser; import org.apache.pdfbox.pdmodel.common.COSDocument; import java.io.File; import java.io.IOException; public class PDFEncryptionCheck { public static void main(String[] args) { String pdfPath = "C:\\local\\first.pdf"; // Java路径需用双反斜杠 try (RandomAccessRead fileAccess = new RandomAccessFile(new File(pdfPath), "r")) { PDFParser parser = new PDFParser(fileAccess); parser.parse(); COSDocument cosDoc = parser.getDocument(); boolean isEncrypted = cosDoc.isEncrypted(); System.out.println("PDF是否受密码保护:" + isEncrypted); cosDoc.close(); } catch (IOException e) { e.printStackTrace(); } } }
这个方法只会读取PDF的文件头和加密信息,不会加载页面数据,速度会大幅提升。
二、替代方案:使用iText 5(轻量检查)
如果允许更换库,iText 5的PdfReader构造时会直接检测加密状态,无需全量解析:
import com.itextpdf.text.pdf.PdfReader; import java.io.IOException; public class ITextEncryptionCheck { public static void main(String[] args) { String pdfPath = "C:\\local\\first.pdf"; try (PdfReader reader = new PdfReader(pdfPath)) { boolean isEncrypted = reader.isEncrypted(); System.out.println("PDF是否受密码保护:" + isEncrypted); } catch (IOException e) { e.printStackTrace(); } } }
额外注意点
原代码中的路径"C:\local\first.pdf"存在转义错误,Java中文件路径必须用双反斜杠\\或正斜杠/,否则会导致路径解析异常,这也可能是加载缓慢的潜在原因。
内容的提问来源于stack exchange,提问作者Jay M Harkhani
相关产品推荐
相关产品推荐

