Heim > Backend-Entwicklung > Python-Tutorial > Freischalten von Text aus PDFs mit eingebetteten Schriftarten: Ein Pytesseract-OCR-Tutorial

Freischalten von Text aus PDFs mit eingebetteten Schriftarten: Ein Pytesseract-OCR-Tutorial

Patricia Arquette
Freigeben: 2024-12-01 18:47:09
Original
855 Leute haben es durchsucht

Unlocking Text from Embedded-Font PDFs: A pytesseract OCR Tutorial

Das Extrahieren von Text aus einem PDF ist normalerweise unkompliziert, wenn es auf Englisch ist und keine eingebetteten Schriftarten enthält. Sobald diese Annahmen jedoch beseitigt sind, wird es schwierig, grundlegende Python-Bibliotheken wie pdfminer oder pdfplumber zu verwenden. Letzten Monat wurde ich damit beauftragt, Text aus einem Gujarati-PDF zu extrahieren und Datenfelder wie Name, Adresse, Stadt usw. in das JSON-Format zu importieren.

Wenn die Schriftart in die PDF-Datei selbst eingebettet ist, funktioniert einfaches Kopieren und Einfügen nicht und die Verwendung von pdfplumber führt zu unlesbarem Junk-Text. Daher musste ich jede PDF-Seite in ein Bild konvertieren und dann OCR mithilfe der Pytesseract-Bibliothek anwenden, um die Seite zu „scannen“, anstatt sie nur zu lesen. Dieses Tutorial zeigt Ihnen, wie Sie genau das tun.

Dinge, die Sie brauchen werden

  • pdfplumber (Python-Bibliothek)
  • pdf2image (Python-Bibliothek)
  • pytesseract (Python-Bibliothek)
  • tesseract-ocr

Sie können die Python-Bibliotheken mit Pip-Befehlen installieren, wie unten gezeigt. Laden Sie für Tesseract-OCR die Software von der offiziellen Website herunter und installieren Sie sie. Pytesseract ist nur ein Wrapper um die Tesseract-Software.

pip install pdfplumber
pip install pdf2image
pip install pytesseract
Nach dem Login kopieren

Konvertieren der PDF-Seite in ein Bild

Der erste Schritt besteht darin, Ihre PDF-Seite in ein Bild zu konvertieren. Diese Funktion extract_text_from_pdf() macht genau das – Sie übergeben den PDF-Pfad und die page_num (null indiziert) als Parameter. Beachten Sie, dass ich die Seite aus Gründen der Übersichtlichkeit zunächst in Schwarzweiß umwandle. Dies ist optional.

# Extract text from a specific page of a PDF
def extract_text_from_pdf(pdf_path, page_num):
    # Use pdfplumber to open the PDF
    pdf = pdfplumber.open(pdf_path)
    print(f"extracting page {page_num}..")
    page = pdf.pages[page_num]
    images = convert_from_path(pdf_path, first_page=page_num+1, last_page=page_num+1)
    image = images[0]
    # Convert to black and white
    bw_image = convert_to_bw(image)
    # Save the B&W image for debugging (optional)
    #bw_image.save("bw_page.png")
    # Perform OCR on the B&W image
    e_text = ocr_image(bw_image)
    open('out.txt', 'w', encoding='utf-8').write(e_text)
    #print("output written to file.")
    try:
        process_text(page_num, e_text)
    except Exception as e:
        print("Error occurred:", e)
    print("done..")

# Convert image to black and white
def convert_to_bw(image):
    # Convert to grayscale
    gray = image.convert('L')
    # Apply threshold to convert to pure black and white
    bw = gray.point(lambda x: 0 if x < 128 else 255, '1')
    return bw

# Perform OCR using Tesseract on a given image
def ocr_image(image_path):
    try:
        # Perform OCR
        custom_config = r'--oem 3 --psm 6 -l guj+eng'
        text = pytesseract.image_to_string(image_path, config=custom_config)  # --psm 6 treats the image as a block of text
        return text
    except Exception as e:
        print(f"Error during OCR: {e}")
        return None

Nach dem Login kopieren

Die Funktion ocr_image() verwendet Pytesseract, um Text aus dem Bild durch OCR zu extrahieren. Die technischen Parameter wie --oem und --psm steuern, wie das Bild verarbeitet wird, und der Parameter -l guj eng legt die zu lesenden Sprachen fest. Da dieses PDF gelegentlich englischen Text enthielt, habe ich guj eng.

verwendet

Bearbeitung des Textes

Sobald Sie den Text mit OCR importiert haben, können Sie ihn im gewünschten Format analysieren. Dies funktioniert ähnlich wie bei anderen PDF-Bibliotheken wie pdfplumber oder pypdf2.

nums = ['0', '૧', '૨', '૩', '૪', '૫', '૬', '૭', '૮', '૯']

def process_text(page_num, e_text):
    obj = None
    last_surname = None
    last_kramank = None
    print(f"processing page {page_num}..")
    for line in e_text.splitlines():
        line = line.replace('|', '').replace('[', '').replace(']', '')
        parts = [word for word in line.split(' ') if word]
        if len(parts) == 0: continue
        new_rec = True
        for char in parts[0]:
            if char not in nums:
                new_rec = False
                break
        if len(parts) < 2: continue

        if new_rec and len(parts[0]) >= 2: # numbered line
            if len(parts) < 9: continue
            if obj: records.append(obj)
            obj = {}
            last_surname = parts[1]
            obj['kramank'] = parts[0]
            last_kramank = parts[0]
            obj['full_name'] = ' '.join(parts[1:4])
            obj['surname'] = parts[1]
            obj['pdf_page_num'] = page_num + 1
            obj['registered_by'] = parts[4]
            obj['village_vatan'] = parts[5]
            obj['village_mosal'] = parts[6]
            if parts[8] == 'વર્ષ':
                idx = 7
                obj['dob'] = parts[idx] + ' વર્ષ'
                idx += 1
            elif len(parts[7]) == 8 and parts[7][2] == '-':
                idx = 7
                obj['dob'] = parts[idx]
            else:
                print("warning: no date")
                idx = 6
            obj['marital_status'] = parts[idx+1]
            obj['extra_fields'] = '::'.join(parts[idx+2:-2])
            obj['blood_group'] = parts[-1]
        elif parts[0] == last_surname: # new member in existing family
            if obj: records.append(obj)
            obj = {}
            obj['kramank'] = last_kramank
            obj['surname'] = last_surname
            obj['full_name'] = ' '.join(parts[0:3])
            obj['pdf_page_num'] = page_num + 1
            obj['registered_by'] = parts[3]
            obj['village_vatan'] = parts[4]
            obj['village_mosal'] = parts[5]
            if len(parts) <= 6: continue
            if parts[7] == 'વર્ષ': # date exists
                idx = 6
                obj['dob'] = parts[idx] + ' વર્ષ'
                idx += 1
            elif len(parts[6]) == 8 and parts[6][2] == '-':
                idx = 6
                obj['dob'] = parts[idx]
            else:
                print("warning: no date")
                idx = 5
            obj['marital_status'] = parts[idx+1]
            obj['extra_fields'] = '::'.join(parts[idx+2:-2])
            obj['blood_group'] = parts[-1]
        elif obj: # continuation lines
            if ("(" in line and ")" in line) or "મો.ઃ" in line:
                obj['extra_fields'] += ' ' + '::'.join(parts[0:])
    if obj: records.append(obj)        
    jstr = json.dumps(records, indent=4)
    open("guj.json", 'w', encoding='utf-8').write(jstr)
    print(f"written page {page_num} to json..")
Nach dem Login kopieren

Jedes PDF hat seine eigenen Nuancen, die berücksichtigt werden müssen. In diesem Fall signalisierte eine neue Seriennummer (wie 0૧ oder 0૨) im ersten Feld eine neue Gruppe, wenn sich das nachfolgende Feld (Nachname) änderte.

Pytesseract ist ein Beweis für die Entwicklung und den Fortschritt in der IT-Technologie. Vor etwa einem Jahrzehnt wäre das Lesen oder Analysieren eines PDF-Bilds mithilfe von OCR in einer nicht-englischen Sprache auf einem bescheiden konfigurierten PC oder Laptop nahezu unmöglich gewesen. Das ist wirklich ein Fortschritt! Viel Spaß beim Programmieren und lassen Sie mich in den Kommentaren unten wissen, wie es läuft.

Referenzen

  • Tesseract-Installation unter Windows
  • Verwenden Sie Pytesseract OCR, um Text aus einem Bild zu erkennen
  • Wie konfiguriere ich Pytesseract zur Unterstützung der Texterkennung für nicht-englische Sprachen in Windows 10?

Das obige ist der detaillierte Inhalt vonFreischalten von Text aus PDFs mit eingebetteten Schriftarten: Ein Pytesseract-OCR-Tutorial. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage