最近项目需要解析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<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