You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java基于PDFBox提取带合并单元格的PDF表格文本问题

问题:PDFBox读取带合并单元格的表格失败

受Stack Overflow上《Extracting text from pdf (java using pdfbox library) from a table's rows with different heights》讨论启发,我已能完美读取“常规”表格,在此感谢用户mkl。

但目前遇到了问题:无法读取包含合并单元格的表格数据。我仍在寻找解决方案,若有人知道如何改进mkl编写的PdfBoxFinder类代码,使其支持处理带合并单元格的表格,我将不胜感激。如果我自己找到了解决方案,也会在此分享。提前感谢各位。

我曾尝试基于文本识别合并单元格,但效果不佳,这种方法会生成过多不同类型的表格。目前我计划尝试通过检查文本的X坐标来实现更通用的解决方案,但尚未完成。

测试情况

  • 常规表格:可被正确识别
  • 合并单元格表格:底部行实际为1个合并单元格,却被识别为3个单元格

演示代码

package pl.pdob.pdfTables;

import mkl.testarea.pdfbox2.extract.PdfBoxFinder;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;

import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;

/**
 * Class to demonstrate issue with tables with merged cells<br>
 * <a href="https://stackoverflow.com/questions/78001237/extracting-text-from-pdf-java-using-pdfbox-library-from-a-tables-with-merged-c">
 * Extracting text from pdf (java using pdfbox library) from a tables with merged cells
 * </a>
 * <br>
 * Method Drawing found rectangles taken from {@link mkl.testarea.pdfbox2.extract.ExtractBoxedText}<br>
 * and modified
 */
public class Stack78001237 {


    private static final File RESULT_FOLDER = new File("pl.pdob.results");

    private static final File INPUT_FOLDER = new File("pl.pdob.input");

    private static final String EXAMPLE_PDF = "regular_table.pdf";
//    private static final String EXAMPLE_PDF = "merged_cells_example.pdf";


    static {

        if (!INPUT_FOLDER.exists()) {
            //noinspection ResultOfMethodCallIgnored
            INPUT_FOLDER.mkdirs();
        }

        if (!RESULT_FOLDER.exists()) {
            //noinspection ResultOfMethodCallIgnored
            RESULT_FOLDER.mkdirs();
        }
    }

    public static void main(String[] args) throws IOException {
        Stack78001237 stack78001237 = new Stack78001237();
        stack78001237.drawBoxes(EXAMPLE_PDF);
    }

    @SuppressWarnings("SameParameterValue")
    private void drawBoxes(String fileName) throws IOException {
        File file = new File(INPUT_FOLDER, fileName);

        try (
             PDDocument document = PDDocument.load(file) ) {
            for (PDPage page : document.getDocumentCatalog().getPages()) {
                PdfBoxFinder boxFinder = new PdfBoxFinder(page);
                boxFinder.processPage(page);

                try (PDPageContentStream canvas = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true)) {
                    canvas.setStrokingColor(Color.RED);
                    for (Rectangle2D rectangle : boxFinder.getBoxes().values()) {
                        canvas.addRect((float)rectangle.getX(), (float)rectangle.getY(), (float)rectangle.getWidth(), (float)rectangle.getHeight());
                    }
                    canvas.stroke();
                }
            }
            document.save(new File(RESULT_FOLDER, fileName + "-rectangles.pdf"));
        }
    }
}

(代码文件对应仓库中的src/main/java/pl/pdob/pdfTables/Stack78001237.java)

核心问题在于PdfBoxFinder.java文件仅能完美处理常规表格,目前我仍在研究解决方法。

内容的提问来源于stack exchange,提问作者PawDob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:28:21