[PYTHON] Convertir un PDF en documents par OCR

introduction

Cet article décrit le traitement OCR (conversion vers Google Documents) de PDF en Python (environnement Google Colab).

Google Drive a une fonction qui convertit le PDF en fichier Documents par traitement OCR. Décrit comment gérer le code Python.

  1. Extraire le texte du PDF
  2. Utilisez la fonction OCR de Google Drive pour l'extraction de texte
  3. Conversion en documents Google par traitement OCR et extraction de texte
  4. Résolution du problème suivant: les caractères alphabétiques du nom de fichier étaient en pleine largeur lors de la conversion en documents

En particulier, je n'avais aucune information sur le problème de pleine largeur du nom de fichier de 4, donc je voulais le partager comme connaissance pour ceux qui souffrent du même problème.

Éléments techniques

--Google Colaboratory (Colab)

Code source

Ceci est le code source final pour cette fois. Le traitement est effectué selon le flux suivant.

  1. Authentifiez-vous, obtenez le service Drive
  2. Les fichiers PDF traités sont vérifiés pour les doublons par nom de fichier et exclus de la cible
  3. Créez une liste de PDF à convertir
  4. Convertissez le fichier PDF cible

Les détails seront décrits plus tard.

def full_to_half(val):
  """
Convertir le plein angle en demi-angle
* Résolution du problème selon lequel les caractères alphabétiques inclus dans le nom de fichier après l'OCR deviennent pleine largeur
  """
  return val.translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}))

import os
import glob
from google.colab import auth
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload

#Authentification
auth.authenticate_user()
#Obtenir un service pour faire fonctionner Drive
drive_service = build('drive', 'v3')

#Chemin local monté sur Colab
input_path = 'drive/My Drive/PDF/INPUT' #contribution(PDF)Chemin du répertoire
output_path = 'drive/My Drive/PDF/OUTPUT' #Chemin du répertoire de destination de sortie

#####
#Les fichiers PDF traités sont vérifiés pour les doublons par nom de fichier et exclus de la cible
####
#Obtenir des fichiers de manière récursive
files_o = glob.glob(output_path, recursive=True)
exist_filenames = ['']
for root, dirs, files_o in os.walk(output_path):
    for filename in files_o:
        #Convertir la pleine largeur en demi-largeur, supprimer l'extension
        exist_filename = full_to_half(filename).replace('.gdoc', '')
        #Ajouter un nom de fichier existant
        exist_filenames.append(exist_filename)

#####
#Créer une liste de PDF à convertir
####
#Obtenir des fichiers de manière récursive
files = glob.glob(input_path, recursive=True)
pdf_infos = []
for root, dirs, files in os.walk(input_path):
    for filename in files:
      #print(filename)
      #Exclut les noms de fichiers existants
      if full_to_half(filename) in exist_filenames:
        #print('Existe')
        pass
      else:
        #L'extension est PDF
        if filename[-4:] == '.PDF' or filename[-4:] == '.pdf':
          #print('n'existe pas')
          filepath = os.path.join(root, filename) #Chemin du fichier local sur Colab
          pdf_infos.append({
                'path': filepath,
                'name': filename
            })

#print('nombre de fichiers: ' + str(len(pdf_infos)))

#Type MIME du fichier Google Documents
MIME_TYPE = 'application/vnd.google-apps.document'

#####
#Convertir le fichier PDF cible
####
for pdf_info in pdf_infos:
  pdf_path = pdf_info['path']

  #print(pdf_path)

  pdf_filename = pdf_info['name']
  #Nom de fichier après OCR
  #print(pdf_filename)

  #Convertir les alphabets pleine largeur en demi-largeur
  pdf_filename = full_to_half(pdf_filename)

  body = {
      'name': pdf_filename,
      'mimeType': MIME_TYPE,
      'parents': ['ID du répertoire du lecteur de destination de sortie']
  }
  try:
    media_body = MediaFileUpload(pdf_path, mimetype=MIME_TYPE, resumable=True)

    drive_service.files().create(
        body=body,
        media_body=media_body,
    ).execute()
  except:
    print('Erreur:Échec de la création du fichier de documents.')
    print(pdf_path)

Préparation

Faites quelques préparatifs avant d'exécuter le code ci-dessus.

Monture Google Drive

Colab dispose d'une fonction de montage qui vous permet de traiter virtuellement Google Drive comme un système de fichiers local. Vous pouvez utiliser Drive, mais s'il s'agit d'un client API Google, le traitement via l'API Web prendra du temps, de sorte que les performances diminueront. Par conséquent, afin d'augmenter la vitesse de traitement, essayez autant que possible de traiter en position montée.

Pour monter Drive sur Colab, connectez-vous au runtime et appuyez sur l'icône ci-dessous.

Ensuite, le code suivant sera inséré, veuillez l'exécuter.

from google.colab import drive
drive.mount('/content/drive')

Ouvrez l'URL affichée dans votre navigateur, copiez le code de vérification au-delà et collez-le dans la zone de texte.

Ceci termine le montage.

Installer le client API Google

Installez le client API Google pour Python.

!pip install google-api-python-client

la mise en oeuvre

Je vais vous expliquer l'implémentation du code source mentionné ci-dessus.

1. Authentifiez-vous, obtenez le service Drive

Obtenez un objet Service pour qu'il fonctionne avec Drive dans le client API Google.

Authentifiez-vous à l'aide de l'authentification de Colab et obtenez l'objet Drive Service dans le client API Google.

from google.colab import auth
from googleapiclient.discovery import build

#Authentification
auth.authenticate_user()
#Obtenir un service pour faire fonctionner Drive
drive_service = build('drive', 'v3')

2. Les fichiers PDF traités sont vérifiés pour les doublons par nom de fichier et exclus de la cible

Cette fois, le fichier converti est stocké au même endroit. De plus, une vérification des doublons est effectuée pour permettre la ré-exécution lorsque le processus se termine au milieu ou qu'un PDF est ajouté.

Il recherche récursivement le répertoire racine du local virtuel et ajoute les noms de fichiers qui existent dans la variable exist_filenames (tableau) dans l'ordre.

#Obtenir des fichiers de manière récursive
files_o = glob.glob(output_path, recursive=True)
exist_filenames = ['']
for root, dirs, files_o in os.walk(output_path):
    for filename in files_o:
        #Convertir la pleine largeur en demi-largeur, supprimer l'extension
        exist_filename = full_to_half(filename).replace('.gdoc', '')
        #Ajouter un nom de fichier existant
        exist_filenames.append(exist_filename)

3. Créez une liste de PDF à convertir

Créez une liste de fichiers PDF à convertir lors de l'exécution. Si les fichiers non cibles acquis au cours du processus 2 correspondent, ils seront ignorés. Si le fichier PDF ne correspond pas, il s'agit d'un nouvel ajout, alors ajoutez-le à la variable pdf_infos (tableau) en tant que PDF à traiter.

#Obtenir des fichiers de manière récursive
files = glob.glob(input_path, recursive=True)
pdf_infos = []
for root, dirs, files in os.walk(input_path):
    for filename in files:
      #print(filename)
      #Exclut les noms de fichiers existants
      if full_to_half(filename) in exist_filenames:
        #print('Existe')
        pass
      else:
        #L'extension est PDF
        if filename[-4:] == '.PDF' or filename[-4:] == '.pdf':
          #print('n'existe pas')
          filepath = os.path.join(root, filename) #Chemin du fichier local sur Colab
          pdf_infos.append({
                'path': filepath,
                'name': filename
            })

4. Convertissez le fichier PDF cible

Sur la base de la liste extraite dans le processus jusqu'à 3, le fichier PDF sera converti.

Créez un nouveau fichier dans Drive avec les fichiers objets du service Drive (). Create () .execute (). À ce moment-là, si vous spécifiez la valeur de Documents pour le type MIME, il sera automatiquement converti en fichier de documents traité OCR.

Spécifiez le nom du fichier converti, le type MIME et l'ID du répertoire parent dans le paramètre body de create (). Pour le paramètre media_body, spécifiez le fichier PDF téléchargé sur Google par MediaFileUpdate.

for pdf_info in pdf_infos:
  pdf_path = pdf_info['path']

  #print(pdf_path)

  pdf_filename = pdf_info['name']
  #Nom de fichier après OCR
  #print(pdf_filename)

  #Convertir les alphabets pleine largeur en demi-largeur
  pdf_filename = full_to_half(pdf_filename)

  body = {
      'name': pdf_filename,
      'mimeType': MIME_TYPE,
      'parents': ['ID du répertoire du lecteur de destination de sortie']
  }
  try:
    media_body = MediaFileUpload(pdf_path, mimetype=MIME_TYPE, resumable=True)

    drive_service.files().create(
        body=body,
        media_body=media_body,
    ).execute()
  except:
    print('Erreur:Échec de la création du fichier de documents.')
    print(pdf_path)

Résolution d'un problème où les lettres du nom de fichier converti seraient en pleine largeur

Les fichiers de documents créés par conversion OCR de fichiers PDF auront des caractères alphabétiques pleine largeur. J'ai étudié cela avec le code suivant.

chars = [
  'm',  #Caractères copiés à partir du fichier Documents
  'm'  #Caractères saisis par saisie directe
]

#Pleine largeur (nom du fichier après la conversion)
print(hex(ord(chars[0])))
#Moitié de la taille
print(hex(ord(chars[1])))

#Conversion d'alphabets pleine largeur en alphabets demi-largeur
print(hex(ord(chars[0].translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)})))))

Résultat d'exécution

0xff4d
0x6d
0x6d

À partir des résultats d'exécution ci-dessus, il a été constaté que le nom du fichier converti est pleine largeur et qu'il peut être converti en demi-largeur.

Pour la conversion, je me suis référé à cet article. [Python] Conversion mutuelle entre pleine largeur et demi-largeur sur une ligne (alphabet + chiffre + symbole) --Qiita

en conclusion

Avec ce qui précède, la conversion OCR du fichier PDF a été implémentée. Nous espérons pour votre référence.

Recommended Posts

Convertir un PDF en documents par OCR
[Python] Convertir le texte PDF en CSV pour chaque page (2/24 postscript)
Convertir Markdown en PDF en Python
Convertir un PDF A4 en A3 toutes les 2 pages
Conversion de pdf en txt 2 [pyocr]
Convertir un PDF en image avec ImageMagick
Convertir de PDF en CSV avec pdfplumber
Convertir un PDF joint en courrier électronique au format texte
Convertir des fichiers PDF en fichiers PNG avec GIMP
Convertir en HSV
Comment convertir M4a acquis par iTunes en wav
Convertir un PDF en image (JPEG / PNG) avec Python
Convertissez plusieurs fichiers jpg en un seul fichier PDF
Conversion par lots de fichiers PSD du répertoire en PDF
[Petite histoire] Un moyen simple de convertir Jupyter en PDF
[Python] Suite - Convertir le texte PDF en CSV page par page
Les débutants essaient de convertir des fichiers Word en PDF à la fois
Convertir 202003 en 2020-03 avec les pandas
Convertir les kanji en kana
Convertir jupyter en py
Convertir keras-yolo3 en ONNX
Convertissez l'image au format .zip en PDF avec Python
Convertir dict en tableau
Convertir json en Excel
Multiplier PDF par OCR en ligne de commande sous Linux (Ubuntu)
Conversion par lots de fichiers image téléchargés vers MS Forms / Google Forms vers PDF
Convertissez des images numérisées déformées en PDF avec Pillow et PyPDF
Convertir une chaîne hexadécimale en binaire
[python] Convertir la date en chaîne
Convertir numpy int64 en python int
[Python] Convertir la liste en Pandas [Pandas]
Convertir le HTML en fichier texte
OCR à partir de PDF en Python
Ajouter un numéro de page au PDF
Convertir le projet Scratch en Python
[Python] Convertir Shift_JIS en UTF-8
Convertir l'adresse IP en décimal
Convertissez rapidement SDF en CSV
Convertir le fichier genbank en fichier gff
Convertir le code python 3.x en python 2.x
Convertir des fichiers écrits en python, etc. en pdf avec la coloration syntaxique
Convertir le PDF de la liste des concessionnaires de la campagne Go To Eat Hokkaido en CSV
Convertissez un grand nombre de fichiers PDF en fichiers texte à l'aide de pdfminer
Télécharger le logo Google → Texte avec OCR → Affichage sur HTML
[Good By Excel] script python pour générer sql pour convertir csv en table