forked from hiroi-sora/PaddleOCR-json
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPPOCR_api.ps1
146 lines (135 loc) · 6.02 KB
/
PPOCR_api.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# 调用 PaddleOCR-json.exe 的 PowerShell Api
# 项目主页:
# https://github.com/hiroi-sora/PaddleOCR-json
###########################################################################
function asc($param){
##用来转换中文至\uxxxx的函数
$rtn = ''
$list = $param -split ''
foreach ($char in $list){
if($char -ne ''){
if([int]([char]$char) -gt 32 -and [int]([char]$char) -lt 127){
$rtn += $char
}
else{
$rtn += ("\u" + ("{0:x}" -f [int]([char]$char)))
}
}
}
return $rtn
}
###########################################################################
class PPOCR {
[System.Object]$process # 子进程对象
[int] $runFlag = 0 # 运行标志。0正在初始化,1正常运行中
[System.Diagnostics.Process] $stdSender # 保存子进程stdout管道
[int] $__ENABLE_CLIPBOARD = 0 # 剪贴板是否启用。0禁用,1启用
[string] $imgJson # 缓存图片识别结果json字符串
[string] $processID # OCR子进程id,用于组成标识符
[string] $eventInit # OCR初始化完成的事件标识符,启动时定义
[string] $eventJson # 一次取得json完成的事件标识符,传入图片时重新定义
PPOCR( [string]$exePath,[string]$arg ) {
# 初始化识别器。
# :exePath: 识别器`PaddleOCR_json.exe`的路径。
$WorkingDirectory = Split-Path -Path $exePath # 工作目录为父目录
# 初始化进程信息,重定向输入和输出
$psi = New-Object System.Diagnostics.ProcessStartInfo
$psi.FileName = $exePath
$psi.WorkingDirectory = $WorkingDirectory
$psi.Arguments = $arg
$psi.RedirectStandardInput = $true
$psi.RedirectStandardOutput = $true
$psi.CreateNoWindow = $true
$psi.UseShellExecute = $false
# 初始化进程对象
$this.process = New-Object System.Diagnostics.Process
$this.process.StartInfo = $psi
# 给进程对象添加OutputDataReceived(得到进程输出内容)事件的订阅。通过-MessageData将$this传入-action作用域。
Register-ObjectEvent -InputObject $this.process -EventName OutputDataReceived -action $this.getStdout -MessageData $this
# 启动进程
$this.process.Start()
$this.process.BeginOutputReadLine()
# 等待初始化完成事件
$this.processID = $this.process.Id # 记录进程号
$nowTime = Get-Date -Format "HHmmssffff"
$this.eventInit = "OCRinit" + $this.processID + $nowTime # 生成事件标识符
# Write-Host "初始化OCR等待中,事件标识符为"($this.eventInit)
Wait-Event -SourceIdentifier $this.eventInit # 阻塞,等待初始化完成事件
Write-Host "初始化OCR成功,进程号为"($this.process.Id)
}
# 接收stdout数据的action
[ScriptBlock] $getStdout = {
$this_ = $Event.MessageData # 获取所属对象
$this_.stdSender = $Event.Sender # 将输入接口发送到调用对象
$getData = $Event.SourceEventArgs.Data
switch ( $this_.runFlag ) {
# 初始化中,等待取得完成标志
0 {
if ( $getData.contains("OCR init completed.") ) {
$this_.runFlag = 1
New-Event -SourceIdentifier $this_.eventInit # 发送初始化完成事件
}
elseif ( $getData.contains("OCR clipboard enbaled.") ) {
$this_.__ENABLE_CLIPBOARD = 1 # 检测到剪贴板已启用
}
break
}
# 正常运行中
1 {
$this_.imgJson = $getData
New-Event -SourceIdentifier $this_.eventJson # 发送取得json事件
break
}
}
}
[PSCustomObject] isClipboardEnabled() {
return $this.__ENABLE_CLIPBOARD;
}
[PSCustomObject] runDict( [string]$writeDict ) {
if ($this.stdSender) {
$nowTime = Get-Date -Format "HHmmssffff"
$this.eventJson = "OCRjson" + $this.processID + $nowTime # 更新事件标识符
$this.stdSender.StandardInput.WriteLine($writeDict); # 向管道写入
Wait-Event -SourceIdentifier $this.eventJson # 阻塞,等待取得json
try {
$getdict = $this.imgJson | ConvertFrom-Json
return $getdict
}
catch {
return @{code = 402; data = "识别器输出值反序列化JSON失败,疑似传入了不存在或无法识别的图片。异常信息:$($PSItem.ToString())原始内容:$($this.imgJson)" }
}
}
else {
# 输入流不存在,可能为未初始化完毕
return @{ code = 400; data = "子进程输入流不存在" }
}
}
# 识别图片
[PSCustomObject] run( [string]$imgPath ) {
# 对一张图片文字识别。
# :imgPath: 图片路径。
$writeDict = asc (@{ image_path = $imgPath } | ConvertTo-Json -Compress) #更新图片路径为json格式,asc函数替换中文
return $this.runDict($writeDict); # 向管道写入图片路径
}
[PSCustomObject] runClipboard() {
if ( $this.__ENABLE_CLIPBOARD ) {
return $this.run("clipboard");
}
else {
throw "剪贴板功能不存在或已禁用。"
}
}
[PSCustomObject] runBase64( [string]$imgBase64 ) {
$writeDict = @{ image_base64 = $imgBase64 } | ConvertTo-Json -Compress
return $this.runDict($writeDict);
}
[PSCustomObject] runByte( $imgByte ) {
$imgBase64 = [convert]::ToBase64String($imgByte)
return $this.runBase64($imgBase64);
}
# 结束子进程
[void] stop() {
$this.stdSender.StandardInput.WriteLine('{"exit":""}')
Write-Host "识别器进程结束。"
}
}