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

识别PDF中二维码

实现步骤:
1.使用icepdf把pdf转化为图片
2.使用google的zxing识别图片中的二维码

包引用

    // https://central.sonatype.com/artifact/com.google.zxing/coreimplementation 'com.google.zxing:core:3.5.3'// https://central.sonatype.com/artifact/com.google.zxing/javaseimplementation 'com.google.zxing:javase:3.5.3'// https://central.sonatype.com/artifact/org.icepdf.os/icepdf-coreimplementation('org.icepdf.os:icepdf-core:6.2.2') {exclude group: 'javax.media', module: 'jai_core'}

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

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转bytebyte[] pdfBytes = fileToByte(file);//byte转imageBytebyte[] 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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不会还有人判断字符是否为数字或字母还用Ascii吧

不会还有人判断字符是否为数字或字母还用Ascii吧 c > a && c < z) || (c > 0 && c < 9当然&#xff0c;也可也用&#xff0c;下面给大家分享几个方法快速判断。 Character.isLetter(ch) 判断ch是否为字母 Character.isDigit(ch) 判断ch是否为数字…

导入空管基础数据

1、首先将data.tar.gz解压到自定义目录中 注意&#xff1a;由于数据文件的压缩包比较大&#xff0c;解压过程可能会持续3~5分钟&#xff0c;请耐心等待。 [rootnode3 ~]# cd /opt/software/ [rootnode3 software]# tar -xzf data.tar.gz -C /opt/ 2、利用SQLyog或者其他数据库…

9、设计模式之组合模式(Composite)

一、什么是组合模式 组合模式也成为整体部分模式&#xff0c;是一种结构型设计模式。它将对象组合成树形的层次结构&#xff0c;用来表示“整体-部分”的关系。通过组合模式&#xff0c;我们可以使用相同的方式处理单个对象和多个对象组合。 二、角色组成 组件&#xff08;Com…

Centos搭建Nacos集群

一、环境准备 1、安装jdk11https://jdk.java.net/java-se-ri/11 2、下载nacos-server-1.4.1.tar.gz到/home/nacos目录下并解压。在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https…

LightDB24.1 XMLELEMENT支持省略NAME关键字

功能介绍 为了兼容Oracle数据库的语法&#xff0c;LightDB24.1版本开始支持XMLELEMENT函数省略NAME关键字&#xff0c;功能不受影响。 使用示例 带有NAME关键字 lightdboracle_test# SELECT xmlelement(name foo);xmlelement ------------<foo/> (1 row)lightdborac…

ROS机器人程序设计课程进度安排-2023-2024-2

进度安排由人工智能审核制定。 课程 教学进度表预期效果与课程内容详细描述 一、预期效果 此教学进度表旨在确保《ROS机器人程序设计》课程在2023&#xff5e;2024学年度第二学期内&#xff0c;按照预定的教学计划和进度&#xff0c;有序、高效地进行。通过本课程的教学&…

第二十一天-NumPy

目录 什么是NumPy NumPy使用 1.数组的创建 2.类型转换 3.赠删改查 4.数组运算 5.矩阵运算 什么是NumPy 1.NumPy操作的是多维数组&#xff0c;什么是纬度&#xff1f; NumPy使用 1. 安装 pip install numpy import numpy as np 2.官网&#xff1a; 中文官网&#xff1a…

蝙蝠避障:我生活中的一道光

盲人的世界&#xff0c;是无尽的黑暗。看不见光&#xff0c;看不见色彩&#xff0c;甚至看不见自己的手。但在这个黑暗的世界里&#xff0c;我找到了一个光明的出口&#xff1a;一款可以障碍物实时检测的名为蝙蝠避障的盲人软件。 这款软件就像是我的一双眼睛。它通过先进的激光…

HW干货集合 | HW面试题记录(1)

整理最近护网面试问的问题 前言 一开始会问问你在工作中负责的是什么工作&#xff08;如果在职&#xff09;&#xff0c;参与过哪些项目。还有些会问问你之前有没有护网的经历&#xff0c;如果没有的话一般都会被定到初级&#xff08;技术特牛的另说&#xff09;。下面就是一…

Springboot 整合 Elasticsearch(五):使用RestHighLevelClient操作ES ②

&#x1f4c1; 前情提要&#xff1a; Springboot 整合 Elasticsearch&#xff08;三&#xff09;&#xff1a;使用RestHighLevelClient操作ES ① 目录 一、Springboot 整合 Elasticsearch 1、RestHighLevelClient API介绍 1.1、全查询 & 分页 & 排序 1.2、单条件查询…

【linux线程(一)】什么是线程?怎样操作线程?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux线程 1. 前言2. 什么是线…

使用 Unity 创建 Apple Vision Pro 应用程序和内容的步骤

我们总结了使用 Unity 创建 Apple Vision Pro 应用程序和内容的步骤。 我们总结了使用 visonOS 模拟器检查操作的步骤。 基础知识是按照官方手册进行的,但是有一些部分是我遇到的,所以我附上了很多截图作为备忘录。 参考文章 Unity官方功能页面Unity官方博客Unity官方手册

使用cmd命令运行java

1.普通项目(不带lib文件夹) 1.在桌面上建一个名为com的文件夹&#xff0c;在文件夹中用记事本写两个类文件&#xff0c;后缀改为.java。两个类文件的内容如下图所示&#xff1a; 2.使用javac命令编译主函数&#xff0c;命令行为javac TestMain.java。结果可以看到自动生成了两…

Pygame教程07:键盘常量+键盘事件的2种捕捉方式

------------★Pygame系列教程★------------ Pygame教程01&#xff1a;初识pygame游戏模块 Pygame教程02&#xff1a;图片的加载缩放旋转显示操作 Pygame教程03&#xff1a;文本显示字体加载transform方法 Pygame教程04&#xff1a;draw方法绘制矩形、多边形、圆、椭圆、弧…

理论学习 BatchNorm2d

import torch import torch.nn as nn# With Learnable Parameters m nn.BatchNorm2d(100) # Without Learnable Parameters m nn.BatchNorm2d(100, affineFalse) input torch.randn(20, 100, 35, 45) output m(input)print(output) print(output.shape)这段代码展示了如何使…

2024蓝桥杯每日一题(二分)

一、第一题&#xff1a;教室 解题思路&#xff1a;二分差分 对天数进行二分&#xff0c;在ck函数中用差分方法优化多次区间累加。 【Python程序代码】 n,m map(int,input().split()) a [0] list(map(int,input().split())) d,s,t [0]*(m5),[0]*(m5),[0]*(m5) for…

你还可以通过“nrm”工具,来自由管理“npm”的镜像

你还可以通过“nrm”工具&#xff0c;来自由管理“npm”的镜像 nrm&#xff08;npm registry manager&#xff09;是npm的镜像管理工具&#xff0c;有时候国外的资源太慢&#xff0c;使用这个就可以快速地在npm源间切换。 1.安装nrm 在命令行执行命令&#xff0c;npm install…

Docker容器化技术(数据卷的管理)

数据卷 是一个可供容器使用的特殊目录&#xff0c;它将主机操作系统目录直接 映射进容器&#xff0c;类似于 Linux 中的 mount 行为 。 数据卷&#xff1a;可以提供很多有用的特性 数据卷可以在容器之间共事和重用&#xff0c;容器间传递数据将变得高效与方便&#xff1b;对数…

使用huggingface实现AltCLIP进行对齐语言和图像

目录 引言 使用例子 AltCLIPConfig 参数 示例 AltCLIPTextConfig 参数详解 示例 AltCLIPVisionConfig 参数详解 示例 AltCLIPProcessor 参数 方法 示例使用 AltCLIPModel 前向传播方法 forward 返回值 示例使用 AltCLIPTextModel 方法 forward 返回值 示…

如何选择合适的IP代理,如何为网络爬虫设置代理

目录 前言 1. 代理类型的选择 2. 代理速度 3. 代理稳定性 4. 代理的匿名性 5. 代理的地理位置 总结 前言 在进行网络爬虫任务时&#xff0c;为了避免被目标网站封禁IP或限制访问频率&#xff0c;我们通常会使用代理来隐藏真实的IP地址。选择合适的IP代理对于爬虫的成功…