【问题标题】:Why is a blank Java Icon appearing when I parse a PDF file using Tabula?为什么使用 Tabula 解析 PDF 文件时出现空白 Java 图标?
【发布时间】:2021-01-04 01:41:10
【问题描述】:

我正在与 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 是否试图打开一个窗口或类似的东西,如果是这样,有没有办法禁用它?我注意到这不会发生在我的单元测试中。

这里有一些相关的代码sn-ps:

 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;
  }

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

【问题讨论】:

    标签: java pdf pdfbox apache-drill tabula


    【解决方案1】:

    因为执行的某些代码执行的操作通常但技术上不一定涉及需要所谓的“有头”模式的事情(嗯,这可能不是一个真正的术语,而是相反,“无头”当然是)。这会导致一些事情发生,包括显示的图标。

    解决此问题的一个简单方法是强制无头模式。但请注意,当您执行此操作时,任何这些“通常但技术上不一定令人头疼”的操作都可能 [1] 工作正常并且不再显示该图标,,[2] 崩溃并带有 @ 987654321@。您最终得到哪一个不仅取决于您正在执行的操作,还取决于您在哪个 VM 上执行它 - 通常,一旦这些操作中的一个工作正常并且不再抛出,以后的版本将不会恢复扔(换句话说,新版本的 java 提供了更多在无头模式下工作的东西)。

    要强制无头模式,请使用 java -Djava.awt.headless=true 运行 java。

    如果您必须在 java 代码中执行此操作,请至少运行一次 System.setProperty("java.awt.headless", "true");,然后再执行任何这些“通常会导致 headful 模式”操作。

    据推测,导致 headful 模式发生的原因是涉及到一些图形,例如将 JPG 或 PNG 渲染到 ImageBuffer 中。例如,Apache Drill 这样做是为了“读取”图像,这并不奇怪。

    另一种选择是升级您的虚拟机,也许这会有所帮助。作为一般规则,特征在这条线上“向下移动”:

    • 需要headful模式;运行它会使虚拟机变得混乱(出现图标);如果设置了 java.awt.headless,则操作将失败并返回 HeadlessException。
    • 导致头部模式;运行它会使虚拟机变得头疼。但是,如果设置了 headless,它可以正常工作并且不会这样做。
    • 完全释放。运行代码可以正常运行,并且不会导致 VM 变得混乱。无头标志与代码的运行方式没有任何关系。

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 2014-01-04
      • 2018-07-19
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多