PDF二维码识别,PDF转图片再识别二维码java实现

识别PDF中二维码

实现步骤:

1.使用icepdf把pdf转化为图片

2.使用google的zxing识别图片中的二维码

包引用

gradle 复制代码
    // https://central.sonatype.com/artifact/com.google.zxing/core
    implementation 'com.google.zxing:core:3.5.3'
    
    // https://central.sonatype.com/artifact/com.google.zxing/javase
    implementation 'com.google.zxing:javase:3.5.3'
    
    // https://central.sonatype.com/artifact/org.icepdf.os/icepdf-core
    implementation('org.icepdf.os:icepdf-core:6.2.2') {
        exclude group: 'javax.media', module: 'jai_core'
    }

代码部分,一个类几个方法就实现了,还是比较简单

java 复制代码
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.util.GraphicsRenderingHints;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;

public class Test {
    //缩放比例
    public static float scale = 2f;
    //旋转角度
    public static float rotation = 0f;

    //识别PDF中的二维码
    public static void main(String[] args) throws Exception {
        long time = System.currentTimeMillis();
        File file = new File("C:\\Users\\yujing\\Desktop\\111.pdf");
        //PDF转byte
        byte[] pdfBytes = fileToByte(file);
        //byte转imageByte
        byte[] imageBytes = pdfByteToImgByte(pdfBytes);
        //保存到本地
        //byteToFile(imageBytes, new File("D:/pdf_" + UUID.randomUUID() + ".png"));
        //二维码识别
        String text = imageToQRCode(imageBytes);
        System.out.println(text);
        System.out.println("耗时:" + (System.currentTimeMillis() - time) + "ms");
    }

    /**
     * pdf转图片
     */
    public static byte[] pdfByteToImgByte(byte[] pdfBytes) throws Exception {
        byte[] result = null;
        Document document = new Document();
        document.setByteArray(pdfBytes, 0, pdfBytes.length, "");
        for (int i = 0; i < document.getNumberOfPages(); i++) {
            BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN, org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation, scale);
            try {
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                ImageIO.write(image, "png", bos);
                result = bos.toByteArray();
            } catch (Exception e) {
                e.printStackTrace();
            }
            image.flush();
        }
        document.dispose();
        return result;
    }

    /**
     * 识别 png图片中的二维码信息
     */
    public static String imageToQRCode(byte[] imageInByte) throws Exception {
        MultiFormatReader multiFormatReader = new MultiFormatReader();
        InputStream in = new ByteArrayInputStream(imageInByte);
        BufferedImage image = ImageIO.read(in);
        // 定义二维码参数
        Map<DecodeHintType, String> hints = new HashMap<>();
        hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
        // 获取读取二维码结果
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
        Result result = multiFormatReader.decode(binaryBitmap, hints);
        return result.getText();
    }

    public static byte[] fileToByte(File file) {
        if (file == null || !file.exists()) return null;
        try (FileInputStream stream = new FileInputStream(file); ByteArrayOutputStream out = new ByteArrayOutputStream((int) file.length())) {
            byte[] b = new byte[1024 * 4];
            int n;
            while ((n = stream.read(b)) != -1)
                out.write(b, 0, n);
            return out.toByteArray();
        } catch (IOException ignored) {
        }
        return null;
    }

    public static boolean byteToFile(byte[] bytes, File file) {
        if (!Objects.requireNonNull(file.getParentFile()).exists()) // 如果位置不存在
            file.getParentFile().mkdirs();
        if (file.exists()) file.delete();
        FileOutputStream out;
        try {
            out = new FileOutputStream(file);
            out.write(bytes);
            out.flush();
            out.close();
        } catch (FileNotFoundException e) {
            System.out.println("No Find File");
            return false;
        } catch (IOException e) {
            System.out.println("IO Error");
            return false;
        }
        return true;
    }
}
相关推荐
Flynn Liang13 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪14 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息14 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼14 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff16 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff16 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
David猪大卫16 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
SL_staff17 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品
nice_lcj52018 小时前
【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端
java·后端·spring·spring ai·ai应用开发
fengci.18 小时前
CTF2MISC中等部分
开发语言·前端·学习