JavaFX 16 中使用PDFBox将PDF文件转换为PNG图片时出现IllegalAccessError的解决办法
解决JavaFX模块环境下PDFBox的IllegalAccessError问题
这个错误是Java 9+模块系统(JPMS)导致的:你的模块化应用de.mysoftware.software试图调用处于**未命名模块(unnamed module)**的PDFBox类,但模块间的访问权限没有正确配置,所以抛出了IllegalAccessError。下面给你两种可行的解决方法:
方案一:模块化配置(推荐)
如果你的项目是模块化结构(有module-info.java),优先用这个方案:
- 确保你用的PDFBox版本是2.0.20及以上——这个版本开始PDFBox已经添加了
module-info,支持模块化。 - 在你的
module-info.java里添加必要的依赖声明,让模块明确允许访问PDFBox相关模块:
module de.mysoftware.software { // 保留你已有的JavaFX相关依赖,比如: requires javafx.controls; requires javafx.fxml; // 添加PDFBox及相关工具的依赖 requires org.apache.pdfbox; requires org.apache.pdfbox.tools; // 因为用到了ImageIOUtil requires net.sourceforge.tess4j; // 因为用到了PdfBoxUtilities // 如果你的KostenrechnungController需要反射访问PDFBox的类,还要开放对应包的权限: opens de.office.mysoftware to org.apache.pdfbox, net.sourceforge.tess4j; }
配置完成后,模块间的访问权限就合规了,错误会消失。
方案二:用JVM参数放宽模块访问
如果暂时不想调整模块化配置,或者用的PDFBox版本不支持模块化,可以在启动JavaFX应用时添加如下JVM参数:
--add-reads de.mysoftware.software=ALL-UNNAMED
这个参数允许你的de.mysoftware.software模块读取所有未命名模块里的类(包括PDFBox),直接绕过模块权限检查,快速解决问题。
顺便提个代码小问题
你的转换代码里有一行完全多余的代码,还可能触发FileNotFoundException:
BufferedImage bi = ImageIO.read(new File(filename));
这行试图读取当前工作目录下的filename文件,但此时文件还没被写入(写入操作在后面的ImageIOUtil.writeImage),完全没必要保留,直接删掉就行。
内容的提问来源于stack exchange,提问作者user6834389
相关产品推荐
相关产品推荐

