为什么在使用 Tabula 解析 PDF 文件时会出现一个空白的 Java 图标?

问题描述

我正在研究与 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 弹出窗口。

enter image description here

这不是 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 模式;运行它会使虚拟机变得头昏眼花。但是,如果设置了无头,它可以正常工作并且不会这样做。
  • 完全释放。运行代码工作正常,不会导致虚拟机变得混乱。无头标志与代码的运行方式没有任何关系。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...