pdf解析,获取字段数据

最近项目需要解析pdf单据,获取里面的字段数据,通过网上的查阅发现itext比pdfbox的文档要多一点,所以选择了itext(不是说pdfbox不好,只是api和例子太少,难以解)。因pdf非模板化(某政府发放),所以靠表单域获取变得不现实。一开始通过PdfReaderContentParser获取的文档内容,但是获取到的是所有内容拼接成的一个字符串,而需求需要将数据精确到字段,靠截取字符串来达到解析的目的是行不通的,因为获取的内容毫无规律。后查看源码代码,发现解析过程是逐字随机字符解析的,所以只有通过字段所在坐标范围来获取字段内容。

其实我们需要获取的字段内容在pdf中组成一个矩形,我们只要知道矩形的坐标就可以获取字段信息,所以想到了pdf中的表单域AcroFields,我在获取的表单域上添加一个编辑域my,如图:


然后获取编辑域“my”的坐标,再然后通过获取的坐标来获取里面字段内容“美国”。

详见代码:

package test;

import java.util.List;

import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.AcroFields.FieldPosition;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.FilteredTextRenderListener;
import com.itextpdf.text.pdf.parser.LocationTextExtractionStrategy;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
import com.itextpdf.text.pdf.parser.RegionTextRenderFilter;
import com.itextpdf.text.pdf.parser.RenderFilter;
import com.itextpdf.text.pdf.parser.TextExtractionStrategy;

public class PdfTest2
{     
    public static void main(String[] args) throws Exception
    {        
        String res = "";
        String filePath = "F:\\test\\testt.pdf";
        PdfReader reader = new PdfReader(filePath); 
        float[] p = getPdfTextPosition(reader);
        res = getPdfTextContent(reader, p);
        System.out.println(res);
    }

    public static float[] getPdfTextPosition(PdfReader reader) throws Exception
    {
        AcroFields fields = reader.getAcroFields();
        List pos = fields.getFieldPositions("my");
        FieldPosition pitem = pos.get(0);
        Rectangle pRectangle = pitem.position;
        String res = pRectangle.getLeft()+","+pRectangle.getBottom()+","+pRectangle.getRight()+","+pRectangle.getTop();
        System.out.println(res);
        float[] arr = {pRectangle.getLeft(), pRectangle.getBottom(), pRectangle.getRight(), pRectangle.getTop()};
        return arr;
    }
    
    public static String getPdfTextContent(PdfReader reader, float[] p) throws Exception
    {
        Rectangle rect = new Rectangle(p[0], p[1], p[2], p[3]);        
        RenderFilter regionFilter = new RegionTextRenderFilter(rect);
        TextExtractionStrategy strategys = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), regionFilter);
        String res = PdfTextExtractor.getTextFromPage(reader, 1, strategys);
        System.out.println(res);
        return res;
    }
}

总结,通过这个方法可批量解析pdf(同模板的)数据,并导入系统。


你可能感兴趣的:(pdf解析,获取字段数据)