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.
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
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
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.
verwendetSobald 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..")
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.
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!