pdf解析,获取字段数据

pdf解析,获取字段数据最近项目需要解析pdf单据,获取里面的数据和图片等,因pdf非模板化(某政府发放),所以靠表单域获取变得不现实。一开始是组件选型,网上各种资料,发现apache的pafbox和itext都能解析,

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

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

pdf解析,获取字段数据

然后获取编辑域“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<FieldPosition> 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解析,获取字段数据分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/27739.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注