You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX 16 中使用PDFBox将PDF文件转换为PNG图片时出现IllegalAccessError的解决办法

解决JavaFX模块环境下PDFBox的IllegalAccessError问题

这个错误是Java 9+模块系统(JPMS)导致的:你的模块化应用de.mysoftware.software试图调用处于**未命名模块(unnamed module)**的PDFBox类,但模块间的访问权限没有正确配置,所以抛出了IllegalAccessError。下面给你两种可行的解决方法:

方案一:模块化配置(推荐)

如果你的项目是模块化结构(有module-info.java),优先用这个方案:

  1. 确保你用的PDFBox版本是2.0.20及以上——这个版本开始PDFBox已经添加了module-info,支持模块化。
  2. 在你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:22:38