R语言使用Tabulizer提取PDF表格时触发Java非法访问报错
Tabulizer提取PDF表格报Java模块访问错误解决方案
问题根因
该报错由Java 9+版本引入的JPMS模块访问限制导致:高版本JDK默认禁止未命名模块访问java.base核心模块下的类成员,旧版rJava、tabulizer未适配该权限规则,在M1芯片Mac设备上安装最新版JDK时会触发该问题,和PDF合并、文件路径的代码逻辑无关。
核心报错信息:Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, : java.lang.IllegalAccessException: class RJavaTools cannot access a member of class java.util.ArrayList$Itr (in module java.base) with modifiers "public"
分步解决方法
- 替换兼容版本JDK
卸载当前安装的高版本Java,安装aarch64架构适配M1芯片的JDK 8或者JDK 11(这两个版本是tabulizer官方验证的全兼容版本,无模块访问限制),安装完成后在终端执行/usr/libexec/java_home -V确认已安装的JDK路径。 - 配置R端Java环境
打开R/RStudio,在加载rJava、tabulizer之前先配置JAVA_HOME环境变量,示例代码如下:# 替换路径为上一步查到的JDK8/JDK11的实际Home路径 Sys.setenv(JAVA_HOME = "/Library/Java/JavaVirtualMachines/temurin-11.jdk/Contents/Home") library(rJava) # 初始化JVM验证是否加载正常,无报错则配置成功 .jinit() - 临时兼容方案(不降级Java时使用)
如果不想卸载高版本JDK,在启动RStudio之前,先在终端执行如下命令配置JVM启动参数,放开模块访问权限后再启动RStudio即可:export JAVA_TOOL_OPTIONS="--add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED" open -a RStudio - 重装适配M1架构的依赖包
完成Java配置后,重装相关依赖包避免架构不匹配问题,在R控制台执行:remove.packages(c("tabulizer", "rJava", "tabulizerjars")) install.packages(c("rJava", "tabulizerjars", "tabulizer"), type = "binary")
验证代码
完成上述配置后,运行原复现代码即可正常提取表格:
library(tabulizer) library(rJava) library(pdftools) setwd(file.path(dirname(rstudioapi::getActiveDocumentContext()$path),'Input Files')) pdf_files<- list.files(pattern = ".pdf$") pdf_joined<- pdf_combine(pdf_files,output = "joined.pdf") f <- "joined.pdf" out1 <- extract_tables(f)
内容的提问来源于stack exchange,提问作者saph
相关产品推荐
相关产品推荐

