Python3开发快速获取图片的文字

简介: 我工作接触 PDF 文档较多,很多 PDF 文档由图片组成的,不能够复制文字?要是有一个程序能够快速获取文本的软件就好了。

如何响应截图

初步想法 : 之前学过MFC编程,首先想到的是,通过 hook 方式,拦截鼠标键盘消息,根据按键截取屏幕区域的图片。

Python 具有丰富的库,要想实现实现 hook 分分钟的事,pyHook 模块是网上使用最多的。当运行时,其库很快就崩溃了, 其对 py3支持很不友好,短时间内没办法修复。放弃使用该方式。

很好,不能被动等待鼠标和键盘消息,主动查询方式岂不是更快。需要安装 pywin32 模块: pywin32-224-cp36-cp36m-win_amd64.whl,使用封装 windows API.

只需要获取键盘Ctrl键和鼠标左键状态(抬起与按下状态)

from win32 import win32api
helper_key_status = 0x8000 & win32api.GetKeyState(VK_CONTROL)
button_status = 0x8000 & win32api.GetKeyState(VK_LBUTTON)

通过一个线程主动查询,间隔 0.001 秒, 第一次点击记录左上角的点位置,第二次点击记录右下角点位置。

获取鼠标点位置:

x, y = win32api.GetCursorPos()

截取图片

最常用的是 pillow 模块,需要 pip install pillow

from PIL import ImageGrab

img = ImageGrab.grab((point1.x, point1.y, point2.x, point2.y))
img.save(img_path, "PNG")

识别图片文字

嗯,百度开放了免费通用的百度ocr 识别技术

详情参见 api 文档。需要获取 access_token, 且具有过期时间, 使用 GET 请求获取数据。

获取 access_token

def _get_baidu_access_token():
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Bjm0X1hsLxrxsyA3hyuSUuke&client_secret=P6CBRGWnmTUSOboM0Dao5ZUI51SW8ODE'
    req = request.Request(host, headers={'Content-Type': 'application/json; charset=UTF-8'})
    res = request.urlopen(req)
    res = res.read()
    res = json.loads(res, encoding='utf-8')
    return res.get('access_token', '')

获取图片文字

def fetch_picture_ocr(params: 'dict'):
    """ 采用 百度 ocr 识别技术.
    :param params: dict, 所需要的参数
    :return: 识别结果
    """

    host = params['host']
    img_path = params['img_path']

    if not os.path.exists(img_path):
        return None

    with open(img_path, 'rb') as f:
        data = base64.b64encode(f.read())
        textmod = {'image': data, }
        textmod = parse.urlencode(textmod).encode(encoding='utf-8')
        req = request.Request(host, headers={'Content-Type': 'application/x-www-form-urlencoded'}, data=textmod)
        res = request.urlopen(req)
        res = res.read()
        res = json.loads(res, encoding='utf-8')
        return res

文字写入粘贴板

将获取的文字写入粘贴板,直接粘贴,方便快速。

def write_text_clipboard(text: 'str'):
    CF_UNICODETEXT = 13
    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardData(CF_UNICODETEXT, text)
    win32clipboard.CloseClipboard()

打包成exe程序

打包成 exe 程序可以方便程序分发,即使没有安装 python 解释器的同学也可以使用。

安装 PyInstaller以及打包成 exe程序,参见文章 博友Go_Pythoner
值得注意的是,生成后台运行的 exe 程序,增加命令参数:--noconsole 就行了。

加好友 & 工程下载

完整工程下载路径
Python3开发快速获取图片的文字