Pythonを使ってPDFの改行無しの翻訳をDeepLで実行する バージョン2


目的

ショットカットキーとSeleniumを使いdeeplでの翻訳を改行無しで実行します。

github

https://github.com/komo135/deepl-pdf-trans

インストール

まずwebdriverをdriver installからインストールし、作業ディレクトリと同じ場所においてください。

次にpythonの必要なパッケージをインストールします。

pip install selenium pyperclip keyboard pyautogui

コード

from selenium import webdriver
from selenium.webdriver.common.by import By
import pyperclip
import re
import keyboard
import pyautogui
import sys


def main():
    try:
        pyautogui.hotkey("ctrl", "c")  # Copy text from select text
        try:
            # Make selenium the top screen
            driver.minimize_window()
            driver.maximize_window()
        except:
            pass

        # Get input fields using xpath
        text_area = driver.find_element(By.XPATH, "//*[@id='panelTranslateText']/div[3]/section[1]/div[3]/div[2]/textarea")
        # Empty input fields
        text_area.clear()

        # Accepts clipboard values as variables and removes line breaks
        text = pyperclip.paste()
        text = re.sub(r"([a-zA-Z0-9,]+)\r\n|([a-zA-Z0-9,]+)\n|([a-zA-Z0-9,]+)\r", r"\1 ", text).replace("  ", " ")
        # To remove "-¥r¥n", encode once, then remove and decode
        text = re.sub(b"\xe2\x80\x90\r\n|\xe2\x80\x90\r|\xe2\x80\x90\n", b"", text.encode()).decode()
        text = re.sub(r"\r\n|\r|\n", "\n\n", text).replace("\n\n\n", "\n")
        pyperclip.copy(text)

        text_area.click()
        pyautogui.hotkey("ctrl", "v")

        driver.find_element(By.ID, "tabTranslateText").click()

    except:
        print("An error has occurred.")


if __name__ == "__main__":
    lang = sys.argv[1] if len(sys.argv) == 2 else "ja"
    url = f"https://www.deepl.com/{lang}/translator"

    driver = webdriver.Chrome()
    driver.get(url)

    keyboard.add_hotkey("ctrl+q", main)
    keyboard.wait("esc")

解説

インポート

必要なパッケージをインポートします。

from selenium import webdriver
from selenium.webdriver.common.by import By
import pyperclip
import re
import keyboard
import pyautogui
import sys

テキストのコピーと改行の削除

1 まず選択しているテキストをコピーします。

pyautogui.hotkey("ctrl", "c")

2 次にクリップボードにあるテキストをpythonの変数として受けとり、.以外の改行を削除します。

text = pyperclip.paste()
text = re.sub(r"([a-zA-Z0-9,]+)\r\n|([a-zA-Z0-9,]+)\n|([a-zA-Z0-9,]+)\r", r"\1 ", text).replace("  ", " ")

3 "load‐ing"といった単語の途中で改行をしている文字がある場合text.replace(r"-\r\n", "")では削除ができないので一旦バイナリ形式にしてバイナリの文字列を削除します。

text = re.sub(b"\xe2\x80\x90\r\n|\xe2\x80\x90\r|\xe2\x80\x90\n", b"", text.encode()).decode()

4 改行がある場合一段空白をつくり、全ての処理が終えたらクリップボードにテキストをコピーします。

text = re.sub(r"\r\n|\r|\n", "\n\n", text).replace("\n\n\n", "\n")
pyperclip.copy(text)

webdriver

1 deeplの翻訳サイトをトップ画面に持ってきます。その時にエラーが発生することがありますので例外処理で実行します。
画面が最小化されていない場合だとdriver.maximize_window()を実行してもトップ画面にならないのでdriver.minimize_window()も実行させます。

try:
    driver.minimize_window()
    driver.maximize_window()
except
    pass

2 xpathを使ってテキストの入力フォームを取得し、すでに入力されている場合空にします。

text_area = driver.find_element(By.XPATH, "//*[@id='panelTranslateText']/div[3]/section[1]/div[3]/div[2]/textarea")
text_area.clear()

3 入力フォームにテキストを貼り付け、ページの上に移動します。

text_area.click()
pyautogui.hotkey("ctrl", "v")

driver.find_element(By.ID, "tabTranslateText").click()

ショートカットキーの登録と実行

  1. 引数として翻訳したい言語を設定します。何も入力がなければ日本語が選択されます。
  2. deeplのサイトを開きます。
  3. ショートカットキーを登録します。
if __name__ == "__main__":
    lang = sys.argv[1] if len(sys.argv) == 2 else "ja"
    url = f"https://www.deepl.com/{lang}/translator"

    driver = webdriver.Chrome()
    driver.get(url)

    keyboard.add_hotkey("ctrl+q", main)
    keyboard.wait("esc")

実行

スクリプトを"trans.py"としてwebdriverと同じディレクトリに保存します。
image.png
以下のコマンドをコマンドプロンプトで入力します。

python trans.py ja

登録してあるショットカットキーを押せば以下のようになります。
image