Loading...
Loading...
02-reusable-code-python/utils/pdf_reader.py
"""
PDF 파일 읽기 및 텍스트/테이블 추출 유틸리티
@source kcsi-smpa
@extracted 2026-02-15
@version 1.1.0
의존성:
- pdfplumber (필수, pip install pdfplumber)
사용법:
from utils.pdf_reader import extract_text_from_pdf, extract_tables_from_pdf
# 전체 텍스트 추출
text = extract_text_from_pdf("report.pdf")
# 페이지별 텍스트 추출
pages = extract_text_by_page("report.pdf")
# 테이블 추출
tables = extract_tables_from_pdf("report.pdf")
# 구조 분석
info = analyze_pdf_structure("report.pdf")
"""
import logging
from pathlib import Path
from typing import Any
import pdfplumber
logger = logging.getLogger(__name__)
def extract_text_from_pdf(file_path: str | Path) -> str:
"""PDF 파일에서 전체 텍스트 추출
Args:
file_path: PDF 파일 경로
Returns:
추출된 텍스트
"""
text_content = []
with pdfplumber.open(file_path) as pdf:
for page in pdf.pages:
text = page.extract_text()
if text:
text_content.append(text)
return "\n\n".join(text_content)
def extract_text_by_page(file_path: str | Path) -> list[dict[str, Any]]:
"""PDF 파일에서 페이지별 텍스트 추출
Args:
file_path: PDF 파일 경로
Returns:
[{page: 페이지번호, text: 텍스트}] 리스트
"""
pages_content = []
with pdfplumber.open(file_path) as pdf:
for i, page in enumerate(pdf.pages, 1):
text = page.extract_text()
pages_content.append({
"page": i,
"text": text or "",
"width": page.width,
"height": page.height,
})
return pages_content
def extract_tables_from_pdf(file_path: str | Path) -> list[dict[str, Any]]:
"""PDF 파일에서 테이블 추출
Args:
file_path: PDF 파일 경로
Returns:
[{page: 페이지번호, tables: [테이블데이터]}] 리스트
"""
tables_by_page = []
with pdfplumber.open(file_path) as pdf:
for i, page in enumerate(pdf.pages, 1):
tables = page.extract_tables()
if tables:
tables_by_page.append({
"page": i,
"table_count": len(tables),
"tables": tables,
})
return tables_by_page
def analyze_pdf_structure(file_path: str | Path) -> dict[str, Any]:
"""PDF 파일 구조 분석
Args:
file_path: PDF 파일 경로
Returns:
파일 구조 정보 딕셔너리
"""
with pdfplumber.open(file_path) as pdf:
structure = {
"file_path": str(file_path),
"page_count": len(pdf.pages),
"metadata": pdf.metadata,
"pages": [],
}
for i, page in enumerate(pdf.pages, 1):
tables = page.extract_tables()
page_info = {
"page": i,
"width": page.width,
"height": page.height,
"has_text": bool(page.extract_text()),
"table_count": len(tables) if tables else 0,
}
structure["pages"].append(page_info)
return structure
def compare_pdf_pages(
pdf1_path: str | Path,
pdf2_path: str | Path,
) -> dict[str, Any]:
"""두 PDF 파일의 페이지별 텍스트 비교
Args:
pdf1_path: 첫 번째 PDF 파일 경로
pdf2_path: 두 번째 PDF 파일 경로
Returns:
비교 결과 딕셔너리
"""
pages1 = extract_text_by_page(pdf1_path)
pages2 = extract_text_by_page(pdf2_path)
comparison = {
"pdf1_pages": len(pages1),
"pdf2_pages": len(pages2),
"differences": [],
}
max_pages = max(len(pages1), len(pages2))
for i in range(max_pages):
text1 = pages1[i]["text"] if i < len(pages1) else ""
text2 = pages2[i]["text"] if i < len(pages2) else ""
if text1 != text2:
comparison["differences"].append({
"page": i + 1,
"pdf1_length": len(text1),
"pdf2_length": len(text2),
"match": text1 == text2,
})
return comparison