PDF에서 텍스트를 추출하는 작업은 일반적으로 PDF가 영어로 되어 있고 글꼴이 포함되지 않은 경우 간단합니다. 그러나 이러한 가정이 제거되면 pdfminer 또는 pdfplumber와 같은 기본 Python 라이브러리를 사용하는 것이 어려워집니다. 지난달에는 구자라트어 PDF에서 텍스트를 추출하고 이름, 주소, 도시 등의 데이터 필드를 JSON 형식으로 가져오는 임무를 맡았습니다.
PDF 자체에 글꼴이 포함된 경우 간단한 복사-붙여넣기가 작동하지 않으며 pdfplumber를 사용하면 읽을 수 없는 정크 텍스트가 반환됩니다. 따라서 각 PDF 페이지를 이미지로 변환한 다음 페이지를 단순히 읽는 대신 pytesseract 라이브러리를 사용하여 OCR을 적용하여 페이지를 "스캔"해야 했습니다. 이 튜토리얼에서는 이를 수행하는 방법을 보여줍니다.
아래와 같이 pip 명령을 사용하여 Python 라이브러리를 설치할 수 있습니다. Tesseract-OCR의 경우 공식 사이트에서 소프트웨어를 다운로드하여 설치하세요. pytesseract는 tesseract 소프트웨어를 둘러싼 래퍼일 뿐입니다.
pip install pdfplumber pip install pdf2image pip install pytesseract
첫 번째 단계는 PDF 페이지를 이미지로 변환하는 것입니다. 이 extract_text_from_pdf() 함수는 PDF 경로와 page_num(인덱스 0)을 매개변수로 전달하는 것과 정확히 같은 작업을 수행합니다. 명확성을 위해 먼저 페이지를 흑백으로 변환하고 있으며 이는 선택 사항입니다.
# 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
ocr_image() 함수는 pytesseract를 사용하여 OCR을 통해 이미지에서 텍스트를 추출합니다. --oem 및 --psm과 같은 기술 매개변수는 이미지 처리 방법을 제어하고 -l guj eng 매개변수는 읽을 언어를 설정합니다. 이 PDF에는 가끔 영어 텍스트가 포함되어 있으므로 guj eng을 사용했습니다.
OCR을 사용하여 텍스트를 가져온 후에는 원하는 형식으로 구문 분석할 수 있습니다. 이는 pdfplumber 또는 pypdf2와 같은 다른 PDF 라이브러리와 유사하게 작동합니다.
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..")
모든 PDF에는 고려해야 할 고유한 뉘앙스가 있습니다. 이 경우 첫 번째 필드의 새 일련번호(예: 0૧ 또는 0૨)는 후속 필드(성)가 변경될 때 새 그룹을 나타냅니다.
pytesseract는 IT 기술의 진화와 발전을 보여주는 증거입니다. 약 10년 전만 해도 적절하게 구성된 PC나 노트북에서 영어가 아닌 언어로 OCR을 사용하여 PDF 이미지를 읽거나 구문 분석하는 것은 거의 불가능했습니다. 이것이 진정한 진전입니다! 즐거운 코딩 되시기 바랍니다. 아래 댓글로 어떻게 진행되는지 알려주세요.
위 내용은 포함된 글꼴 PDF에서 텍스트 잠금 해제: pytesseract OCR 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!