介绍
包括我自己在内的很多人都尝试过翻译PDF英文论文,有的作为服务提供,但最终使用起来很麻烦。
复制→直接在DeepL主页上翻译
你回来了吗没错,就是我。
你有什么烦恼?
我认为这是我每次都必须密切关注原始论文的一点。
如果是这样,如果它可以显示为原始句子顶部的叠加层,则更易于阅读。 . . ?
让我们来吧。
这个怎么运作
二手PDF →PRL 104, 037002
执行
我对节目的内容不感兴趣。
我想要功能。就这样。(类似于 Fukusuna i Tochika)我想有很多人这样做,所以请先实施。
from threading import Thread
import win32api
from PIL import ImageGrab
import pyocr
import ctypes
import time
import tkinter as tk
from requests import post
class ClipboardOCR:
def __init__(self):
self.tool = pyocr.get_available_tools()[0]
self.builder = pyocr.builders.TextBuilder(tesseract_layout=6)
self.text = ""
def run(self, lang="jpn"):
img = ImageGrab.grabclipboard()
if img:
self.text = self.tool.image_to_string(img, lang=lang, builder=self.builder)
return self.text
def get_key_state(keycode):
return win32api.GetAsyncKeyState(keycode) >> 15 < 0
def runClipboardOCR(lang="eng"):
text = c.run(lang)
return text
class Translator:
def __init__(self, auth_key):
self.data = {
"source_lang": "EN",
"target_lang": "JA",
"split_sentences": "nonewlines",
"auth_key": auth_key,
}
def translate(self, tk, text):
task = Thread(
target=self._translate,
args=(
tk,
text,
),
daemon=True,
)
task.start()
def _translate(self, tk, text):
tr_text = (
post(
"https://api-free.deepl.com/v2/translate",
data=self.data | {"text": text},
)
.json()["translations"][0]
.get("text")
)
print(tr_text)
tk.label["text"] = tr_text
x1, x2, y1, y2 = tk.coor
tk.geometry(f"{x2-x1}x{max(tk.label.winfo_reqheight()+40, y2-y1)}+{x1}+{y1}")
class Application(tk.Tk):
def __init__(self, x1, x2, y1, y2):
super().__init__()
self.coor = x1, x2, y1, y2
self.title("Transparent window")
self.attributes("-alpha", 0.95)
self.attributes("-topmost", True)
self.bind("<Configure>", self.sized)
self.bind("<Shift-ButtonPress-1>", toggleOverrideRedirect)
time.sleep(0.5)
self.quit = tk.Button(self, text="x", command=self.destroy)
self.quit.place(relx=1, rely=0, anchor="ne")
self.text = runClipboardOCR()
self.label = tk.Label(
self,
font=("游ゴシック", "12"),
anchor="e",
justify="left",
text=self.text,
)
tr.translate(self, self.text)
self.label.pack(expand=True)
self.geometry(
f"{x2-x1}x{max(self.label.winfo_reqheight()+40, y2-y1)}+{x1}+{y1}"
)
def sized(self, *args):
self.label["wraplength"] = self.winfo_width() - 40
def toggleOverrideRedirect(ev):
win = ev.widget.winfo_toplevel()
win.overrideredirect(not win.overrideredirect())
win.withdraw()
win.deiconify()
win.focus_force()
return
def get_rectcoordinate():
class _pointer(ctypes.Structure):
_fields_ = [
("x", ctypes.c_long),
("y", ctypes.c_long),
]
point = _pointer()
vk_leftbutton = 0x01
while 1:
if ctypes.windll.user32.GetAsyncKeyState(vk_leftbutton) == 0x8000:
ctypes.windll.user32.GetCursorPos(ctypes.byref(point))
x1, y1 = point.x, point.y
while ctypes.windll.user32.GetAsyncKeyState(vk_leftbutton) == 0x8000:
pass
break
ctypes.windll.user32.GetCursorPos(ctypes.byref(point))
x2, y2 = point.x, point.y
return x1, x2, y1, y2
if __name__ == "__main__":
AUTH_KEY = # auth_keyを入力
c = ClipboardOCR()
tr = Translator(AUTH_KEY)
while True:
if get_key_state(91) and get_key_state(16) and get_key_state(83):
app = Application(*get_rectcoordinate())
app.overrideredirect(1)
app.mainloop()
用法
- 安装各种库,Tesseract OCR。
- 获取 DeepL 帐户(您将被要求输入您的信用卡信息以防止多次免费信用,但除非您注册为付费会员,否则不会向您收费。(2022/10))
- 登录后,在程序底部的
# auth_keyを入力部分输入“帐户”→“帐户”→“DeepL API 的验证密钥”中列出的验证密钥。 - 运行程序
- 使用“Windows 键”+“Shift”+“S”对指定区域进行截图。
* 不支持同时显示多个窗口。必要时请自行实施。
结构体
- 检测到按“Windows 键”+“Shift”+“S”
- 记录左键单击位置和释放位置
- OCR 用于复制到剪贴板的屏幕截图图像
- 投递到 DeepL API
- 在录制区创建Tkinter窗口,显示原始
- 用返回的翻译结果覆盖
综上所述
我写这篇文章是为了摆脱我的硕士论文。它很辣。
一直没能整理好,所以代码有点脏,还请见谅。
参考
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308630811.html