【Python】英文PDF（に限らないけど）をDeepLやGoogle翻訳で自動で翻訳させてテキストファイルにしてしまおう。

####8/6追記
出力結果を見やすくする改良を加えました
[続【Python】英文PDF（に限らないけど）をDeepLやGoogle翻訳で自動で翻訳させてテキストファイル、いやHTMLにしてしまおう。](https://qiita.com/Cartelet/items/a00d4cec8216d04f9274)
#はじめに
英語論文、読むのしんどいですよね。翻訳してもらいましょう、見通しがグッと良くなりますよ。

※文中ではPDF用のように書いていますが要はクリップボードに翻訳したい文をコピーできれば使えます。

#方法
PDFを翻訳する際に問題となるのがPDFファイルの扱いにくさです。
ライブラリに頼って自動で文字を抽出せようにも上手く行かなかったり、文の順番がめちゃくちゃになったりします。
そこで今回はクリップボード経由で翻訳したいと思います。

流れは

PDFファイルをChromeなどで開いて「Ctrl+A」全選択してコピー
　　　　↓
プログラムを実行
　　　　↓
文字数制限（5000文字）を超えない長さかつピリオドで区切るように文章を分解
　　　　↓
翻訳サイトに投げる
　　　　↓
結果を取得
　　　　↓
出力

といった感じです。

#コード

<details><summary>実行にはSeleniumとpyperclipが必要です。インストールしてください。</summary><div>

```
pip install selenium
pip install pyperclip
```
同じディレクトリに入れておいてください → [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/)

</div></details>

```python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time
import pyperclip as ppc

DRIVER_PATH = 'chromedriver.exe'

options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--start-maximized')


def parse_merge(text, n=4900):
    sentences = []
    sentence = ""
    for i in " ".join(text.splitlines()).split("."):
        if len(sentence) + len(i) > n:
            sentences.append(sentence)
            sentence = ""
        sentence += i + "."
    sentences.append(sentence)
    return sentences


def TranslateFromClipboard(tool, write, filename, isPrint):
    driver = webdriver.Chrome(executable_path=DRIVER_PATH,
                              chrome_options=options)
    url = 'https://www.deepl.com/ja/translator' if tool == "DeepL" else 'https://translate.google.co.jp/?hl=ja&tab=TT&authuser=0#view=home&op=translate&sl=auto&tl=ja'
    driver.get(url)
    transSentence = ""
    if tool == "DeepL":
        textarea = driver.find_element_by_css_selector(
            '.lmt__textarea.lmt__source_textarea.lmt__textarea_base_style')
    elif tool == "GT":
        textarea = driver.find_element_by_id('source')
    for sentence in parse_merge(ppc.paste()):
        cbText = ppc.paste()
        ppc.copy(sentence)
        textarea.send_keys(Keys.CONTROL, "v")
        ppc.copy(cbText)
        transtext = ""
        while transtext == "":
            if tool == "DeepL":
                transtext = driver.find_element_by_css_selector(
                    '.lmt__textarea.lmt__target_textarea.lmt__textarea_base_style'
                ).get_property("value")
            elif tool == "GT":
                try:
                    transtext = driver.find_element_by_css_selector(
                        '.tlid-translation.translation').text
                except:
                    pass
            time.sleep(1)
        if isPrint: print(transtext)
        transSentence += transtext
        textarea.send_keys(Keys.CONTROL, "a")
        textarea.send_keys(Keys.BACKSPACE)
    driver.quit()
    if write:
        with open(filename, "w", encoding='UTF-8') as f:
            for sentence in transSentence.split("。"):
                f.write(sentence + "。\n")


if __name__ == "__main__":
    args = ["DeepL", False, "translated_text.txt", True]
    if input("1. DeepL 2.GoogleTranslate　　") == "2": args[0] = "GT"
    if input("翻訳結果をファイルに書き出しますか？　y/n　　") == "y":
        args[1] = True
        filename = input(
            "出力ファイルにつける名前を入力してください（デフォルトは'translated_text.txt'）　　")
        if filename:
            args[2] = filename
    if input("翻訳経過をここに表示しますか？　y/n　　") == "n":
        args[3] = False
    input("準備ができたらEnterを押してください")
    TranslateFromClipboard(*args)
```

#使用方法

0. 上記コードを適当な名前のPythonファイルとして保存します。
1. PDF（など）の文章をコピーしてきます。
2. プログラムを実行します。
3. 各種設定を促されるまま入力します。
4. 準備が完了したら（ここまでに英文のコピーを完了してれば良い）Enterを押します。
5. ブラウザが開いて勝手に動くので眺めるなどして待ちます。
6. 翻訳結果を読みます。

テキストファイル出力時はとりあえず句点で改行するようにしています、適宜書き換えて使ってください。

#まとめ
DeepLは課金すれば文書も翻訳できるようですが、できれば無料で恩恵を受けたい人、
Google翻訳ではもともと文書も翻訳できますが、翻訳されていない場所が出たり数式周りが翻訳めちゃくちゃになって絶望した人、
お試しください、もしかしたら捗るかも。