이번 시리즈에서는 파이썬을 활용하여 PDF에서 OCR(광학 문자 인식) 기술로 데이터를 추출하고 엑셀로 정리하는 방법을 알아보겠습니다. 해당 시리즈는 총 3부작으로 구성됩니다.
(1) 기본 설계 및 개요
(2) OCR 구현 및 텍스트 추출
(3) 데이터 파싱 및 엑셀 정리
1. 프로젝트 배경 및 필요성
업무를 하다 보면 PDF 형태의 파일에서 데이터를 수작업으로 추출하는 경우가 많습니다.
이렇게 정형화된 데이터를 매번 수작업으로 엑셀에 입력하는 것은 시간이 많이 소요되고 오류가 발생할 가능성도 높습니다.
이러한 작업을 자동화하면 다음과 같은 이점이 있습니다.
- 업무 처리 시간 단축
- 데이터 입력 오류 감소
- 반복 작업 자동화로 인한 효율성 증가
- 대량의 데이터 처리 가능
2. 전체 프로젝트 구조
본 예제 프로젝트는 다음과 같은 프로세스로 진행됩니다.
- PDF 문서를 이미지로 변환
- 이미지에 OCR(광학 문자 인식) 적용하여 텍스트 추출
- 추출된 텍스트에서 표 데이터 파싱
- 구조화된 데이터를 엑셀 파일로 저장
각 단계를 모듈화하여 구현하면 나중에 유지보수하기 쉽고, 다른 유사한 프로젝트에도 재사용할 수 있습니다.
3. 필요한 패키지 및 환경 설정
프로젝트에 필요한 파이썬 패키지들을 설치합니다.
pip install pytesseract pillow pdf2image pandas opencv-python
각 패키지의 역할은 다음과 같습니다.
- pytesseract: 이미지에서 텍스트를 인식하는 OCR 도구로 Tesseract 엔진을 파이썬에서 사용할 수 있도록 함
- pillow: 이미지를 열고, 크기 조정, 저장 등의 기본적인 이미지 처리 기능을 제공
- pdf2image: PDF 문서를 이미지 파일로 변환해주는 도구
- pandas: 테이블 형태의 데이터를 쉽게 다루고 엑셀 파일로 저장할 수 있도록 함
- opencv-python: 이미지 전처리(그레이스케일 변환, 노이즈 제거 등)를 통해 OCR 정확도를 높이는 데 사용
참고: pytesseract는 실제 Tesseract OCR 엔진의 파이썬 인터페이스일 뿐이므로, Tesseract OCR 엔진을 별도로 설치해
야 합니다.
- Windows: Tesseract Installer에서 다운로드하여 설치
- macOS: brew install tesseract
- Linux: sudo apt install tesseract-ocr
또한 한국어 인식을 위해 Tesseract 언어 데이터를 설치해야 합니다.
- Windows: 설치 과정에서 한국어 언어팩 선택
- macOS: brew install tesseract-lang
- Linux: sudo apt install tesseract-ocr-kor
4. 프로젝트 디렉토리 구조
프로젝트를 체계적으로 관리하기 위해 다음 형식과 같은 디렉토리 구조를 갖추면 좋습니다.
export_data_extractor/
├── main.py # 메인 실행 파일
├── pdf_converter.py # PDF 변환 모듈
├── ocr_engine.py # OCR 엔진 모듈
├── data_parser.py # 데이터 파싱 모듈
├── requirements.txt # 필요한 패키지 목록
├── input/ # 입력 PDF 파일을 저장할 디렉토리
├── temp_images/ # 임시 이미지 파일을 저장할 디렉토리
└── output/ # 출력 엑셀 파일을 저장할 디렉토리
이러한 구조는 각 모듈의 역할을 명확히 분리하고, 입력 및 출력 파일을 체계적으로 관리할 수 있게 해줍니다.
5. 기본 예외 처리 및 로깅
자동화 프로세스에서는 예외 처리와 로깅이 중요합니다.
예시)
- PDF 파일이 존재하지 않는 경우
- PDF를 이미지로 변환하는 과정에서 오류가 발생하는 경우
- OCR 처리 중 오류가 발생하는 경우
- 추출된 텍스트에서 표 데이터를 찾을 수 없는 경우
이와 같은 예외 상황을 적절히 처리하고 로그를 남기면 문제 발생 시 원인을 파악하고 해결하기 쉬워집니다.
import logging
# 로깅 설정
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler("export_data.log"),
logging.StreamHandler()
]
)
logger = logging.getLogger("ExportDataExtractor")
6. 주요 함수 설계
다음은 각 모듈에서 구현할 주요 함수의 설계입니다.
PDF 변환 모듈 (pdf_converter.py)
def convert_pdf_to_images(pdf_path, output_folder="temp_images", dpi=300):
"""PDF 파일을 이미지로 변환하는 함수"""
# 구현 내용
OCR 엔진 모듈 (ocr_engine.py)
def preprocess_image(image_path):
"""OCR 정확도 향상을 위한 이미지 전처리 함수"""
# 구현 내용
def extract_text_from_image(image_path):
"""이미지에서 텍스트를 추출하는 함수"""
# 구현 내용
데이터 파싱 모듈 (data_parser.py)
def extract_table_data(text):
"""텍스트에서 표 데이터를 추출하는 함수"""
# 구현 내용
def save_to_excel(df, output_path):
"""데이터프레임을 엑셀 파일로 저장하는 함수"""
# 구현 내용
메인 모듈 (main.py)
def process_export_declaration(pdf_path, output_excel=None):
"""PDF에서 수출신고적명세서 데이터를 추출하고 엑셀로 저장하는 함수"""
# 구현 내용
다음 포스트에서는 실제로 PDF를 이미지로 변환하고 OCR을 적용하여 텍스트를 추출하는 과정을 구현해보겠습니다.
특히 이미지 전처리를 통해 OCR 정확도를 높이는 방법에 중점을 두겠습니다.
'Python' 카테고리의 다른 글
[Python] FastAPI로 구현하는 카카오톡 메시지 전송 시스템 - 2 (0) | 2025.06.15 |
---|---|
[Python] FastAPI로 구현하는 카카오톡 메시지 알림 테스트 - 1 (1) | 2025.04.28 |
[Python] 법령 개정 알림 서비스 구축하기 (3) - Streamlit 대시보드 구현 (0) | 2025.03.10 |
[Python] 법령 개정 알림 서비스 구축하기 (2) - 데이터베이스 연동 및 변경 감지 (0) | 2025.03.10 |
[Python] 법령 개정 알림 서비스 구축하기 (1) - 기본 설계 및 크롤링 구현 (0) | 2025.03.10 |