1现有解析pdf的方法
使用org.apache.pdfbox读取pdf,只能读取pdf中的文字,有些纸件扫描成的pdf文字会错乱,有些字还是图片的方式显示的,导致读取的内容不全,常常会获取不到想要的数据。
2 OCR文字识别
pdf需要转换为图片,进行识别,识别率高。
2.1 调用百度接口
优点:识别率高,识别速度快
缺点:按次收费
2.2 使用开源工具读取pdf文档
2.2.1 下载工具包
https://github.com/tesseract-ocr/tessdata 下载chi_sim.traineddata,chi_sim_vert.traineddata
2.2.2 添加依赖
<dependencies>
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.4.0</version>
</dependency>
</dependencies>
2.2.3 编写程序
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
public class TestTess {
public static void main(String[] args) {
// 识别图片的路径(修改为自己的图片路径)
String path = "C:\\work\\notebook\\prototype\\target\\qq1.jpg";
// 语言库位置(修改为跟自己语言库文件夹的路径)
// String lagnguagePath = "C:\\work\\projects\\tess\\resources\\tessdata";
File file = new File(path);
ITesseract instance = new Tesseract();
//设置训练库的位置
//instance.setDatapath(lagnguagePath);
//chi_sim :简体中文, eng 根据需求选择语言库
instance.setLanguage("chi_sim");
String result = null;
try {
long startTime = System.currentTimeMillis();
result = instance.doOCR(file);
long endTime = System.currentTimeMillis();
System.out.println("Time is:" + (endTime - startTime) + " 毫秒");
} catch (TesseractException e) {
e.printStackTrace();
}
System.out.println("result: ");
System.out.println(result);
}
}
2.3 读取pdf的特定位置的数据
2.3.1 手动截取pdf指定矩形区域的材料
需要前端配合做页面,改成自动获取,这样增加文档类型时,需要配置一下。
2.3.2 Python程序获取图片标识区域在整个文档中的矩形坐标
import aircv
def matchImg(imgsrc, imgobj, confidence=0.2):
"""
图片对比识别imgobj在imgsrc上的相对位置(批量识别统一图片中需要的部分)
:param imgsrc: 原始图片路径(str)
:param imgobj: 待查找图片路径(模板)(str)
:param confidence: 识别度(0<confidence<1.0)
:return: None or dict({'confidence': 相似度(float), 'rectangle': 原始图片上的矩形坐标(tuple), 'result': 中心坐标(tuple)})
"""
imsrc = aircv.imread(imgsrc)
imobj = aircv.imread(imgobj)
match_result = aircv.find_template(imsrc, imobj,
confidence) # {'confidence': 0.5435812473297119, 'rectangle': ((394, 384), (394, 416), (450, 384), (450, 416)), 'result': (422.0, 400.0)}
if match_result is not None:
match_result['shape'] = (imsrc.shape[1], imsrc.shape[0]) # 0为高,1为宽
return match_result
template = {
'address':'dz.jpg','doc_num':'fw.jpg','doc_type':'fwlx.jpg','issue_date':'fwrq.jpg',
'int_cls': 'splb.jpg','apply_num':'sqh.jpg','applyer':'sqr.jpg','content':'zw.jpg'}
for key, value in template.items():
orig = matchImg("target/qq.jpg","target/"+value)
rect = orig['rectangle']
w = rect[3][0] - rect[0][0]
h = rect[3][1] - rect[0][1]
x = rect[0][0]
y = rect[0][1]
ret = [x,y,w,h]
print(key,ret)
2.3.3 Java程序根据矩形区域坐标,获取指定位置信息
package odysssey.tess;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
import java.awt.Rectangle;
import net.sourceforge.tess4j.ITessAPI.TessPageIteratorLevel;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
public class TestTess {
public static void main(String[] args) throws IOException {
// 识别图片的路径(修改为自己的图片路径)
String path = "C:\\work\\notebook\\prototype\\target\\qq.jpg";
// 语言库位置(修改为跟自己语言库文件夹的路径)
// String lagnguagePath = "C:\\work\\projects\\tess\\resources\\tessdata";
File file = new File(path);
ITesseract instance = new Tesseract();
//设置训练库的位置
/*
address [61, 312, 734, 82]
doc_num [1002, 338, 527, 78]
doc_type [425, 736, 801, 82]
issue_date [64, 593, 495, 64]
int_cls [115, 969, 346, 82]
apply_num [676, 589, 388, 68]
applyer [72, 450, 481, 68]
content [107, 899, 1439, 70]
*/
int rects[][] = {
{
61, 312, 734, 82},
{
1002, 338, 527, 78},
{
425, 736, 801, 82},
{
64, 593, 495, 64},
{
115, 969, 346, 82},
{
676, 589, 388, 68},
{
72, 450, 481, 68},
{
107, 899, 1439, 70}};
//chi_sim :简体中文, eng 根据需求选择语言库
instance.setLanguage("chi_sim");
instance.setTessVariable("user_defined_dpi", "96");
String result = null;
try {
long startTime = System.currentTimeMillis();
//result = instance.doOCR(file);
for(int i = 0 ;i < rects.length;i++){
Rectangle rr = new Rectangle(rects[i][0],rects[i][1],rects[i][2],rects[i][3]);
result =instance.doOCR(file, rr);
System.out.println(result);
}
/* List<Rectangle> resul=instance.getSegmentedRegions(ImageIO.read(file), TessPageIteratorLevel.RIL_SYMBOL);
for (int i = 0; i < resul.size(); i++) {
Rectangle rect = resul.get(i);
System.out.println(String.format("Box[%d]: x=%d, y=%d, w=%d, h=%d", i, rect.x, rect.y, rect.width, rect.height));
}
*/ long endTime = System.currentTimeMillis();
System.out.println("Time is:" + (endTime - startTime) + " 毫秒");
} catch (TesseractException e) {
e.printStackTrace();
}
}
}
文章浏览阅读6.4w次。 做的笔记大致就是这样子的 2014 2014-8-2 11. manual automatism automatic atom anatomy atomic audio auto video audit commission 1audit commission 1audit pass 1事务:ACID (Atomicity Consistency Isola..._log infree accountall girls cams▼filterseeyamin19milk_mm20lumifoxi23pre
文章浏览阅读492次。这两个字段取消注释,改成我们初始化主节点里的“--pod-network-cidr=” 的字段值。其中生成的 kubeadm join字段,第一个是能把机器变成主节点的命令,第二个是能把机器变成从节点的命令。#所有机器添加master域名映射,以下需要修改为自己的。可以敲如下命令查看当前的k8s集群(只初始化了主节点)初始化主节点(下面只在主节点执行)#各个机器设置自己的主机名。#各个机器分别执行下面内容。#各个机器分别执行下面内容。#各个机器分别执行如下内容。#打印加入节点的命令。_yum 安装 kubeadmin
文章浏览阅读851次。负log loss;binary crossentropy;focal loss;网上找到的loss写的都普遍复杂,我自己稍微写的逻辑简单一点。if inputs.is_cuda and not self.alpha.is_cuda: self.alpha = self.alpha.cuda()focal lossfocal loss仔细实践起来可以分为两..._pytorch focal loss binary cross_entropy
文章浏览阅读1.7k次。mybatis其实就是ibatis的升级版本不仅能在java上使用,asp.net照样可以使用mybatis来开发程序。mybatis是一个比较小巧的ORM框架,类似hibernate。自己试了一下用法和java上的mybatis差不多。这次在.net的平台上我也来小试牛刀,弄个小程序出来看看,开发之前要去mybatis官网上下载2个包。1.asp.net版本的mybatis下载地址是http..._.net mybatis
文章浏览阅读1k次,点赞19次,收藏11次。至此,关于pinctrl_bind_pins函数的重要内容就讲解完成了,通过pinctrl_bind_pins函数实现了为给定的设备绑定引脚,并在绑定过程中选择和设置适当的pinctrl状态,在124.1小节最后提出的struct pinctrl_state *default_state跟pinctrl_map结构体是什么时候建立起联系的问题也就解决了。·对于引脚复用设置(PIN_MAP_TYPE_MUX_GROUP),调用pinmux_enable_setting()函数来启用该设置。_rk3568 复用配置
文章浏览阅读492次。首先是登录阿里云账号,如果没有阿里云账号的需要先注册,然后完成实名认证。这里企业认证和个人认证都可以。接着领取账号免费试用的权益。在权益中心免费试用里面,选择交互式建模PAI-DSW,领取后将会获得3个月的免费试用时长。进入控制台,在上述界面中选择人工智能平台PAI,在左边菜单栏选择交互式建模(DSW)。点击创造实例,填写实例名称,资源组选择GPU规格只有这个选项支持试用资源包的抵扣。镜像选择官方镜像即可,我此时的镜像为接着下一步创建实例即可。等待环境准备完毕后启动打开即可。_阿里云 chatglm2
文章浏览阅读3.8k次。找到你想修改的classname全局覆盖样式::global { .ant-table { height: 220px; overflow-x: auto; }}单个独立样式:.mytables { :global { .ant-table { height: 220px; overflow-x: auto; } }}也可以设置多个样式:.mytables { :global { .ant-table table { text-a_antd 全局替换字体
文章浏览阅读485次。视频会议普及后,对摄像头人像的处理需求倍增。腾讯会议、Zoom会议等网络会议软件虽然有摄像头加虚拟背景功能,但是其功能有限,抠像不清晰。本文实现了对摄像头视频的抠像处理,并把摄像映射在一个虚拟摄像头(AI_Camera),此虚拟摄像头可以被各种网络会议软件使用,也可拍照;3、抠图算法的模型有4种:粗糙、细致、精细、超细,可以根据需要随意选择;简陋模型处理速度最快、超细的速度最慢。快慢也与视频分辨率强相关。1、对包含人像的摄像头实时视频进行抠像,并替换背景(可以替换成纯色的、也可以替换成指定背景图片);_实时抠像摄像头
文章浏览阅读6k次,点赞4次,收藏12次。1:只能输入数字。如果还需要调用方法或多条规则来限制该输入框,用 ; 隔开。oninput="value=value.replace(/[^\d]/g,'');lessNum(this)"2:只能输入数字和小数点。其中d{0,2}为限制小数点的位数,2代表小数点后2位。oninput="value=value.replace(/^\D*(\d*(?:\.\d{0,2})?).*$/g, '..._input只能输入数字和小数点
文章浏览阅读724次,点赞19次,收藏19次。pigx中作者采用了动态获取路由配置信息,即路由信息是通过数据库进行配置而不是之前固定写在yml或properties文件中。pigx框架中有几个基础微服务分别是:register(一般是nacos的注册中心和配置中心),auth(认证服务)、upms(登录和项目初始化数据加载)、gateway(网关服务)。_pigx 静态路由配置
文章浏览阅读698次,点赞2次,收藏3次。然后打开我们的虚拟机,我们打开disk工具,也可以查看到我们新添加的硬盘。这时我们就可以看到我们新的硬盘已经被创建了。(我们的虚拟机必须要是关机状态!_parallels desktop 给虚拟机添加d盘
文章浏览阅读944次。一、线程间通信概念:多个线程在处理同一个资源,但是处理的动作(线程任务)却不同比如:线程A用来生成包子,线程B用来吃包子,包子可以理解为同一资源,线程A和线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题。多个线程并发执行时,在默认情况下cpu是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。 ..._等待唤醒机制