java对电子发票是否原件的快速检查
快速检查上传的电子发票是否为原件
需求背景
现在财务要求报销的时候,必须得是下载的pdf原件,不允许是手机拍照,或者通过扫描件软件进行扫描,然后上传报销。
开发分析
文本可提取性检查:
原始电子发票 PDF 的文字是可复制的,而扫描件本质是图片,无法直接提取文本。
作为开发而言,其实只要找到发票号,进而通过文本提取,然后判断发票号是否存在即可。大佬给提供的思路【发票不是有发票号嘛,用发票号在这个pdf搜索,能搜出来就认为是正常的版式文件,搜不出来就是扫描得,或者图片喽】
对此进行分析:
1、首先引入pdf解析依赖,主要是读取pdf上的文字。
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version>
</dependency>
2、设计一个util类,用于封装具体的操作过程:
/*** 检测 PDF 是否为扫描件或拍照件* 支持传入发票号进行文本可搜索性验证*/
public class InvoiceCheckUtil {/*** 检测 PDF 是否为扫描件/拍照件** @param filePath PDF 文件路径* @param invoiceNum 发票号码(用于验证是否可搜索)* @return true = 电子发票原件*/public static boolean checkOriginalElectronicInvoice(String filePath, String invoiceNum) {File file = new File(filePath);if (!file.exists() || !file.isFile()) {throw new IllegalArgumentException("文件不存在或无效: " + filePath);}try (PDDocument document = PDDocument.load(file)) {if (document.getNumberOfPages() == 0) {//空文件return false;}String fullText = new PDFTextStripper().getText(document);// 清理文本:去除换行、制表符等 改为空格String cleanedText = fullText.replaceAll("\\s+", " ");// 如果发票号在文本中找不到 → 极可能是扫描件if (!cleanedText.contains(invoiceNum)) {return false; // 找不到发票号 → 不是原件}// 找到了发票号 → 是原始电子发票return true;} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e.getMessage());}}
3、测试
public static void main(String[] args) {String filePath = "D:\\fe794cc19af6589f.pdf";String invoiceNum = "25952000000162481528"; // 示例发票号try {boolean flag = checkOriginalElectronicInvoice(filePath, invoiceNum);System.out.println("电子发票原件?:" + flag);} catch (Exception e) {e.printStackTrace();}}
到此完成一个简易版的判断pdf是否 不是原件的操作。
总结
这是一种带着发票号做原件检查的操作,适合已经通过OCR识别到了一些内容,反手检查上传文件的操作。