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

起因

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

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

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

实例1 存图片模式

html 复制代码
<!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格式

html 复制代码
<!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.width
            canvas.height = viewport.height;
            //img1.width = viewport.width;
            //img1.height = viewport.height;

            // 渲染 PDF 页面到 canvas
            const 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>
相关推荐
Kyln.Wu17 小时前
【python实用小脚本-190】Python一键删除PDF任意页:输入页码秒出干净文件——再也不用在线裁剪排队
服务器·python·pdf
阿幸软件杂货间1 天前
免费万能电子书格式转换器!Neat Converter支持 ePub、Azw3、Mobi、Doc、PDF、TXT 文件的相互转换。
pdf·格式转换
星马梦缘2 天前
CSDN转PDF【无水印且免费!!!】
pdf·免费·pandoc·转pdf·无水印·csdn转pdf·wkhtmlpdf
画月的亮2 天前
前端处理导出PDF。Vue导出pdf
前端·vue.js·pdf
伊织code3 天前
pdfminer.six
python·pdf·图片·提取·文本·pdfminer·pdfminer.six
HAPPY酷3 天前
给纯小白的Python操作 PDF 笔记
开发语言·python·pdf
代码AI弗森4 天前
PDF OCR + 大模型:让文档理解不止停留在识字
pdf·ocr
小周同学:5 天前
在 Vue2 中使用 pdf.js + pdf-lib 实现 PDF 预览、手写签名、文字批注与高保真导出
开发语言·前端·javascript·vue.js·pdf
Kyln.Wu5 天前
【python实用小脚本-187】Python一键批量改PDF文字:拖进来秒出新文件——再也不用Acrobat来回导
python·pdf·c#
迪尔~6 天前
Apache POI中通过WorkBook写入图片后出现导出PDF文件时在不同页重复写入该图片问题,如何在通过sheet获取绘图对象清除该图片
java·pdf·excel