PDFの翻訳ツールを下記のサイトを参考にスクリプトを動かしています。
しかしながら、下記のエラーが出てしまい
どの様に対応したら良いかわかりません。
対応を教えていただけると助かります。
よろしくお願い致します。
<エラー内容>
1/35 is proccessing
Traceback (most recent call last):
File "translate.py", line 151, in <module>
main()
File "translate.py", line 147, in main
f_trans.write(translate(input))
File "translate.py", line 124, in translate
return r_post.json()["text"]
File "/Users/User/anaconda3/lib/python3.6/site-packages/requests/models.py", line 900, in json
return complexjson.loads(self.text, **kwargs)
File "/Users/User/anaconda3/lib/python3.6/json/init.py", line 354, in loads
return _default_decoder.decode(s)
File "/Users/User/anaconda3/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Users/User/anaconda3/lib/python3.6/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Python
1 2import argparse 3import requests 4from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 5from pdfminer.converter import TextConverter 6from pdfminer.layout import LAParams 7from pdfminer.pdfpage import PDFPage 8from io import StringIO 9import re 10import os 11 12 13def is_float(n): 14 try: 15 float(n) 16 except ValueError: 17 return False 18 else: 19 return True 20 21 22def get_text_from_pdf(pdfname, limit=1000): 23 # PDFファイル名が未指定の場合は、空文字列を返して終了 24 if (pdfname == ''): 25 return '' 26 else: 27 # 処理するPDFファイルを開く/開けなければ 28 try: 29 fp = open(pdfname, 'rb') 30 except: 31 return '' 32 33 # PDFからテキストの抽出 34 rsrcmgr = PDFResourceManager() 35 out_fp = StringIO() 36 la_params = LAParams() 37 la_params.detect_vertical = True 38 device = TextConverter(rsrcmgr, out_fp, codec='utf-8', laparams=la_params) 39 interpreter = PDFPageInterpreter(rsrcmgr, device) 40 for page in PDFPage.get_pages(fp, pagenos=None, maxpages=0, password=None, caching=True, check_extractable=True): 41 interpreter.process_page(page) 42 text = out_fp.getvalue() 43 fp.close() 44 device.close() 45 out_fp.close() 46 47 # 改行で分割する 48 lines = text.splitlines() 49 50 outputs = [] 51 output = "" 52 53 # 除去するutf8文字 54 replace_strs = [b'\x00'] 55 56 is_blank_line = False 57 58 # 分割した行でループ 59 for line in lines: 60 61 # byte文字列に変換 62 line_utf8 = line.encode('utf-8') 63 64 # 余分な文字を除去する 65 for replace_str in replace_strs: 66 line_utf8 = line_utf8.replace(replace_str, b'') 67 68 # strに戻す 69 line = line_utf8.decode() 70 71 # 連続する空白を一つにする 72 line = re.sub("[ ]+", " ", line) 73 74 # 前後の空白を除く 75 line = line.strip() 76 #print("aft:[" + line + "]") 77 78 # 空行は無視 79 if len(line) == 0: 80 is_blank_line = True 81 continue 82 83 # 数字だけの行は無視 84 if is_float(line): 85 continue 86 87 # 1単語しかなく、末尾がピリオドで終わらないものは無視 88 if line.split(" ").count == 1 and not line.endswith("."): 89 continue 90 91 # 文章の切れ目の場合 92 if is_blank_line or output.endswith("."): 93 # 文字数がlimitを超えていたらここで一旦区切る 94 if(len(output) > limit): 95 outputs.append(output) 96 output = "" 97 else: 98 output += "\r\n" 99 #前の行からの続きの場合 100 elif not is_blank_line and output.endswith("-"): 101 output = output[:-1] 102 #それ以外の場合は、単語の切れ目として半角空白を入れる 103 else: 104 output += " " 105 106 #print("[" + str(line) + "]") 107 output += str(line) 108 is_blank_line = False 109 110 outputs.append(output) 111 return outputs 112 113 114def translate(input): 115 api_url = "https://script.google.com/macros/s/XXXXXXXXXXXXXXAPIXXXXXXXXXXXXXXXXX/exec" 116 params = { 117 'text': "\"" + input + "\"", 118 'source': 'en', 119 'target': 'ja' 120 } 121 122 #print(params) 123 r_post = requests.post(api_url, data=params) 124 return r_post.json()["text"] 125 126def main(): 127 128 parser = argparse.ArgumentParser() 129 parser.add_argument("-input", type=str, required=True) 130 parser.add_argument("-limit", type=int, default=1000) 131 args = parser.parse_args() 132 133 path = os.path.dirname(args.input) 134 base_name = os.path.splitext(os.path.basename(args.input))[0] 135 136 # pdfをテキストに変換 137 inputs = get_text_from_pdf(args.input, limit=args.limit) 138 139 with open(path + os.sep + "/tmp/"+"text.txt", "w", encoding="utf-8") as f_text: 140 with open(path + os.sep + "/tmp/"+"translate.txt", "w", encoding="utf-8") as f_trans: 141 142 # 一定文字列で分割した文章毎にAPIを叩く 143 for i, input in enumerate(inputs): 144 print("{0}/{1} is proccessing".format((i+1), len(inputs))) 145 # 結果をファイルに出力 146 f_text.write(input) 147 f_trans.write(translate(input)) 148 149 150if __name__ == "__main__": 151 main() 152
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。