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
相关产品推荐
相关产品推荐

