[Es gibt verschiedene Methoden, um PDF maschinell zu übersetzen](https://needtec.sakura.ne.jp/wod07672/2020/05/07/pdf%e3%82%92%e7%bf%bb%e8%a8% b3% e3% 81% 97% e3% 81% 9f% e3% 81% 84 /) ist DocTranslator in dem Sinne, dass es das Layout beibehält und übersetzt. ) Ist einfach zu bedienen. Es scheint jedoch eine Größenbeschränkung zu geben, und PDF32000_2008.pdf usw. konnte nicht übersetzt werden. Ich werde am Ende.
Lassen Sie uns diesmal überlegen, wie Sie übersetzen können, ohne das Layout zu beschädigen. Aus der Schlussfolgerung heraus ist die diesmal erläuterte Methode problematisch. Wenn Sie also eine andere Methode verwenden können, empfehle ich eine andere Methode.
Es wäre schön, wenn Sie die Übersetzung in den Text einbetten könnten, ohne das Layout wie DocTranslator zu beschädigen, aber ich kann vorhersagen, dass es nicht auf verschiedene Arten funktionieren wird, also als Kommentar Ich werde die Übersetzung einbetten.
Das Ergebnis der Übersetzung von PDF32000_2008.pdf lautet beispielsweise wie folgt.
http://needtec.sakura.ne.jp/doc/tmp/output.pdf
Bei Anzeige mit Adobe Acrobat Reader wird dies wie folgt angezeigt.
Der Mechanismus dieser Übersetzung ist wie folgt.
Die CSV, die den zu übersetzenden Text aus dem Original-PDF extrahiert, und der JSON, der Informationen wie die Position des Textes speichert, werden extrahiert. Laden Sie dann die CSV auf Google Drive hoch und öffnen Sie sie in einer Google-Tabelle. Verwenden Sie die GOOGLE TRANSLATE-Formel (https://support.google.com/docs/answer/3093331?hl=ja) in der Google-Tabelle, um den Quelltext zu übersetzen. Laden Sie anschließend die mit der Google-Tabelle bearbeitete CSV herunter und fügen Sie einen Kommentar hinzu, der die Übersetzung in PDF basierend auf dem JSON beschreibt, in dem die CSV und die Position des Texts gespeichert sind.
Installieren Sie die Bibliothek.
Google Drive API- Python Quickstart https://developers.google.com/drive/api/v3/quickstart/python
Google Sheets API- Python Quickstart https://developers.google.com/sheets/api/quickstart/python
Während dieses Schnellstarts wird ein JSON mit den Anmeldeinformationen erstellt. Verwenden Sie diesen.
Erstellen Sie mit dem folgenden Befehl einen JSON, der die Textinformationen und die Position aufzeichnet, und eine CSV, die eine Liste der Texte aus der zu übersetzenden PDF aufzeichnet.
python ./analyze_pdf_text.py PDF32000_2008.pdf
Die folgenden Dateien werden erstellt.
python ./translate_google_sheets.py PDF32000_2008.pdf.csv client_secret.json
python ./embed_annots.py PDF32000_2008.pdf.json output.pdf
Ich verwende PyMuPDF.
Sie können die Position des Textblocks und seines Inhalts mithilfe der Methode Page.getText ermitteln.
** Beispielcode **
import fitz
doc = fitz.open('PDF32000_2008.pdf')
print(doc[5].getText('blocks'))
** Ausgabebeispiel **
[(36.779998779296875, 39.29692077636719, 130.1901397705078, 52.363121032714844, 'PDF 32000-1:2008', 0, 0),Abkürzung]
Es ist auch möglich, es in Worteinheiten abzurufen, indem der Wert des ersten Arguments von getText auf "Wörter" gesetzt wird.
** Ausgabebeispiel **
[(36.779998779296875, 39.29692077636719, 58.759761810302734, 52.363121032714844, 'PDF', 0, 0, 0),Abkürzung]
Wenn Sie "json" oder "dict" angeben, erhalten Sie detailliertere Informationen wie Schriftarten und Farben.
{
"width":595.0,
"height":842.0,
"blocks":[
{
"type":0,
"bbox":[
36.779998779296875,
39.29692077636719,
130.1901397705078,
52.363121032714844
],
"lines":[
{
"wmode":0,
"dir":[
1.0,
0.0
],
"bbox":[
36.779998779296875,
39.29692077636719,
130.1901397705078,
52.363121032714844
],
"spans":[
{
"size":10.979999542236328,
"flags":20,
"font":"DDPEIM+Helvetica-Bold",
"color":0,
"text":"PDF 32000-1:2008",
"bbox":[
36.779998779296875,
39.29692077636719,
130.1901397705078,
52.363121032714844
]
}
]
}
]
},
Abkürzung
Verwenden Sie Page.addTextAnnot. Wenn Sie etwas anderes als die diesmal hinzugefügten einfachen ausprobieren möchten, ist der folgende Code hilfreich.
https://github.com/pymupdf/PyMuPDF-Utilities/blob/master/annotations/new-annots.py
[Laden Sie CSV auf Google Drive hoch, bearbeiten Sie es als Google-Tabelle und laden Sie es dann herunter](https://needtec.sakura.ne.jp/wod07672/2020/05/08/google-drive%e3%81%abcsv% e3% 82% 92% e3% 82% a2% e3% 83% 83% e3% 83% 97% e3% 83% ad% e3% 83% bc% e3% 83% 89% e3% 81% 97% e3% 81% a6google% e3% 82% b9% e3% 83% 97% e3% 83% ac% e3% 83% 83% e3% 83% 89% e3% 82% b7% e3% 83% bc% e3% 83% 88% e3% 81% a8 /) enthält Beispielcode nur zum Hochladen.
Auszug aus dem Upload-Prozess
service_drive = build('drive', 'v3', credentials=creds)
#Laden Sie CSV zur Bearbeitung in Google Spreadsheet hoch.
# https://developers.google.com/drive/api/v3/manage-uploads#python
file_metadata = {
'name': 'Test',
'mimeType': 'application/vnd.google-apps.spreadsheet'
}
media = MediaFileUpload('test.csv',
mimetype='text/csv',
resumable=True)
file = service_drive.files().create(body=file_metadata,
media_body=media,
fields='id').execute()
print('File ID: %s' % file.get('id'))
Durch Angabe von "application / vnd.google-apps.spreadsheet" im mimeType des body-Parameters von create wird CSV als Google-Tabelle hinzugefügt.
[Laden Sie CSV auf Google Drive hoch, bearbeiten Sie es als Google-Tabelle und laden Sie es dann herunter](https://needtec.sakura.ne.jp/wod07672/2020/05/08/google-drive%e3%81%abcsv% e3% 82% 92% e3% 82% a2% e3% 83% 83% e3% 83% 97% e3% 83% ad% e3% 83% bc% e3% 83% 89% e3% 81% 97% e3% 81% a6google% e3% 82% b9% e3% 83% 97% e3% 83% ac% e3% 83% 83% e3% 83% 89% e3% 82% b7% e3% 83% bc% e3% 83% 88% e3% 81% a8 /) enthält Beispielcode zum Bearbeiten von CSV, das mit der Google Sheets-API auf Google Drive hochgeladen wurde.
Dies ist für kleine CSVs in Ordnung, aber für die Aktualisierung einer großen Anzahl von Zeilen ist die GOOGLE TRANSLATE-Formel (https://support.google.com/docs/answer/3093331?hl=ja) vollständig. Es darf nicht geschnitten werden. In diesem Fall zeigt die Zelle anstelle des übersetzten Textes "Laden ..." oder "Laden ..." an. Dies ist auch ein Problem, wenn Sie eine Google-Tabelle auf Ihrem Bildschirm anstatt über die API bearbeiten.
Dieses Mal konnte ich keine gute Problemumgehung finden, daher überprüfe ich alle 10 Sekunden, ob "Laden ..." oder "Laden ..." nicht vorhanden ist. https://github.com/mima3/pdf_translate/blob/master/translate_google_sheets.py#L45
Außerdem aktualisiere ich diesmal ehrlich die Zelle mit der Aktualisierungsmethode, aber diejenigen, die [batchUpdate] verwendet haben (https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate) Sieht gut aus.
[Laden Sie CSV auf Google Drive hoch, bearbeiten Sie es als Google-Tabelle und laden Sie es dann herunter](https://needtec.sakura.ne.jp/wod07672/2020/05/08/google-drive%e3%81%abcsv% e3% 82% 92% e3% 82% a2% e3% 83% 83% e3% 83% 97% e3% 83% ad% e3% 83% bc% e3% 83% 89% e3% 81% 97% e3% 81% a6google% e3% 82% b9% e3% 83% 97% e3% 83% ac% e3% 83% 83% e3% 83% 89% e3% 82% b7% e3% 83% bc% e3% 83% 88% e3% 81% a8 /) hat einen Beispiel-Download.
# download
request = service_drive.files().export_media(fileId=file_id, mimeType='text/csv')
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print ("Download %d%%." % int(status.progress() * 100))
with open('download.csv', 'wb') as f:
f.write(fh.getvalue())
Es gibt zwei Möglichkeiten zum Herunterladen von Google Drive: get_media und export_media. https://developers.google.com/drive/api/v3/manage-downloads
Dieses Mal werde ich export_media verwenden, da ich den konvertierten Google-Spread einmal als CSV herunterladen werde.
Vorläufig konnte ich ein PDF mit etwa 700 Seiten wie dieses übersetzen. Diese Methode ist jedoch umständlich und zeitaufwändig. Wenn also eine andere Methode möglich ist, sollten Sie eine andere Methode in Betracht ziehen. Zumindest wenn Sie eine andere Übersetzungs-API verwenden können, müssen Sie sich nicht um das Hochladen, Einbetten der Formel und das erneute Herunterladen kümmern.