当我使用tabla解析pdf文件时,为什么会出现一个空白的java图标?

zqry0prt  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(514)

我正在研究与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;
  }

这在我的单元测试中不会发生。提前感谢您的帮助!

fxnxkyjh

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人头攒动。无头标志与代码的运行方式没有任何关系。

相关问题