一、直接将前篇docx文档转成pdf文档用于测试
二、由于使用pdf文档所以需要引入一个新的依赖
<!--itextpdf是生成PDF文档的一个java类库--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.7</version> </dependency>
三、获取pdf的文档下标要从1开始,如果像之前一样循坏页数从下标0开始遍历会报错:
错误代码段:
PdfReader pdfReader = new PdfReader(file.getInputStream()); //获取pdf的页数 int page = pdfReader.getNumberOfPages(); for(int i=0 ; i<=page ; i++){ //获取pdf每一页的内容 String content = PdfTextExtractor.getTextFromPage(pdfReader, i); //根据固定的数据去取需要的数据信息 String perfix = ""; }
这里从红框77行一路点进去,会看见下面这个PdfReader.class底层代码:
这个方法就能发现,如果下标从0开始,这里–pageNum直接把数值变为-1,循坏条件不满足,获取不到pdf的数据;
四、核心代码:
/** * 获取固定格式pdf文件的数据信息 * @param file */ public void pdfIndentify(MultipartFile file){ try { //获取pdf PdfReader pdfReader = new PdfReader(file.getInputStream()); //获取pdf的页数 int page = pdfReader.getNumberOfPages(); String insAmt = null; String insPrice = null; String insQty = null; String date = null; for(int i=1 ; i<=page ; i++){ //获取pdf每一页的内容 String content = PdfTextExtractor.getTextFromPage(pdfReader, i); PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader); log.info(content); //根据固定的数据去取需要的数据信息 String perfix = "量"; String suffix = "文档日期"; //在切割数据时要考虑到把换行符排掉,所以开始下标多加了1,结束下标减一 String subString = content.substring(content.indexOf(perfix)+2,content.indexOf(suffix)-1); perfix = ":"; suffix = "作者"; //由于段落与段落间换行,所以结束下标需要减一,去掉换行符 date = content.substring(content.indexOf(perfix)+1,content.indexOf(suffix)-1).replaceAll(" ",""); List<String> dataList = Arrays.asList(subString.split(" ")); insAmt = dataList.get(0); insPrice = dataList.get(1); insQty = dataList.get(2); } //这里由于只是测试所以直接把获得的数据打印出来验证下就好了,实际中这个文档应该是流程中提供的官网文档,会落入数据库中或使用在一定业务场景 log.info("金额:"+insAmt+";价格:"+insPrice+";数量:"+insQty+";日期:"+date); System.out.println("金额:"+insAmt+";价格:"+insPrice+";数量:"+insQty+";日期:"+date); } catch (IOException e) { e.printStackTrace(); } }
结果展示:
五、总结:
1、按页数获取pdf内容时,需从下标1开始
2、在解析特定格式的pdf文件时,可以先获取每页的pdf内容,然后根据固定的字符串截取所需要的数据信息