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

本文介绍了如何使用iText的FilteredTextRenderListener和PDFBox的PDFTextStripperByArea从PDF文件的特定区域,尤其是表格,提取文本。提供了代码示例来演示如何设置坐标并提取所需内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

提供X和Y坐标

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

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

iText的

要限制要从中提取文字的区域,您可以使用RegionTextRenderFilter中的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();

}

(来自iText in Action,第2版的ExtractPageContentArea样本)

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

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

如果遇到的问题是提取的内容比您想要的多,那么您应该事先将这些块拆分成它们的构成字形。 This stackoverflow answer解释了如何做到这一点。

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" ) );

(来自PDFBox 1.8.8示例的ExtractTextByArea)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值