问题描述
我正在研究与 Apache Drill 的集成,它使用户能够直接使用 sql 查询 PDF 文件。我已经完成了大约 80%,并且对 Tabula 在这方面的出色表现印象深刻。
但是,当我执行第一个使用 Tabula 库的 Drill 查询时,会弹出一个 Java 图标,并在命令行中看到以下文本:
2020-10-25 15:06:55.770 java[71188:7121498] Persistent UI Failed to open file file://localhost/Users/******/Saved%20Application%20State/net.java.openjdk.cmd.savedState/window_1.data: Permission denied (13)
我更改了该目录的权限,但仍然出现 Java 弹出窗口。
这不是 Drill 的正常行为,我的目标是以编程方式集成 Tabula。 Tabula 是否试图打开一个窗口或类似的东西,如果是这样,有没有办法禁用它?我注意到这不会发生在我的单元测试中。
以下是一些相关的代码片段:
public static List<Table> extractTablesFromPDF(PDDocument document,ExtractionAlgorithm algorithm) {
NurminenDetectionAlgorithm detectionAlgorithm = new NurminenDetectionAlgorithm();
ExtractionAlgorithm algExtractor;
SpreadsheetExtractionAlgorithm extractor=new SpreadsheetExtractionAlgorithm();
ObjectExtractor objectExtractor = new ObjectExtractor(document);
PageIterator pages = objectExtractor.extract();
List<Table> tables= new ArrayList<>();
while (pages.hasNext()) {
Page page = pages.next();
algExtractor = algorithm;
/*if (extractor.isTabular(page)) {
algExtractor=new SpreadsheetExtractionAlgorithm();
}
else {
algExtractor = new BasicExtractionAlgorithm();
}*/
List<Rectangle> tablesOnPage = detectionAlgorithm.detect(page);
for (Rectangle guessRect : tablesOnPage) {
Page guess = page.getArea(guessRect);
tables.addAll(algExtractor.extract(guess));
}
}
return tables;
}
这不会发生在我的单元测试中。 预先感谢您的帮助!
解决方法
因为某些代码执行的操作通常(但技术上不一定)涉及需要所谓“有头”模式的事情(好吧,这可能不是一个真正的术语,而是相反,“无头”当然是)。这会导致一些事情发生,包括显示该图标。
一种简单的方法是强制无头模式。但请注意,当您执行此操作时,任何这些“通常但技术上不一定是头疼的”操作可能 [1] 工作正常并且不再显示该图标,或,[2] 崩溃并显示 { {1}}。您最终得到哪一个不仅取决于您正在执行的操作,还取决于您在哪个 VM 上执行此操作 - 通常,一旦这些操作之一工作正常并且不再抛出,以后的版本将不会恢复投掷(换句话说,较新版本的 java 提供了更多可以在无头模式下工作的东西)。
要强制无头模式,请使用 HeadlessException
运行 java。
如果您必须在 Java 代码中执行此操作,请至少运行一次 java -Djava.awt.headless=true
,并且在执行任何这些“通常会导致头部模式”操作之前。
据推测,导致 headful 模式发生的原因与图形有关,例如将 JPG 或 PNG 渲染到 ImageBuffer 中。例如,Apache Drill 这样做是为了“读取”图像,这并不奇怪。
另一种选择是升级您的虚拟机,也许会有所帮助。作为一般规则,此行上的功能“向下移动”:
- 需要 headful 模式;运行它会使虚拟机变得头昏眼花(图标出现);如果设置了 java.awt.headless,操作将失败并返回 HeadlessException。
- 导致 headful 模式;运行它会使虚拟机变得头昏眼花。但是,如果设置了无头,它可以正常工作并且不会这样做。
- 完全释放。运行代码工作正常,不会导致虚拟机变得混乱。无头标志与代码的运行方式没有任何关系。