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.
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.
--Google Colaboratory (Colab)
Ceci est le code source final pour cette fois. Le traitement est effectué selon le flux suivant.
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)
Faites quelques préparatifs avant d'exécuter le code ci-dessus.
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.
Installez le client API Google pour Python.
!pip install google-api-python-client
Je vais vous expliquer l'implémentation du code source mentionné ci-dessus.
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')
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)
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
})
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)
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
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