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

# 目的
ショットカットキーとSeleniumを使いdeeplでの翻訳を改行無しで実行します。
# github
https://github.com/komo135/deepl-pdf-trans

# インストール
まずwebdriverを[driver install](https://www.selenium.dev/ja/documentation/webdriver/getting_started/install_drivers/)からインストールし、作業ディレクトリと同じ場所においてください。

次にpythonの必要なパッケージをインストールします。
```python
pip install selenium pyperclip keyboard pyautogui
```

# コード
```python
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")
```

## 解説
### インポート
必要なパッケージをインポートします。
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
import pyperclip
import re
import keyboard
import pyautogui
import sys
```

### テキストのコピーと改行の削除
1 まず選択しているテキストをコピーします。
```python
pyautogui.hotkey("ctrl", "c")
```
2 次にクリップボードにあるテキストをpythonの変数として受けとり、.以外の改行を削除します。
```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", "")`では削除ができないので一旦バイナリ形式にしてバイナリの文字列を削除します。
```python
text = re.sub(b"\xe2\x80\x90\r\n|\xe2\x80\x90\r|\xe2\x80\x90\n", b"", text.encode()).decode()
```
4 改行がある場合一段空白をつくり、全ての処理が終えたらクリップボードにテキストをコピーします。
```python
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()`も実行させます。
```python
try:
    driver.minimize_window()
    driver.maximize_window()
except
    pass
```
2 xpathを使ってテキストの入力フォームを取得し、すでに入力されている場合空にします。
```python
text_area = driver.find_element(By.XPATH, "//*[@id='panelTranslateText']/div[3]/section[1]/div[3]/div[2]/textarea")
text_area.clear()
```
3 入力フォームにテキストを貼り付け、ページの上に移動します。
```python
text_area.click()
pyautogui.hotkey("ctrl", "v")

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

### ショートカットキーの登録と実行
1. 引数として翻訳したい言語を設定します。何も入力がなければ日本語が選択されます。
1. deeplのサイトを開きます。
1. ショートカットキーを登録します。
```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130763/22e75471-a56d-641f-0335-52ab279bb08a.png)
以下のコマンドをコマンドプロンプトで入力します。
```console
python trans.py ja
```
登録してあるショットカットキーを押せば以下のようになります。
![image](https://user-images.githubusercontent.com/66017773/161294250-d3407770-b221-4680-bdc9-cf5cdcda981a.png)