Wenn Sie eine PDF-Datei übersetzen möchten, wird zuerst die Standardfunktion von Google Translate in den Sinn gebracht. Es gibt jedoch eine Dateigrößenbeschränkung, die je nach PDF ein Problem darstellt. In Vorheriger Artikel habe ich die Google Übersetzer-API aufgerufen, um den englischen Text ins Japanische zu übersetzen. Wenn der Text, den Sie lesen möchten, PDF ist, können Sie den Text mit Google Documents oder Adobe Acrobat extrahieren. Es gibt jedoch den Nachteil, dass die Anzahl der Schritte groß ist. Auch hier scheint Python eine Reihe von Arbeiten mit einer Bibliothek namens PDF Miner ausführen zu können. Ich habe sehr viel auf die folgenden Artikel verwiesen. [PDF Miner] Text aus PDF extrahieren
Das erstellte Skript ist unten. https://github.com/KanikaniYou/translate_pdf
Alle PDFs in einem bestimmten Ordner werden extrahiert, übersetzt und als Textdateien ausgegeben.
Da nach dem Extrahieren mit PDFMiner auch unnötige Zeichenfolgen verwendet werden (Zeichenfolgen mit demselben Symbol wie "......" usw., die sich im Inhaltsverzeichnis befinden usw.), werden die extrahierten Textdateien als Zwischendatei zusammengestellt. Ich versuche, es Menschen zu ermöglichen, unnötige Teile zu entfernen.
Der gesamte Ablauf der Übersetzungsarbeit 0. Schnellstart| Google Cloud Translation API Documentation | Google Cloud PlatformHolen Sie sich die Google Übersetzer-API unter Bezugnahme auf
Es wird sein. Wie oben erwähnt, können Sie durch manuelles Betrachten der Textdatei nach 1. den von PDF Miner extrahierten Text überprüfen und nur die erforderlichen Teile extrahieren, damit Sie die Google Translate-API nicht verschwenderisch aufrufen müssen. Ich werde.
Ich denke, dass Linux mit Python3-System verwendet werden kann. Meine Umgebung ist Cloud9 und Ubuntu 18.04.
pip install pdfminer.six
Übrigens ist PDF Miner sehr nützlich, aber es scheint, dass verstümmelte Zeichen wahrscheinlich auftreten, wenn Sie Japanisch usw. extrahieren möchten. Dieses Mal werde ich Englisch lernen, daher denke ich nicht, dass Probleme so oft auftreten werden.
Bekannte Fehler im Zusammenhang mit dem japanischen Abrufen in PDF Miner: Immer noch Probleme mit CID-Zeichen Nr. 39
git clone https://github.com/KanikaniYou/translate_pdf
cd translate_pdf
Dateistruktur. (Zur Erklärung habe ich bereits 10 PDFs platziert, die ich übersetzen möchte.)
.
├── eng_txt
├── eng_txt_split
├── jpn_txt
├── let_translatable.py
├── pdf_source
│ ├── report_1.pdf
│ ├── report_10.pdf
│ ├── report_2.pdf
│ ├── report_3.pdf
│ ├── report_4.pdf
│ ├── report_5.pdf
│ ├── report_6.pdf
│ ├── report_7.pdf
│ ├── report_8.pdf
│ └── report_9.pdf
├── pdf_to_txt.py
└── translate_en_jp.py
pdf_to_txt.py
import sys
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTContainer, LTTextBox
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.pdfpage import PDFPage
import os
import re
def find_textboxes_recursively(layout_obj):
if isinstance(layout_obj, LTTextBox):
return [layout_obj]
if isinstance(layout_obj, LTContainer):
boxes = []
for child in layout_obj:
boxes.extend(find_textboxes_recursively(child))
return boxes
return[]
def pdf_read_controller(filepath):
try:
text_in_pdf = ""
with open(filepath, 'rb') as f:
for page in PDFPage.get_pages(f):
try:
interpreter.process_page(page)
layout = device.get_result()
boxes = find_textboxes_recursively(layout)
boxes.sort(key=lambda b:(-b.y1, b.x0))
text_in_page = ""
for box in boxes:
text_in_box = ""
text_in_box += box.get_text().strip().strip(" ")
text_in_box.rstrip("\n")
text_in_box = re.sub(r' ', " ", text_in_box)
text_in_page += text_in_box
text_in_pdf += text_in_page
except Exception as e:
print(e)
return(text_in_pdf)
except Exception as e:
print(e)
print("error: " + filepath)
return("no-text")
def make_txtfile(folder_path,file_name,text='error'):
if text != "no-text":
with open(folder_path+"/"+file_name, mode='w') as f:
f.write(text)
laparams = LAParams(detect_vertical=True)
resource_manager = PDFResourceManager()
device = PDFPageAggregator(resource_manager, laparams=laparams)
interpreter = PDFPageInterpreter(resource_manager, device)
if __name__ == '__main__':
for file_name in os.listdir("pdf_source"):
if file_name.endswith(".pdf"):
print(file_name)
text_in_page = pdf_read_controller("pdf_source/" + file_name)
make_txtfile("eng_txt_split",file_name.rstrip("pdf")+"txt",text_in_page)
Lesen Sie alle PDFs im Ordner "pdf_source", um eine Textdatei zu erstellen und auszugeben.
$ python pdf_to_txt.py
report_3.pdf
report_7.pdf
report_2.pdf
report_1.pdf
unpack requires a buffer of 10 bytes
unpack requires a buffer of 8 bytes
report_5.pdf
report_9.pdf
report_8.pdf
unpack requires a buffer of 6 bytes
unpack requires a buffer of 6 bytes
unpack requires a buffer of 4 bytes
report_4.pdf
report_6.pdf
report_10.pdf
Ich erhalte einige Fehler, ignoriere sie jedoch und erstelle eine Textdatei. PDF ist verwirrend. Ähnlicher Fehler: [struct.error: unpack erfordert ein String-Argument der Länge 16](https://stackoverflow.com/questions/40158637/struct-error-unpack-requires-a-string-argument-of-length -16)
Zum Beispiel enthielt ein Teil des Textes diese Teile. Ich möchte die Google Translate-API nicht umsonst verwenden. Löschen Sie daher die Teile, die Sie nicht benötigen.
let_translatable.py
import os
if __name__ == '__main__':
for file_name in os.listdir("eng_txt_split"):
if file_name.endswith(".txt"):
print(file_name)
text = ""
with open("eng_txt_split/"+file_name) as f:
l = f.readlines()
for line in l:
text += str(line).rstrip('\n')
path_w = "eng_txt/" + file_name
with open(path_w, mode='w') as f:
f.write(text)
Der in PDF Miner angezeigte Text ist voller Zeilenumbrüche. Wenn Sie ihn so wie er ist in Google Translate einfügen, wird er nicht gut übersetzt. Erstellen Sie daher eine neue Textdatei ohne Zeilenumbrüche und geben Sie sie in den Ordner eng_txt aus.
$ python let_translatable.py
report_4.txt
report_10.txt
report_2.txt
report_6.txt
report_9.txt
report_5.txt
report_8.txt
report_7.txt
report_3.txt
report_1.txt
Der resultierende Text wird schließlich übersetzt. Den Inhalt finden Sie unter oben.
translate_en_jp.py
import requests
import json
import os
import re
import time
API_key = '<Bitte geben Sie hier den API-Schlüssel ein>'
def post_text(text):
url_items = 'https://www.googleapis.com/language/translate/v2'
item_data = {
'target': 'ja',
'source': 'en',
'q':text
}
response = requests.post('https://www.googleapis.com/language/translate/v2?key={}'.format(API_key), data=item_data)
return response.text
def jsonConversion(jsonStr):
data = json.loads(jsonStr)
return data["data"]["translations"][0]["translatedText"]
def split_text(text):
sen_list = text.split('.')
to_google_sen = ""
from_google = ""
for index, sen in enumerate(sen_list[:-1]):
to_google_sen += sen + '. '
if len(to_google_sen)>1000:
from_google += jsonConversion(post_text(to_google_sen)) +'\n'
time.sleep(1)
to_google_sen = ""
if index == len(sen_list)-2:
from_google += jsonConversion(post_text(to_google_sen))
time.sleep(1)
return from_google
if __name__ == '__main__':
for file_name in os.listdir("eng_txt"):
print("source: " + file_name)
with open("eng_txt/"+file_name) as f:
s = f.read()
new_text = split_text(s)
path_w = "jpn_txt/" + file_name
with open(path_w, mode='w') as f:
f.write(new_text)
$ python translate_en_jp.py
source: report_4.txt
source: report_10.txt
source: report_2.txt
source: report_6.txt
source: report_9.txt
source: report_5.txt
source: report_8.txt
source: report_7.txt
source: report_3.txt
source: report_1.txt
Langtext wird einige Zeit dauern.
Die übersetzte Textdatei befindet sich im Ordner jpn_txt.
Damit müssen Sie sich keine Sorgen um englische PDF-Dateien machen! Der von diesem ausgegebene Text hat jedoch kein Konzept für das Layout, und ich denke, dass er möglicherweise nicht gut zwischen den Seiten übersetzt werden kann. Ursprünglich wäre es schön, wenn wir diesen Bereich bewältigen könnten, aber es scheint ziemlich schwierig zu sein. Ich hoffe, Sie können es verwenden, wenn Sie viele PDFs auf Japanisch lesen möchten.
Recommended Posts