> 백엔드 개발 > 파이썬 튜토리얼 > 포함된 글꼴 PDF에서 텍스트 잠금 해제: pytesseract OCR 튜토리얼

포함된 글꼴 PDF에서 텍스트 잠금 해제: pytesseract OCR 튜토리얼

Patricia Arquette
풀어 주다: 2024-12-01 18:47:09
원래의
899명이 탐색했습니다.

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

PDF에서 텍스트를 추출하는 작업은 일반적으로 PDF가 영어로 되어 있고 글꼴이 포함되지 않은 경우 간단합니다. 그러나 이러한 가정이 제거되면 pdfminer 또는 pdfplumber와 같은 기본 Python 라이브러리를 사용하는 것이 어려워집니다. 지난달에는 구자라트어 ​​PDF에서 텍스트를 추출하고 이름, 주소, 도시 등의 데이터 필드를 JSON 형식으로 가져오는 임무를 맡았습니다.

PDF 자체에 글꼴이 포함된 경우 간단한 복사-붙여넣기가 작동하지 않으며 pdfplumber를 사용하면 읽을 수 없는 정크 텍스트가 반환됩니다. 따라서 각 PDF 페이지를 이미지로 변환한 다음 페이지를 단순히 읽는 대신 pytesseract 라이브러리를 사용하여 OCR을 적용하여 페이지를 "스캔"해야 했습니다. 이 튜토리얼에서는 이를 수행하는 방법을 보여줍니다.

필요한 것

  • pdfplumumber(Python 라이브러리)
  • pdf2image(Python 라이브러리)
  • pytesseract(Python 라이브러리)
  • 테서랙트-ocr

아래와 같이 pip 명령을 사용하여 Python 라이브러리를 설치할 수 있습니다. Tesseract-OCR의 경우 공식 사이트에서 소프트웨어를 다운로드하여 설치하세요. pytesseract는 tesseract 소프트웨어를 둘러싼 래퍼일 뿐입니다.

pip install pdfplumber
pip install pdf2image
pip install pytesseract
로그인 후 복사

PDF 페이지를 이미지로 변환

첫 번째 단계는 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 이미지를 읽거나 구문 분석하는 것은 거의 불가능했습니다. 이것이 진정한 진전입니다! 즐거운 코딩 되시기 바랍니다. 아래 댓글로 어떻게 진행되는지 알려주세요.

참고자료

  • Windows에 Tesseract 설치
  • pytesseract OCR을 사용하여 이미지에서 텍스트 인식
  • Windows 10에서 영어가 아닌 언어에 대한 텍스트 감지를 지원하도록 pytesseract를 구성하는 방법은 무엇입니까?

위 내용은 포함된 글꼴 PDF에서 텍스트 잠금 해제: pytesseract OCR 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿