項(xiàng)目中有個(gè)ocr軟件識(shí)別發(fā)票信息的需求漓库,實(shí)際使用中發(fā)現(xiàn)識(shí)別率有點(diǎn)低吧黄。后來(lái)發(fā)現(xiàn)對(duì)于電子發(fā)票柬帕,可以直接識(shí)別二維碼讀取部分票面信息,然后用這部分信息作為參數(shù)铅搓,通過調(diào)用稅務(wù)的接口獲取全票面信息瑟押。只要是正常的電子發(fā)票,識(shí)別率差不多是100%星掰。
創(chuàng)作不易多望,轉(zhuǎn)載請(qǐng)注明出處
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.20</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.1.0</version>
</dependency>
/**
* 獲取電子發(fā)票pdf文件中的發(fā)票信息
* @param filePath 電子發(fā)票路徑
* @return 發(fā)票信息
*/
public Invoice getInvoiceInfo(String filePath) {
try {
List<BufferedImage> imageList = extractImage(new File(filePath));
if (imageList.isEmpty()) {
logger.info("pdf中未解析出圖片嫩舟,返回空");
return null;
}
MultiFormatReader formatReader = new MultiFormatReader();
//正常解析出來(lái)有3張圖片,第一張是二維碼怀偷,其他兩張圖片是發(fā)票上蓋的章
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(imageList.get(0))));
Map hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
Result result = formatReader.decode(binaryBitmap);
if (result == null || StringUtils.isEmpty(result.getText())) {
logger.info("pdf中的第一張圖片沒有解析了字符串信息家厌,直接返回空");
return null;
}
logger.info("從電子發(fā)票中識(shí)別出的信息為:{}", result.getText());
// 讀取到的信息為 : 01,發(fā)票類型椎工,發(fā)票代碼饭于,發(fā)票號(hào)碼,發(fā)票金額维蒙,開票日期掰吕,校驗(yàn)碼,隨機(jī)產(chǎn)生的摘要信息
String[] infos = result.getText().split(",");
if (infos.length != 8) {
logger.info("pdf中的第一張圖片解析出的字符串?dāng)?shù)組長(zhǎng)度不為8颅痊,返回空畴栖。");
return null;
}
Invoice invoice = new Invoice();
invoice.setInvoiceType(infos[1]); //發(fā)票類型
invoice.setInvoiceCode(infos[2]); //發(fā)票代碼
invoice.setInvoiceNo(infos[3]); // 發(fā)票號(hào)碼
invoice.setAmount(new BigDecimal(infos[4])); // 發(fā)票金額
invoice.setInvoiceDate(DateUtils.parseDate(infos[5], "yyyyMMdd")); //開票日期
invoice.setCheckCode(infos[6]); // 校驗(yàn)碼
return invoice;
} catch (Exception e) {
logger.info("解析pdf中的二維碼出現(xiàn)異常", e);
return null;
}
}
/**
* 提取電子發(fā)票里面的圖片
* @param pdfFile 電子發(fā)票文件對(duì)象
* @return pdf中解析出的圖片列表
* @throws Exception
*/
private List<BufferedImage> extractImage(File pdfFile) throws Exception {
List<BufferedImage> imageList = new ArrayList<BufferedImage>();
PDDocument document = PDDocument.load(pdfFile);
PDPage page = document.getPage(0); //電子發(fā)票只有一頁(yè)
PDResources resources = page.getResources();
for (COSName name : resources.getXObjectNames()) {
if (resources.isImageXObject(name)) {
PDImageXObject obj = (PDImageXObject)resources.getXObject(name);
imageList.add(obj.getImage());
}
}
return imageList;
}
創(chuàng)作不易,轉(zhuǎn)載請(qǐng)注明出處