Essayez de traduire avec Python tout en conservant la mise en page PDF

introduction

image.png

[Il existe différentes méthodes pour traduire automatiquement un PDF](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 /) est DocTranslator dans le sens où il maintient la mise en page et traduit. ) Est facile à utiliser. Cependant, il semble y avoir une limite de taille et PDF32000_2008.pdf etc. n'a pas pu traduire. Je vais finir.

Cette fois, réfléchissons à la façon de traduire sans casser la mise en page. De la conclusion, la méthode expliquée cette fois est gênante, donc si vous pouvez utiliser une autre méthode, je recommande une autre méthode.

Incorporer la traduction en tant que commentaire dans le PDF

Ce serait bien si vous pouviez intégrer la traduction dans le texte sans casser la mise en page comme DocTranslator, mais je peux prédire que cela ne fonctionnera pas de différentes manières, donc en commentaire Je vais intégrer la traduction.

Par exemple, si vous traduisez PDF32000_2008.pdf, le résultat sera le suivant.

http://needtec.sakura.ne.jp/doc/tmp/output.pdf

Lorsqu'il est visualisé avec Adobe Acrobat Reader, il s'affiche comme suit.

Aperçu

Le mécanisme de cette traduction est le suivant. image.png

Le CSV qui extrait le texte à traduire du PDF d'origine et le JSON qui stocke des informations telles que la position du texte sont extraits. Ensuite, téléchargez le CSV sur Google Drive et ouvrez-le dans une feuille de calcul Google. Utilisez la formule GOOGLE TRANSLATE (https://support.google.com/docs/answer/3093331?hl=ja) dans la feuille de calcul Google pour traduire le texte source. Ensuite, téléchargez le CSV édité avec la feuille de calcul Google et ajoutez un commentaire décrivant la traduction au format PDF en fonction du JSON qui stocke le CSV et la position du texte.

comment utiliser

Préparation préalable

    1. Préparez Python 3.7.5.
  1. Installez la bibliothèque.

    1. Préparez-vous à utiliser l'API Google Drive et l'API Google Sheets. Vous devriez être prêt en exécutant le démarrage rapide ci-dessous.

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

Au cours de ce démarrage rapide, un JSON contenant les informations d'identification sera créé, alors utilisez-le.

  1. Téléchargez le script requis à partir de ce qui suit. https://github.com/mima3/pdf_translate

Méthode de traduction

    1. Téléchargez le PDF que vous souhaitez traduire sur votre PC local.
  1. Utilisez la commande suivante pour créer un JSON qui enregistre les informations et la position du texte et un CSV qui enregistre une liste de textes du PDF à traduire.

python ./analyze_pdf_text.py PDF32000_2008.pdf

Les fichiers suivants seront créés.

  1. Entrez la traduction dans la deuxième colonne de PDF32000_2008.pdf.csv. Cette fois, je vais le télécharger dans une feuille de calcul Google et le traduire à l'aide de la formule GOOGLE TRANSLATE. Le script qui automatise cela est le suivant.
python ./translate_google_sheets.py PDF32000_2008.pdf.csv client_secret.json
  1. Exécutez la commande suivante pour incorporer la traduction en tant que commentaire
python ./embed_annots.py PDF32000_2008.pdf.json output.pdf

Description de la bibliothèque que vous utilisez

Comment obtenez-vous les informations textuelles du PDF?

J'utilise PyMuPDF.

Vous pouvez obtenir la position du bloc de texte et son contenu en utilisant la méthode Page.getText.

** Exemple de code **

import fitz
doc = fitz.open('PDF32000_2008.pdf')
print(doc[5].getText('blocks'))

** Exemple de sortie **

[(36.779998779296875, 39.29692077636719, 130.1901397705078, 52.363121032714844, 'PDF 32000-1:2008', 0, 0),Abréviation]

Il est également possible d'obtenir des unités de mot en définissant la valeur du premier argument de getText sur "words".

** Exemple de sortie **

[(36.779998779296875, 39.29692077636719, 58.759761810302734, 52.363121032714844, 'PDF', 0, 0, 0),Abréviation]

Si vous donnez "json" ou "dict", vous pouvez obtenir des informations plus détaillées telles que les polices et les couleurs.

{
 "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
       ]
      }
     ]
    }
   ]
  },
Abréviation

Comment intégrez-vous des annotations?

Utilisez Page.addTextAnnot. Si vous souhaitez essayer autre chose que les simples ajoutés cette fois, le code suivant vous sera utile.

https://github.com/pymupdf/PyMuPDF-Utilities/blob/master/annotations/new-annots.py

Téléchargement CSV

[Importez le fichier CSV sur Google Drive, modifiez-le en tant que feuille de calcul Google, puis téléchargez-le](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 /) a un exemple de code pour le téléchargement uniquement.

Extrait du processus de téléchargement


    service_drive = build('drive', 'v3', credentials=creds)

    #Importez un fichier CSV pour le modifier dans Google Spreadsheet.
    # 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'))

En spécifiant "application / vnd.google-apps.spreadsheet" dans le mimeType du paramètre body de create, CSV sera ajouté en tant que feuille de calcul Google.

Modifier en tant que feuille de calcul Google

[Téléchargez le fichier CSV sur Google Drive, modifiez-le en tant que feuille de calcul Google, puis téléchargez-le](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 /) contient un exemple de code qui vous permet de modifier le CSV téléchargé sur Google Drive avec l'API Google Sheets.

Cela convient aux CSV de petite taille, mais pour la mise à jour d'un grand nombre de lignes, la formule GOOGLE TRANSLATE (https://support.google.com/docs/answer/3093331?hl=ja) est terminée. Il ne peut pas être coupé. Dans ce cas, la cellule affichera "Chargement ..." ou "Chargement ..." au lieu du texte traduit. C'est également un problème si vous modifiez une feuille de calcul Google sur votre écran au lieu de via l'API.

Cette fois, je n'ai pas trouvé de bonne solution de contournement, donc toutes les 10 secondes, je vérifie que "Chargement ..." ou "Chargement ..." n'existe pas. https://github.com/mima3/pdf_translate/blob/master/translate_google_sheets.py#L45

De plus, cette fois, je mets à jour honnêtement la cellule avec la méthode de mise à jour, mais ceux qui ont utilisé batchUpdate Cela semble bon.

Télécharger la feuille de calcul Google

[Importez le fichier CSV sur Google Drive, modifiez-le en tant que feuille de calcul Google, puis téléchargez-le](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 /) a un exemple de téléchargement.

    # 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())

Il existe deux façons de télécharger depuis Google Drive: get_media et export_media. https://developers.google.com/drive/api/v3/manage-downloads

Cette fois, j'utiliserai export_media car je téléchargerai une fois la propagation Google convertie au format CSV.

Résumé

Pour le moment, j'ai pu traduire un PDF d'environ 700 pages comme celui-ci. Cependant, cette méthode est lourde et prend du temps, donc si une autre méthode est possible, vous devriez envisager une autre méthode. Au moins, si vous pouvez utiliser une autre API de traduction, vous n'avez pas à vous soucier du téléchargement, de l'intégration de la formule et du téléchargement.

Recommended Posts

Essayez de traduire avec Python tout en conservant la mise en page PDF
Essayez de résoudre le diagramme homme-machine avec Python
[Automation] Extraire le tableau en PDF avec Python
Essayez de gratter avec Python.
Essayez de résoudre le livre des défis de programmation avec python3
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
Convertissez l'image au format .zip en PDF avec Python
Essayez de traduire le manuel de science des données Python en japonais
[Python] Traduisez automatiquement les PDF avec DeepL tout en conservant le format d'origine. [Windows / Word requis]
Essayez la sortie Python avec Haxe 3.2
Essayez de traduire un PDF anglais, partie 1
Intégrez des fichiers PDF avec Python
Essayez d'exécuter Python avec Try Jupyter
Appelez l'API avec python3.
Essayez la reconnaissance faciale avec Python
Essayez d'utiliser l'API Twitter rapidement et facilement avec Python
Probablement le moyen le plus simple de créer un pdf avec Python 3
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Essayez de déchiffrer les caractères déformés dans le nom du fichier joint avec Python
Essayez de gratter avec Python + Beautiful Soup
Extraire le fichier xz avec python
Essayez le SDK Python LINE Pay
Essayez d'exploiter Facebook avec Python
Essayez la décomposition de valeurs singulières avec Python
Obtenez la météo avec les requêtes Python
Premier python ② Essayez d'écrire du code tout en examinant les fonctionnalités de python
Obtenez la météo avec les requêtes Python 2
Trouvez la distance d'édition (distance de Levenshtein) avec python
Accédez à l'API Etherpad-lite avec Python
Installer le plug-in Python avec Netbeans 8.0.2
Essayez la reconnaissance faciale avec python + OpenCV
J'ai aimé le tweet avec python. ..
Maîtriser le type avec Python [compatible Python 3.9]
Essayez d'utiliser le module Python Cmd
Essayez la simulation de contrôle de fréquence avec Python
Essayez de brouiller l'image avec opencv2
Essayez de résoudre l'itinéraire le plus court avec les données sociales Python + NetworkX +
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
J'ai mesuré la vitesse de la notation d'inclusion de liste, pendant et pendant avec python2.7.
Rendre la console Python couverte d'UNKO
Essayez de reproduire un film couleur avec Python
Essayez de vous connecter à qiita avec Python
Essayez d'utiliser l'API Wunderlist en Python
[Python] Définissez la plage du graphique avec matplotlib
Essayez d'utiliser l'API Kraken avec Python
Derrière le flyer: utiliser Docker avec Python
Apprenez les bases en touchant les variables python
Essayez de travailler avec des données binaires en Python
Essayez l'algorithme Variational-Quantum-Eigensolver (VQE) avec Blueqat
Vérifier l'existence du fichier avec python
Essayez d'utiliser l'appareil photo avec OpenCV de Python
[Python] Récupère le nom de la variable avec str
[Python] Arrondissez avec juste l'opérateur
Afficher Python 3 dans le navigateur avec MAMP
Rechercher le labyrinthe avec l'algorithme python A *