使用java读取pdf文件中的表格或单元格值?

sge*_*lle 0 java itext pdfbox jpedal

我已经通过Java和PDF论坛从pdf文件中的表中提取文本值,但除了JPedal(它不是开源和许可)之外找不到任何解决方案.

所以,我想知道任何开源API,如pdfbox,itext,以实现与JPedal相同的结果.

参考.例:

样本表

mkl*_*mkl 6

在评论中,OP澄清说他在表格中找到了他想要提取的pdf文件中文本值

通过提供X和Y坐标

因此,虽然这个问题最初听起来像是从PDF中通用提取表格数据(至少可能很困难),但它实际上主要是从坐标给出的页面上的矩形区域中提取文本.

这可以使用您提到的任何一个库(当然也包括其他库).

iText的

要限制要从中提取文本的区域,可以使用RegionTextRenderFiltera FilteredTextRenderListener,例如:

/**
 * Parses a specific area of a PDF to a plain text file.
 * @param pdf the original PDF
 * @param txt the resulting text
 * @throws IOException
 */
public void parsePdf(String pdf, String txt) throws IOException {
    PdfReader reader = new PdfReader(pdf);
    PrintWriter out = new PrintWriter(new FileOutputStream(txt));
    Rectangle rect = new Rectangle(70, 80, 490, 580);
    RenderFilter filter = new RegionTextRenderFilter(rect);
    TextExtractionStrategy strategy;
    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), filter);
        out.println(PdfTextExtractor.getTextFromPage(reader, i, strategy));
    }
    out.flush();
    out.close();
    reader.close();
}
Run Code Online (Sandbox Code Playgroud)

(来自iText in Action,第2版的ExtractPageContentArea示例)

但要注意,iText会根据内容流中的基本文本块提取文本,而不是基于此类块中的每个字形.因此,如果只有最细小的部分在该区域中,则处理整个块.

这可能适合您,也可能不适合您.

如果遇到的问题是提取的内容多于您想要的内容,则应事先将块拆分为其构造字形.这个stackoverflow答案解释了如何做到这一点.

PDFBox的

要限制要从中提取文本的区域,可以使用PDFTextStripperByArea,例如:

PDDocument document = PDDocument.load( args[0] );
if( document.isEncrypted() )
{
    document.decrypt( "" );
}
PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.setSortByPosition( true );
Rectangle rect = new Rectangle( 10, 280, 275, 60 );
stripper.addRegion( "class1", rect );
List allPages = document.getDocumentCatalog().getAllPages();
PDPage firstPage = (PDPage)allPages.get( 0 );
stripper.extractRegions( firstPage );
System.out.println( "Text in the area:" + rect );
System.out.println( stripper.getTextForRegion( "class1" ) );
Run Code Online (Sandbox Code Playgroud)

(来自PDFBox 1.8.8示例的ExtractTextByArea)