我正在研究与apachedrill的集成,它允许用户直接使用sql查询pdf文件。我已经完成了80%的工作,我对tabula在这方面的表现印象深刻。
但是,当我执行第一个使用表格库的钻取查询时,会弹出一个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的正常行为,我的目标是以编程方式集成tabla。tabla是否试图打开一个窗口或类似的东西,如果是的话,有没有办法禁用它?我注意到在我的单元测试中不会出现这种情况。
以下是一些相关的代码片段:
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条答案
按热度按时间fxnxkyjh1#
因为执行的某些代码执行的操作通常(但技术上不一定)涉及到需要所谓“headful”模式的事情(好吧,这也许不是一个真正的术语,但恰恰相反,“headless”肯定是)。这会导致一些事情发生,包括图标出现。
一个简单的方法是强制无头模式。但请注意,当您这样做时,这些“通常但技术上不一定是头脑发热”的操作可能会[1]工作正常,不再显示该图标,或者[2]出现故障
HeadlessException
. 最终使用哪种操作不仅取决于您正在执行的操作,还取决于您在哪个虚拟机上执行操作—通常,一旦这些操作中的一个运行良好并且不再抛出,以后的版本就不会恢复到抛出(换句话说,较新版本的java提供了更多在无头模式下工作的东西)。要强制无头模式,请使用
java -Djava.awt.headless=true
.如果必须从java代码中执行,请运行
System.setProperty("java.awt.headless", "true");
至少一次,在你做任何这些“通常会导致头昏眼花”的操作之前。想必,导致headful模式发生的是一些涉及到图形的事情,比如将jpg或png渲染到imagebuffer中。例如,apachedrill这样做是为了“读取”图像,这并不奇怪。
另一个选择是升级你的虚拟机,也许这会有所帮助。一般来说,特征在这条线上“向下移动”:
需要大脑模式;运行它会让虚拟机变得头昏眼花(出现图标);如果设置了java.awt.headless,则操作将失败并出现headlessexception。
使人头昏眼花;运行它会让虚拟机人头攒动。但是,如果设置了headless,它就可以正常工作,不会这样做。
完全解放了。运行代码可以很好地工作,并且不会导致vm人头攒动。无头标志与代码的运行方式没有任何关系。