Apidog

올인원 협업 API 개발 플랫폼

API 설계

API 문서

API 디버깅

API 모킹

API 자동화 테스트

대형 PDF의 OCR을 위한 Gemini 2.0 Flash 사용법

Young-jae

Young-jae

Updated on March 1, 2025

💡
시작하기 전에 간단한 안내사항을 드리겠습니다: 오늘 Apidog를 무료로 다운로드하여 API 테스트 프로세스를 간소화하세요. 특히 Claude 3.7 Sonnet의 강력한 기능을 탐색하는 데 적합하며, 최첨단 AI 모델을 테스트하려는 개발자에게 완벽한 도구입니다!
버튼

문서 인텔리전스와 함께 작업하는 데이터 과학자로서, 대규모 복잡한 PDF에서 텍스트를 추출하고 처리하는 데 어려움을 겪어본 적이 많습니다. 전통적인 OCR(광학 문자 인식) 파이프라인은 일반적으로 여러 단계, 전문 도구 및 상당한 처리 시간을 포함합니다. 그러나 Gemini 2.0 Flash의 도입은 이러한 문서를 처리하는 방법을 변화시켰습니다. 본 기사에서는 복잡한 RAG(검색 보완 생성) 아키텍처를 사용하지 않고 대규모 PDF에 대한 강력한 OCR 솔루션으로 Gemini 2.0 Flash를 사용하는 개인 워크플로를 공유하겠습니다.

Gemini 2.0 Flash에 대한 나의 소개

Gemini 2.0 Flash와 처음 만난 것은 수백 개의 레거시 재무 보고서를 스캔한 PDF 형식으로 다루는 프로젝트에서 고군분투한 후였습니다. 전통적인 OCR 도구는 테이블을 올바르게 캡처하지 못하거나 광범위한 후처리를 요구했습니다. Google이 인상적인 100만 토큰 컨텍스트 창과 다중 모드 기능을 갖춘 Gemini 2.0 Flash를 출시했을 때, 나는 즉시 그 잠재력을 인식했습니다.

Gemini 2.0 Flash는 단순한 언어 모델이 아닙니다. 문서 내의 텍스트와 시각적 콘텐츠를 이해할 수 있는 다중 모드의 강력한 도구입니다. 이는 컨텍스트와 시각적 이해가 중요한 OCR 작업에 독특하게 적합합니다. 단일 작업에서 약 1,500페이지를 처리할 수 있는 능력 덕분에 대규모 문서 OCR에 있어 나의 주요 솔루션이 되었습니다.

내 OCR 환경 설정하기

내 OCR 워크플로에 들어가기 전에 신뢰할 수 있는 기술 기반을 마련해야 했습니다. 다음은 내 환경 설정 방법입니다:

  1. 필수 라이브러리 설치: 먼저, Gemini와 상호작용하고 PDF를 처리하기 위해 필요한 Python 패키지를 설치했습니다:
pip install google-generativeai
pip install pypdf
pip install pdf2image
pip install pillow
pip install python-dotenv
  1. API 접근 구성: Google Cloud Console에서 프로젝트를 생성하고 Gemini API를 활성화하며 API 키를 생성했습니다. 이 키는 환경 변수를 사용하여 안전하게 보관합니다:
import os
import google.generativeai as genai
from dotenv import load_dotenv

# .env 파일에서 API 키 로드하기
load_dotenv()
api_key = os.getenv('GOOGLE_API_KEY')

# Gemini API 구성
genai.configure(api_key=api_key)
  1. 모델 초기화: 다중 모드 입력을 지원하는 Gemini 2.0 Flash에 접근합니다:
# Gemini 2.0 Flash 초기화
model = genai.GenerativeModel('gemini-2.0-flash')

내 PDF 변환 및 이미지 추출 워크플로

Gemini 2.0 Flash로 효과적인 OCR을 위해 대규모 PDF를 처리하는 시스템적 접근 방식을 개발했습니다:

  1. 이미지로 변환: 먼저 PDF 페이지를 고해상도 이미지로 변환합니다:
from pdf2image import convert_from_path
import os

def convert_pdf_to_images(pdf_path, output_folder, dpi=300):
    # 존재하지 않는 출력 디렉토리 생성
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    # PDF 페이지를 이미지로 변환
    images = convert_from_path(pdf_path, dpi=dpi)
    
    # 이미지를 출력 폴더에 저장
    image_paths = []
    for i, image in enumerate(images):
        image_path = os.path.join(output_folder, f'page_{i+1}.jpg')
        image.save(image_path, 'JPEG')
        image_paths.append(image_path)
    
    return image_paths
  1. 대규모 PDF의 배치 처리: 특히 대규모 문서의 경우 이미지를 배치로 처리합니다:
def batch_images(image_paths, batch_size=50):
    """처리를 위한 이미지 배치 그룹화"""
    for i in range(0, len(image_paths), batch_size):
        yield image_paths[i:i + batch_size]

Gemini 2.0 Flash를 이용한 내 OCR 파이프라인

다음은 내 워크플로에서 Gemini 2.0 Flash의 강력한 기능이 빛나는 부분입니다:

  1. 이미지에서 텍스트로 직접 변환: 다중 모드 기능을 통해 이미지를 직접 처리합니다:
from PIL import Image
from IPython.display import display
import base64
import io

def ocr_with_gemini(image_paths, instruction):
    """Gemini 2.0 Flash로 이미지를 처리하여 OCR 수행"""
    images = [Image.open(path) for path in image_paths]
    
    prompt = f"""
    {instruction}
    
    이들은 PDF 문서의 페이지입니다. 구조를 유지하면서 모든 텍스트 콘텐츠를 추출하세요.
    테이블, 열, 헤더 및 모든 구조화된 콘텐츠에 특별히 주의하세요.
    단락 구분 및 형식을 유지하세요.
    """
    
    response = model.generate_content([prompt, *images])
    return response.text
  1. 복잡한 문서 요소 처리 접근:

테이블, 차트 및 다중 열 텍스트를 포함한 복잡한 레이아웃의 문서에 대해 특정 지침을 사용합니다:

def ocr_complex_document(image_paths):
    instruction = """
    이 문서 페이지에서 모든 텍스트 콘텐츠를 추출하세요.
    테이블의 경우:
    1. 마크다운 테이블 형식을 사용하여 테이블 구조를 유지하세요.
    2. 모든 열 머리글 및 행 레이블을 보존하세요.
    3. 숫자 데이터가 정확하게 캡처되도록 하세요.
    
    다중 열 레이아웃의 경우:
    1. 왼쪽에서 오른쪽으로 열을 처리하세요.
    2. 서로 다른 열의 콘텐츠를 명확하게 구분하세요.
    
    차트 및 그래프의 경우:
    1. 차트 유형을 설명하세요.
    2. 가시적인 축 레이블, 범례 및 데이터 포인트를 추출하세요.
    3. 제목 또는 캡션을 추출하세요.
    
    모든 헤더, 바닥글, 페이지 번호 및 각주를 보존하세요.
    """
    
    return ocr_with_gemini(image_paths, instruction)
  1. 재무 문서에 대한 전문 OCR:

내가 작업하는 PDF의 많은 부분은 재무 데이터를 포함하고 있으며, 이는 특별한 주의를 필요로 합니다:

def ocr_financial_document(image_paths):
    instruction = """
    이 재무 문서 페이지에서 모든 텍스트 콘텐츠를 추출하세요.
    
    특히 주의해야 할 사항:
    1. 모든 숫자 값이 정확하게 전사되었는지 확인하세요.
    2. 통화 기호와 숫자와의 정확한 연관성.
    3. 재무 테이블 - 정확한 구조와 정렬을 유지하세요.
    4. 대차대조표, 손익계산서 및 현금 흐름표.
    5. 각주 및 공시 - 종종 중요한 정보를 포함합니다.
    6. 재무 기간과 관련된 날짜.
    
    테이블의 구조를 유지하기 위해 마크다운 테이블 구문을 사용하세요.
    """
    
    return ocr_with_gemini(image_paths, instruction)

내 품질 보증 프로세스

문서 특성에 따라 OCR 품질이 달라질 수 있으므로 품질 검사 프로세스를 구현했습니다:

def verify_ocr_quality(image_path, extracted_text):
    """특정 페이지에 대한 OCR 결과 품질 검증"""
    image = Image.open(image_path)
    
    prompt = f"""
    나는 역시 OCR을 사용하여 추출한 텍스트와 문서 페이지가 있습니다.
    
    원본 이미지와 추출된 텍스트를 비교하고 오류나 누락된 부분을 식별하세요.
    초점을 맞춰야 할 사항:
    1. 누락된 텍스트
    2. 잘못 인식된 문자
    3. 테이블 구조 문제
    4. 특수 문자 또는 기호 문제
    
    추출된 텍스트:
    {extracted_text}
    """
    
    response = model.generate_content([prompt, image])
    return response.text

이 기능을 사용하여 큰 문서에서 무작위로 페이지를 점검하여 품질을 보장합니다.

컨텍스트 한계를 넘어 대규모 문서 처리하기 위한 내 프로세스

Gemini 2.0 Flash는 인상적인 100만 토큰 한계를 가지고 있지만, 일부 문서는 여전히 이 용량을 초과합니다. 이러한 경우, 나는 순차 처리 접근 방식을 개발했습니다:

  1. 의미 있는 세그먼트로 PDF 처리:
def process_large_pdf(pdf_path, output_folder, output_file):
    # PDF를 이미지로 변환
    image_paths = convert_pdf_to_images(pdf_path, output_folder)
    
    # 이미지 배치 생성 (예: 챕터 또는 섹션별로)
    batches = batch_images(image_paths, 30)  # 문서 복잡성에 따라 배치 크기 조정
    
    full_text = ""
    for i, batch in enumerate(batches):
        print(f"배치 {i+1} 처리 중...")
        batch_text = ocr_with_gemini(batch, "모든 텍스트를 추출하되 문서 구조 유지")
        full_text += f"\n\n--- 배치 {i+1} ---\n\n{batch_text}"
    
    # 전체 추출된 텍스트 저장
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write(full_text)
    
    return full_text
  1. 문서 일관성을 위한 후처리:

모든 배치에서 텍스트를 추출한 후, Gemini 2.0 Flash를 사용하여 일관성을 보장합니다:

def harmonize_document(extracted_text):
    prompt = """
    다음 텍스트는 대규모 PDF 문서에서 배치로 추출되었습니다.
    내용을 조화시키기 위해:
    1. 모든 배치 구분 마커 제거
    2. 전체적으로 일관된 형식 보장
    3. 배치 경계에서의 테이블 구조 문제 수정
    4. 배치 경계를 넘어서 자연스러운 단락 및 섹션 흐름 보장
    
    원래 추출된 텍스트:
    """
    
    response = model.generate_content(prompt + extracted_text)
    return response.text

전문 사용 사례: 역사적 문서 OCR에 대한 나의 접근 방식

내가 가장 도전적인 OCR 프로젝트 중 일부는 노후된 종이, 바랜 텍스트 또는 특이한 글꼴이 있는 역사적 문서와 관련이 있습니다. 이를 위해 나는 전문적인 접근 방식을 개발했습니다:

def historical_document_ocr(image_paths):
    instruction = """
    이러한 역사적 문서 이미지에서 텍스트를 추출하세요.
    
    다음과 같은 도전 과제를 고려하세요:
    1. 얼룩이나 변색이 있는 노후된 종이
    2. 바랜 잉크 또는 서체
    3. 구식 타이포그래피 및 리가처
    4. 손으로 쓴 주석
    5. 비표준 페이지 레이아웃
    
    필요할 경우 형식 보존보다 정확성을 우선시하세요.
    불확실한 텍스트는 [?]로 표시하세요.
    """
    
    extracted_text = ocr_with_gemini(image_paths, instruction)
    
    # 추가적인 컨텍스트 기반 수정
    correction_prompt = f"""
    다음 텍스트는 품질 문제를 가질 수 있는 역사적 문서에서 추출되었습니다.
    일반적인 역사적 문서의 OCR 오류를 확인하기 위해 텍스트를 검토하세요:
    1. 노후된 종이나 바랜 잉크로 인하여 잘못 해석된 단어 수정
    2. 구식 철자 수정은 OCR 오류처럼 보일 경우에만 수행 (실제로 시대에 맞는 경우는 수정하지 마세요)
    3. 맥락이 올바른 해독을 명확히 하는 경우, [?]로 표시된 불확실한 텍스트 해결
    
    원래 텍스트:
    {extracted_text}
    """
    
    corrected_text = model.generate_content(correction_prompt)
    return corrected_text.text

내 OCR 프로젝트에서의 실용적인 결과

내 경험으로는 Gemini 2.0 Flash를 사용하여 수십 개의 대규모 문서에서 전통적인 OCR 방법 대비 현저한 개선을 이뤘습니다:

  1. 정확도 개선: 복잡한 재무 보고서에서 테이블과 차트를 포함한 경우, 나의 정확도는 전통적인 OCR로 약 85%에서 Gemini 2.0 Flash로는 95%를 넘는 수준으로 개선되었습니다. 모델의 컨텍스트 이해 능력 덕분에 불확실한 문자를 주변 내용에 따라 올바르게 해석할 수 있었습니다.
  2. 처리 시간 단축: 예전에는 여러 시간의 처리 및 수동 수정이 필요했던 작업이 이제는 몇 분이면 완료됩니다. 별도의 OCR과 텍스트 이해 단계를 불필요하게 함으로써 내 워크플로는 상당히 효율적으로 변화했습니다.
  3. 테이블 구조 보존: 내가 인상적으로 본 기능 중 하나는 Gemini 2.0 Flash가 복잡한 테이블 구조를 유지할 수 있는 능력입니다. 재무 문서에서는 데이터 무결성을 보장하는 데 매우 유용했습니다.

결론: 내 문서 처리 워크플로에 미치는 영향

대규모 PDF OCR에 Gemini 2.0 Flash를 채택함으로써 내 문서 처리 워크플로가 변화했습니다. 대부분의 사용 사례에 대해 복잡한 RAG 아키텍처를 제거함으로써 기술 인프라가 간소화되었고 결과는 향상되었습니다. 모델의 다중 모드 기능 덕분에 문서의 시각적 요소와 텍스트 콘텐츠를 동시에 이해할 수 있게 되어 보다 지능적 텍스트 추출이 가능해졌습니다.

가장 인상적인 점은 모델이 전통적인 OCR 시스템이 어려움을 겪는 엣지 케이스들—손으로 쓴 주석, 워터마크, 비정상적인 글꼴 및 복잡한 레이아웃을 처리할 수 있는 능력입니다. Gemini 2.0 Flash의 대규모 컨텍스트 윈도우를 활용하여 단일 작업에서 문서의 상당 부분을 처리할 수 있으며, 이로 인해 일관성과 컨텍스트 이해를 유지할 수 있습니다.

대규모 문서 컬렉션으로 정기적으로 작업하는 데이터 과학자, 연구원 및 전문가에게 Gemini 2.0 Flash는 단순한 점진적 개선이 아니라 OCR 및 문서 이해 접근 방식의 근본적인 변화를 의미합니다. 문서를 인간처럼 "보고" 및 "읽는" 능력—레이아웃, 컨텍스트 및 시각적 요소를 총체적으로 고려하는 것은 문서 인텔리전스 응용 프로그램의 새로운 가능성을 열어줍니다.

내 워크플로를 다듬어 가는 동안, 나는 이 기술이 이전에는 노동 집약적이거나 기술적으로 도전했던 문서 처리 작업들을 간소화할 수 있는 새로운 방법을 지속적으로 발견하고 있습니다. 문서 OCR의 미래는 여기 있으며, 이는 내가 한때 전문적인 존재로서 고통받던 대규모 PDF 아카이브를 다루는 방식을 혁신하고 있습니다.

버튼