最近项目需要解析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解析,获取字段数据相关推荐

  1. [abap] 通过动态参数获取字段数据

    说明: 通过动态参数获取字段数据,抓取有规则列的字段值 在程序开发中,可能会遇到一些规则的字段名,在数据传递中通常需要对这些字段逐个赋值,以下报表是通过动态参数从数据表(结构体)中获取数据. 在透明表 ...

  2. XML无法解析大字段数据、富文本数据

    //封装数据的时候需要用以下数据转化一下 public static String htmlEncodeSize(String str) {if(str ==null || str.trim().eq ...

  3. 怎么提取pdf中的表格数据_如何从pdf第1部分中提取表格数据

    怎么提取pdf中的表格数据 In this article, we talk about the challenges and principles of extracting tabular dat ...

  4. python获取路由器数据包_python读取路由信息

    手上有一台上古时代的tp-link,获取ip没问题,但是速度太慢,于是研究了水星mac1200R. 通过Firebug研究登陆可以知道 首先登陆的时候,需要将密码编码以后以json形式传给路由器,然后 ...

  5. 【2020/6/24整理版】利用csi tool获取csi数据并进行数据解析----适合初学的小白

    1.准备工作 <1> 查看自己电脑是否能安装Intel 5300网卡,不能安装的话直接看文章最后,尝试Atheros csi tool工具. <2> 安装Ubuntu系统,cs ...

  6. Python 获取接口数据,解析JSON,写入文件

    Python 获取接口数据,解析JSON,写入文件 用于练手的例子,从国家气象局接口上获取JSON数据,将它写入文件中,并解析JSON: 总的来说,在代码量上,python代码量要比java少很多.而 ...

  7. datagrid如何获取一行数据中的某个字段值_redis 所支持的数据类型以及其应用场景...

    1.支持的数据类型 redis 支持 String.hash.list.set.Sort set这几种数据类型,可用于缓存.事件发布订阅.高速队列等场景. String是最常用的数据类型,它能够存储任 ...

  8. ajax获取json数据为undefined--原因解析

    解决办法:var dataObj=eval("("+data+")");//转换为json对象 问题: 1. 碰到一个问题ajax成功获取json数据后,取值显 ...

  9. Android中怎获取json,Android应用中如何解析获取的json数据

    Android应用中如何解析获取的json数据 发布时间:2020-11-24 17:10:08 来源:亿速云 阅读:107 作者:Leah 这篇文章将为大家详细讲解有关Android应用中如何解析获 ...

最新文章

  1. clickhouse 基础知识
  2. iOS 开发之沙盒机制 文件操作 (NSFielManager)
  3. 洛谷P4705 玩游戏(生成函数+多项式运算)
  4. 技术总监需要会些什么?
  5. 公司规定所有接口都用 POST请求?
  6. 信息系统项目管理知识--知识产权与标准化
  7. [Android] DownloadManager下载管理类2.3新增API介绍
  8. mysql 无论输入什么都是现实 not found_NotAPanda
  9. 为什么要要使用MyBatis
  10. cs架构用什么语言开发_我为什么建议Python开发者将ES6作为第二语言
  11. TikZ绘图示例——尺规作图: 圆内接正九边形的近似画法
  12. python基础1之 由来、种类、优缺点、安装环境
  13. 分治法——查找最大最小元素(C++)
  14. 太厉害了!推荐几款 Redis 可视化工具
  15. 史上最全 ArcGIS 软件安装包分享
  16. FoxBarcode(一维码生成库)使用教程
  17. Eureka的自我保护机制
  18. 第十二期基金定投-周末更新数据
  19. MVC 音乐商店 第 3 部分:Views 和 ViewModels
  20. 各城市城市编码_精致的城市

热门文章

  1. 卡特兰数 二叉树相关公式 二叉树ADT操作
  2. 如何关闭手机提醒事项的推送
  3. word里怎么添加目录呢
  4. linux ethtool_glink 获取无线网卡状态,ethtool 读到的状态与 dpdk 读到的网卡状态不一致...
  5. 程序员一小时赚50,这就是别人眼中的高薪职业
  6. 专家看台:柯莱特CTO谈企业选择CRM的六大目标
  7. java —— 不高兴的津津
  8. 在有赞做java有发展吗_响应式架构与 RxJava 在有赞零售的实践
  9. 转几个12306各家所言 之一
  10. 活体检测:keras