hiroi-sora / Umi-OCR

OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。
MIT License
24.51k stars 2.48k forks source link

请问作者大大还有没有实现这个发送按键功能的计划呢 #370

Closed plainround closed 6 months ago

plainround commented 6 months ago

https://github.com/hiroi-sora/Umi-OCR/issues/160 https://private-user-images.githubusercontent.com/56373419/246670568-8b4da183-d4f9-4f06-b39f-2fab85d37d80.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDg4MzgxNTcsIm5iZiI6MTcwODgzNzg1NywicGF0aCI6Ii81NjM3MzQxOS8yNDY2NzA1NjgtOGI0ZGExODMtZDRmOS00ZjA2LWIzOWYtMmZhYjg1ZDM3ZDgwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDAyMjUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwMjI1VDA1MTA1N1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc2YmZjM2M4OGNjYjk2ZmYzODI2ZmM3YjI5ZGNlZjdmMDhlM2IzNzkzOGI0MjEwY2QyNDkwOThmYzlkZTk1MmYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.SQgMFVbhZ4na5ned7WMNG0QOEVkqwTdod48cToJn_XQ https://github.com/hiroi-sora/Umi-OCR/issues/146 就是这个V2.0有计划但发布后尚未实现的功能。

在线翻译,或者与第三方翻译工具的联动。

目前我使用umiocr实现操作需要三步, win+alt+c 开启ocr功能/框选截取词语图片/ctrl+c+c 触发goldendict快捷键, 如果实现这个功能在截图后直接发送快捷键,就能简化到两步,非常方便。

虽然也有替代方法https://forum.freemdict.com/t/topic/7166 但需要开机自启额外的软件,每次重新配置也有点麻烦,而且umiocr用户体验更好,如果能实现这个功能,对学习很有帮助!

此外关于这一翻译功能,个人理解在线翻译,虽然适合快速阅读大量外语,但如果是为了学习语言,准确理解词意用法,还是本地的goldendict这样的本地词典软件搭配专业词典资源更合适。 关于词典软件不支持翻译句子,现在也已经有不错的解决方案https://github.com/xinebf/google-translate-for-goldendict

hiroi-sora commented 6 months ago

主要是我在纠结,以前的 联动翻译功能 对于普通用户不太容易理解,不够优雅。我在思考怎么能更有机的整合翻译方案。未来我是希望让Umi本身能实现翻译功能的。

对于目前版本,截图联动功能的实现是非常简单的,有需要的用户可以参考下述步骤在代码中开启:

  1. 用记事本或编辑器打开 UmiOCR-data\py_src\tag_pages\ScreenshotOCR.py
  2. 在第110行,即函数 def _onEnd 的末尾,self.callFunc(update)的后面,添加如下代码(句首空格必须与这里一样):
        from pynput import keyboard

        def send(keyList):
            for i in range(len(keyList)):
                if hasattr(keyboard.Key, keyList[i]):
                    keyList[i] = getattr(keyboard.Key, keyList[i]).value
            with keyboard.Controller().pressed(*tuple(keyList)):
                pass

        send(["ctrl", "c"])

想修改按键种类或次数,改动最后一行的 send 即可,比如改成 alt+ctrl+shift+v 三次:

        send(["alt", "ctrl", "shift", "v"])
        send(["alt", "ctrl", "shift", "v"])
        send(["alt", "ctrl", "shift", "v"])
plainround commented 6 months ago

非常感谢您的帮助,对您开发开源程序依然力求用户友好的态度感到十分敬佩。 我发现如果只发送一遍按键,在选项 弹出主窗口 关闭时,且umiocr程序最小化到右下角托盘的情况下,程序获取到ocr结果,但第三方词典没反应。 选项 弹出主窗口 打开时,则有反应。 设置发送两次按键就没有这个问题了。 目前的代码是

        def send(keyList):
            for i in range(len(keyList)):
                if hasattr(keyboard.Key, keyList[i]):
                    keyList[i] = getattr(keyboard.Key, keyList[i]).value
            with keyboard.Controller().pressed(*tuple(keyList)):
                pass

        send(["ctrl", "c", "c"])
        send(["ctrl", "c", "c"])

目前没有问题。