[PYTHON]

Referenz Linux, centos7, Prozess Konvertieren von PDF in Dokumente per OCR Einführung In diesem Artikel wird die OCR-Verarbeitung (Konvertierung in Google Dokumente) von PDF in Python (Google Colab-Umgebung) erläutert.

Google Drive verfügt über eine Funktion, mit der OCR PDF-Dateien verarbeitet und in die Dokumentdatei konvertiert. Beschreibt den Umgang mit Python-Code.

  1. Extrahieren Sie Text aus PDF
  2. Verwenden Sie die OCR-Funktion von Google Drive zum Extrahieren von Text
  3. Konvertieren Sie durch OCR-Verarbeitung in Google Dokumente und extrahieren Sie Text
  4. Es wurde ein Problem behoben, bei dem die alphabetischen Zeichen im Dateinamen bei der Konvertierung in Dokumente in voller Breite angezeigt wurden

Insbesondere hatte ich keine Informationen über das Problem des Dateinamens 4 in voller Breite, daher wollte ich es als Wissen für diejenigen weitergeben, die unter demselben Problem leiden.

Technische Elemente

Quellcode

Dies ist der endgültige Quellcode. Die Verarbeitung erfolgt nach folgendem Ablauf.

  1. Authentifizieren Sie sich und holen Sie sich den Drive Service
  2. Verarbeitete PDF-Dateien werden anhand des Dateinamens auf Duplikate überprüft und vom Ziel ausgeschlossen
  3. Erstellen Sie eine Liste der zu konvertierenden PDFs
  4. Konvertieren Sie die Ziel-PDF-Datei

Details werden später beschrieben.

def full_to_half(val):
  """
Konvertieren Sie den vollen Winkel in den halben Winkel
* Behebung des Problems, dass die im Dateinamen nach OCR enthaltenen alphabetischen Zeichen in voller Breite angezeigt werden
  """
  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

#Authentifizierung
auth.authenticate_user()
#Lassen Sie den Service das Laufwerk bedienen
drive_service = build('drive', 'v3')

#Lokaler Pfad auf Colab montiert
input_path = 'drive/My Drive/PDF/INPUT' #Eingang(PDF)Verzeichnispfad
output_path = 'drive/My Drive/PDF/OUTPUT' #Pfad des Ausgabeverzeichnisses ausgeben

#####
#Verarbeitete PDF-Dateien werden anhand des Dateinamens auf Duplikate überprüft und vom Ziel ausgeschlossen
####
#Dateien rekursiv abrufen
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:
        #Konvertieren Sie die volle Breite in die halbe Breite und entfernen Sie die Erweiterung
        exist_filename = full_to_half(filename).replace('.gdoc', '')
        #Fügen Sie den vorhandenen Dateinamen hinzu
        exist_filenames.append(exist_filename)

#####
#Erstellen Sie eine Liste der zu konvertierenden PDFs
####
#Dateien rekursiv abrufen
files = glob.glob(input_path, recursive=True)
pdf_infos = []
for root, dirs, files in os.walk(input_path):
    for filename in files:
      #print(filename)
      #Schließt vorhandene Dateinamen aus
      if full_to_half(filename) in exist_filenames:
        #print('Existiert')
        pass
      else:
        #Erweiterung ist PDF
        if filename[-4:] == '.PDF' or filename[-4:] == '.pdf':
          #print('nicht existieren')
          filepath = os.path.join(root, filename) #Lokaler Dateipfad auf Colab
          pdf_infos.append({
                'path': filepath,
                'name': filename
            })

#print('Anzahl der Dateien: ' + str(len(pdf_infos)))

#MIME-Typ der Google Documents-Datei
MIME_TYPE = 'application/vnd.google-apps.document'

#####
#Konvertieren Sie die Ziel-PDF-Datei
####
for pdf_info in pdf_infos:
  pdf_path = pdf_info['path']

  #print(pdf_path)

  pdf_filename = pdf_info['name']
  #Dateiname nach OCR
  #print(pdf_filename)

  #Konvertieren Sie Alphabete in voller Breite in halbe Breite
  pdf_filename = full_to_half(pdf_filename)

  body = {
      'name': pdf_filename,
      'mimeType': MIME_TYPE,
      'parents': ['Ausgabeziel Laufwerksverzeichnis-ID']
  }
  try:
    media_body = MediaFileUpload(pdf_path, mimetype=MIME_TYPE, resumable=True)

    drive_service.files().create(
        body=body,
        media_body=media_body,
    ).execute()
  except:
    print('Error:Fehler beim Erstellen der Dokumentdatei.')
    print(pdf_path)

Vorbereitung

Treffen Sie einige Vorbereitungen, bevor Sie den obigen Code ausführen.

Google Drive-Mount

Colab verfügt über eine Mount-Funktion, mit der Sie Google Drive virtuell als lokales Dateisystem behandeln können. Sie können Drive betreiben. Wenn es sich jedoch um einen Google API-Client handelt, dauert die Verarbeitung über die Web-API einige Zeit, sodass die Leistung abnimmt. Um die Verarbeitungsgeschwindigkeit zu erhöhen, versuchen Sie daher, so weit wie möglich in der montierten Position zu verarbeiten.

Um Drive auf Colab zu mounten, stellen Sie eine Verbindung zur Laufzeit her und drücken Sie auf das Symbol unten.

Dann wird der folgende Code eingefügt, bitte führen Sie diesen aus.

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

Öffnen Sie die angezeigte URL in Ihrem Browser, kopieren Sie den Bestätigungscode darüber hinaus und fügen Sie ihn in das Textfeld ein.

Damit ist die Montage abgeschlossen.

Installieren Sie den Google API-Client

Installieren Sie den Google API-Client für Python.

!pip install google-api-python-client

Implementierung

Ich werde die Implementierung des oben genannten Quellcodes erklären.

1. Authentifizieren Sie sich und holen Sie sich den Drive Service

Holen Sie sich ein Service-Objekt, um mit Drive im Google API-Client zu arbeiten.

Authentifizieren Sie sich mit der Authentifizierung von Colab und rufen Sie das Drive Service-Objekt im Google API-Client ab.

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

#Authentifizierung
auth.authenticate_user()
#Lassen Sie den Service das Laufwerk bedienen
drive_service = build('drive', 'v3')

2. Verarbeitete PDF-Dateien werden anhand des Dateinamens auf Duplikate überprüft und vom Ziel ausgeschlossen

Dieses Mal wird die konvertierte Datei an einem Ort gespeichert. Darüber hinaus wird eine doppelte Prüfung durchgeführt, um die erneute Ausführung zu ermöglichen, wenn der Prozess in der Mitte endet oder eine PDF-Datei hinzugefügt wird.

Es durchsucht rekursiv das Stammverzeichnis des virtuellen lokalen und fügt die in der Variablen exist_filenames (Array) vorhandenen Dateinamen der Reihe nach hinzu.

#Dateien rekursiv abrufen
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:
        #Konvertieren Sie die volle Breite in die halbe Breite und entfernen Sie die Erweiterung
        exist_filename = full_to_half(filename).replace('.gdoc', '')
        #Fügen Sie den vorhandenen Dateinamen hinzu
        exist_filenames.append(exist_filename)

3. Erstellen Sie eine Liste der zu konvertierenden PDFs

Erstellen Sie eine Liste der PDF-Dateien, die zur Laufzeit konvertiert werden sollen. Wenn die in Prozess 2 erfassten Nicht-Zieldateien übereinstimmen, werden sie übersprungen. Wenn die PDF-Datei nicht übereinstimmt, handelt es sich um eine neue Ergänzung. Fügen Sie sie daher als zu verarbeitendes PDF zur Variablen pdf_infos (Array) hinzu.

#Dateien rekursiv abrufen
files = glob.glob(input_path, recursive=True)
pdf_infos = []
for root, dirs, files in os.walk(input_path):
    for filename in files:
      #print(filename)
      #Schließt vorhandene Dateinamen aus
      if full_to_half(filename) in exist_filenames:
        #print('Existiert')
        pass
      else:
        #Erweiterung ist PDF
        if filename[-4:] == '.PDF' or filename[-4:] == '.pdf':
          #print('nicht existieren')
          filepath = os.path.join(root, filename) #Lokaler Dateipfad auf Colab
          pdf_infos.append({
                'path': filepath,
                'name': filename
            })

4. Konvertieren Sie die Ziel-PDF-Datei

Basierend auf der Liste, die im Prozess bis zu 3 extrahiert wurde, wird die PDF-Datei konvertiert.

Erstellen Sie eine neue Datei in Drive mit den Drive Service-Objektdateien (). Create () .execute (). Wenn Sie zu diesem Zeitpunkt den Wert von Dokumente für den MIME-Typ angeben, wird dieser automatisch in die OCR-verarbeitete Dokumentdatei konvertiert.

Geben Sie den konvertierten Dateinamen, den MIME-Typ und die übergeordnete Verzeichnis-ID im body-Parameter von create () an. Geben Sie für den Parameter media_body die PDF-Datei an, die von MediaFileUpdate auf Google hochgeladen wurde.

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

  #print(pdf_path)

  pdf_filename = pdf_info['name']
  #Dateiname nach OCR
  #print(pdf_filename)

  #Konvertieren Sie Alphabete in voller Breite in halbe Breite
  pdf_filename = full_to_half(pdf_filename)

  body = {
      'name': pdf_filename,
      'mimeType': MIME_TYPE,
      'parents': ['Ausgabeziel Laufwerksverzeichnis-ID']
  }
  try:
    media_body = MediaFileUpload(pdf_path, mimetype=MIME_TYPE, resumable=True)

    drive_service.files().create(
        body=body,
        media_body=media_body,
    ).execute()
  except:
    print('Error:Fehler beim Erstellen der Dokumentdatei.')
    print(pdf_path)

Es wurde ein Problem behoben, bei dem die Buchstaben im konvertierten Dateinamen in voller Breite angezeigt wurden

Durch OCR-Konvertierung von PDF-Dateien erstellte Dokumentdateien haben alphabetische Zeichen in voller Breite. Ich habe dies mit dem folgenden Code untersucht.

chars = [
  'm',  #Aus der Dokumentendatei kopierte Zeichen
  'm'  #Durch direkte Eingabe eingegebene Zeichen
]

#Volle Breite (Dateiname nach Konvertierung)
print(hex(ord(chars[0])))
#Halbe Grösse
print(hex(ord(chars[1])))

#Konvertieren Sie Alphabete voller Breite in Alphabete halber Breite
print(hex(ord(chars[0].translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)})))))

Ausführungsergebnis

0xff4d
0x6d
0x6d

Aus den obigen Ausführungsergebnissen wurde festgestellt, dass der konvertierte Dateiname die volle Breite hat und in die halbe Breite konvertiert werden kann.

Für die Konvertierung habe ich auf diesen Artikel verwiesen. [Python] Konvertieren Sie volle und halbe Breite in einer Zeile (Alphabet + Zahl + Symbol) - Qiita

abschließend

Mit dem oben genannten wurde die OCR-Konvertierung von PDF-Dateien implementiert. Wir hoffen auf Ihre Referenz.

Recommended Posts