当前位置: 首页 > news >正文

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因

为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。

基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的,但是因为都是使用了本地化的组件库,只能在服务器端实现。对于目前 OA 流程的使用并不方便。又研究了一下 JS 的处理办法,找到了两个脚本库,可以使用。jsQR.js 和 pdf.js ,可以通过识别发票里的二维码间接取到发票号。

下面做了两个简单使用的例子,验证的可行性。记录一下备用。

实例1 存图片模式

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>读发票的二维码信息-图片版</title><script src="https://cozmo.github.io/jsQR/jsQR.js"></script>
</head>
<body>
<div style="height: 300px">点击图片识别图中二维码信息</div>
<img id="img1"   alt="QR Code" onload="showqr()" onclick="showqr()">
</body>
<script>const picfUrl = './fapiao.png'; // 替换为你的 发票 图片 文件路径function showqr(){const canvas = document.createElement('canvas');const context = canvas.getContext('2d');canvas.width = img1.width;canvas.height = img1.height;context.drawImage(img1, 0, 0);const imageData = context.getImageData(0, 0, canvas.width, canvas.height);const code = jsQR(imageData.data, imageData.width, imageData.height);alert(code.data);}img1.src=picfUrl
</script>
</html>

实例2 PDF格式

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>读发票二维码信息-pdf版</title><script src="https://cozmo.github.io/jsQR/jsQR.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
</head>
<body>
<div style="height: 300px">点击图片识别图中二维码信息</div>
<img id="img1" alt="QR Code" onclick="showqr()" onload="showqr()">
<script>const pdfUrl = './fapiao.pdf'; // 替换为你的 发票 PDF 文件路径// 加载 PDF 文件pdfjsLib.getDocument(pdfUrl).promise.then(pdfDoc => {console.log(`PDF 文件加载成功,共 ${pdfDoc.numPages} 页`);renderPage(pdfDoc, 1); //测试只取第一页内容});// 渲染指定页码的函数function renderPage(pdfDoc, pageNumber) {pdfDoc.getPage(pageNumber).then(page => {const scale = 1; // 放大,可以增加二维码清晰度const viewport = page.getViewport({scale});// 创建 canvas 元素const canvas = document.createElement('canvas');const context = canvas.getContext('2d');canvas.width = viewport.widthcanvas.height = viewport.height;//img1.width = viewport.width;//img1.height = viewport.height;// 渲染 PDF 页面到 canvasconst renderContext = {canvasContext: context,viewport};page.render(renderContext).promise.then(() => {const imageData = canvas.toDataURL('image/png');img1.src = imageData;});});};function showqr() {const canvas = document.createElement('canvas');const context = canvas.getContext('2d');context.drawImage(img1, 0, 0);const imageData = context.getImageData(0, 0, canvas.width, canvas.height);console.log(imageData)const code = jsQR(imageData.data, imageData.width, imageData.height);alert(code.data);}
</script>
</body>
</html>

http://www.lqws.cn/news/179227.html

相关文章:

  • 32单片机——窗口看门狗
  • 五子棋测试用例
  • go语言学习 第6章:错误处理
  • 浏览器工作原理05 [#] 渲染流程(上):HTML、CSS和JavaScript是如何变成页面的
  • Java逻辑运算符常见错误分析与规避指南
  • 03 mysql 的环境搭建
  • 服务器磁盘空间被Docker容器日志占满处理方法
  • 服务器信任质询
  • 什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
  • 服务器出现故障怎么办?快速排查与解决方法
  • PostgreSQL 的扩展pg_freespacemap
  • Linux操作系统之进程(五):初识地址空间
  • Edge(Bing)自动领积分脚本部署——基于python和Selenium(附源码)
  • 七、数据库的完整性
  • Codeforces EDU Round 179 A~D
  • PDF转Markdown/JSON软件MinerU最新1.3.12版整合包下载
  • HarmonyOS运动语音开发:如何让运动开始时的语音播报更温暖
  • Redis 主从 + 哨兵集群部署
  • 【HarmonyOS 5】出行导航开发实践介绍以及详细案例
  • 《深度探秘:Java构建Spark MLlib与TensorFlow Serving混合推理流水线》
  • 麒麟系统使用-进行.NET开发
  • 电脑开不了机,主板显示67码解决过程
  • vue项目引入tailwindcss
  • 华为 “一底双长焦” 专利公布,引领移动影像新变革
  • 在 Windows 系统上运行 Docker 容器中的 Ubuntu 镜像并显示 GUI
  • 【信息系统项目管理师-论文真题】2025上半年(第一批)论文详解(包括解题思路和写作要点)
  • 基于端到端深度学习模型的语音控制人机交互系统
  • Mysql主从复制与读写分离
  • BugKu Web渗透之需要管理员
  • PHP语言核心技术全景解析