介绍

包括我自己在内的很多人都尝试过翻译PDF英文论文,有的作为服务提供,但最终使用起来很麻烦。
复制→直接在DeepL主页上翻译
你回来了吗没错,就是我。

你有什么烦恼?
我认为这是我每次都必须密切关注原始论文的一点。

如果是这样,如果它可以显示为原始句子顶部的叠加层,则更易于阅读。 . . ?

让我们来吧。

这个怎么运作

二手PDF →PRL 104, 037002
DeepL APIを使って英語論文をサクッと翻訳するツールを作った。【Python】

执行

我对节目的内容不感兴趣。
我想要功能。就这样。(类似于 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窗口,显示原始
  • 用返回的翻译结果覆盖

综上所述

我写这篇文章是为了摆脱我的硕士论文。它很辣。
一直没能整理好,所以代码有点脏,还请见谅。

参考

隐藏 Tkinter 的标题栏等的部分
检测左键坐标的部分


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308630811.html

相关文章:

  • 2021-12-31
  • 2021-09-24
  • 2021-11-10
  • 2021-11-16
  • 2022-01-14
  • 2021-12-03
  • 2021-06-19
猜你喜欢
  • 2021-10-22
  • 2021-12-21
  • 2021-10-31
  • 2021-11-14
  • 2021-12-09
  • 2021-07-03
  • 2021-08-03
相关资源
相似解决方案