java 解析pdf表格

Python057

java 解析pdf表格,第1张

最近在帮公司做工具,需要读取PDF中表格的数据。网上查了,大部分PDFBox读取的代码都大致相同,一行一行从头读到尾。尝试读取PDF表格的人可能会遇到表格有空数据时,列与列就会对不齐,这样就不能很好地进行数据的处理了。网上看到一个例子,用iText坐标精确读取的例子,参考以后出现了亚洲语种字体不支持,添加了语言包iTextAsian.jar导入字体后,结果发现打印的都是空格无法处理。后找到了PDFBox坐标读取的方法,相当给力。在此过程中了解到有很多人遇到了我这样的问题。所以写下来望对现在还未解决问题还有以后遇到此问题的人提供帮助。

上代码:

package com.pdfbox.util.test

import org.apache.pdfbox.exceptions.InvalidPasswordException

import org.apache.pdfbox.pdmodel.PDDocument

import org.apache.pdfbox.pdmodel.PDPage

import org.apache.pdfbox.util.PDFTextStripperByArea

import java.awt.Rectangle

import java.util.List

public class ExtractTextByArea

{

ITEXT插件方法

/**

* @param pdf PDF文件路径

* @param txt 输出文本文件路径

* @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 = 1i <= reader.getNumberOfPages()i++) {

strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), filter)

out.println(PdfTextExtractor.getTextFromPage(reader, i, strategy))

}

out.flush()

out.close()

reader.close()

}

PDFBOX插件方法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" ) )