Metadata-Version: 2.4
Name: pdfprep
Version: 0.1.0
Summary: PDF 전처리 통합 도구 — 메타데이터, 텍스트 파싱, OCR, 표 추출
Author-email: uwpark <uwpark@simplatform.com>
License: MIT
Project-URL: Homepage, https://pypi.org/project/pdfprep/
Keywords: pdf,ocr,table-extraction,preprocessing,parsing,metadata
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: POSIX :: Linux
Classifier: Topic :: Text Processing
Classifier: Topic :: Scientific/Engineering :: Image Recognition
Classifier: Natural Language :: Korean
Requires-Python: >=3.12
Description-Content-Type: text/markdown
Requires-Dist: pypdf<6.0,>=4.0
Requires-Dist: pdfplumber>=0.11.0
Requires-Dist: pymupdf>=1.27.0
Requires-Dist: pillow>=10.0
Requires-Dist: numpy<2
Requires-Dist: setuptools>=65
Provides-Extra: ocr
Requires-Dist: pytesseract>=0.3.13; extra == "ocr"
Requires-Dist: paddleocr==2.7.3; extra == "ocr"
Requires-Dist: paddlepaddle==2.6.2; extra == "ocr"
Provides-Extra: table
Requires-Dist: camelot-py[base]==1.0.9; extra == "table"
Requires-Dist: tabula-py>=2.10; extra == "table"
Requires-Dist: jpype1>=1.5; extra == "table"
Requires-Dist: layoutparser>=0.3.4; extra == "table"
Provides-Extra: all
Requires-Dist: pytesseract>=0.3.13; extra == "all"
Requires-Dist: paddleocr==2.7.3; extra == "all"
Requires-Dist: paddlepaddle==2.6.2; extra == "all"
Requires-Dist: camelot-py[base]==1.0.9; extra == "all"
Requires-Dist: tabula-py>=2.10; extra == "all"
Requires-Dist: jpype1>=1.5; extra == "all"
Requires-Dist: layoutparser>=0.3.4; extra == "all"

# PDF 메타데이터 / 파싱 / OCR / 표 추출 도구

PDF 파일의 메타데이터를 확인하고, 3가지 라이브러리(`pypdf` / `pdfplumber` / `pymupdf`)로 텍스트를 파싱하며, 2가지 OCR 엔진(`tesseract` / `paddleocr`)으로 이미지 기반 텍스트를 추출하고, 3가지 표 추출 라이브러리(`camelot` / `tabula` / `layoutparser`)로 표를 검출·추출하는 Python 스크립트 모음입니다.

## 구성

| 파일 | 설명 |
| --- | --- |
| `pdf_metadata.py` | PDF 메타데이터 추출/출력 모듈. CLI로 직접 실행 가능 |
| `test_pdf_metadata.py` | `pdf_metadata`를 불러와 동작을 검증하는 테스트 스크립트 |
| `parsing_pdf.py` | 3종 라이브러리로 PDF 텍스트를 파싱하는 통합 모듈 |
| `test_parsing_pdf.py` | 각 파싱 엔진별 결과를 비교·검증하는 테스트 스크립트 |
| `ocr_pdf.py` | 2종 OCR 엔진(tesseract / paddleocr)으로 PDF를 OCR하는 통합 모듈 |
| `test_ocr_pdf.py` | OCR 엔진별 결과(텍스트, 신뢰도, 박스 수 등)를 비교 검증 |
| `table_pdf.py` | 3종 라이브러리(camelot / tabula / layoutparser)로 표 추출하는 통합 모듈 |
| `test_table_pdf.py` | 표 추출 엔진별 결과(표 개수, 행/열, 정확도 등)를 비교 검증 |
| `requirements.txt` | 의존성 목록 |
| `data/` | 테스트용 PDF 파일을 두는 폴더 |

## 설치

```bash
pip install -r requirements.txt
```

PEP 668 환경(Ubuntu 등 시스템 Python)에서는 가상환경 사용을 권장합니다.

```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```

### Tesseract 시스템 패키지

`pytesseract`는 시스템에 설치된 `tesseract` 바이너리를 호출하므로 별도 설치가 필요합니다.

```bash
# Ubuntu/Debian — 한국어 + 영어 traineddata 포함
sudo apt install tesseract-ocr tesseract-ocr-kor tesseract-ocr-eng

# 설치 확인
tesseract --version
tesseract --list-langs   # kor, eng 출력되어야 함
```

### PaddleOCR 버전 주의

`paddleocr 2.7.3` + `paddlepaddle 2.6.2` + `numpy<2` 조합으로 고정되어 있습니다. PaddleOCR 3.x / paddlepaddle 3.x 조합에서는 CPU 환경에서 PIR + oneDNN 호환 문제가 발생할 수 있어 LTS 조합을 사용합니다. 최초 실행 시 모델 파일이 자동으로 다운로드됩니다(~수십 MB).

> **Python 3.12+ 사용자**: `paddlepaddle 2.6.2`는 표준 라이브러리에서 제거된 `distutils`를 호출하므로 `setuptools`가 반드시 설치돼 있어야 합니다(requirements.txt에 포함). 누락 시 `No module named 'setuptools'`가 발생하면 `pip install setuptools`로 해결하세요.

### 표 추출 시스템 패키지

- **camelot** → `ghostscript` 필요 (`sudo apt install ghostscript`)
- **tabula** → JRE 필요 (`sudo apt install default-jre`)
- **layoutparser** → PaddleDetection 백엔드 + **TableBank** 모델 사용 (표 전용 학습)
  - OCR 섹션에서 설치한 `paddlepaddle` 만으로 동작
  - 최초 실행 시 모델(약 221MB) 자동 다운로드 (Baidu CDN)
  - 별도 `paddledet` 또는 `detectron2` 설치 불필요

## 사용법

### 1. PDF 메타데이터 출력 (`pdf_metadata.py`)

```bash
python3 pdf_metadata.py data/pdf_sample.pdf
python3 pdf_metadata.py a.pdf b.pdf c.pdf
```

출력 항목
- 파일 크기, 페이지 수, PDF 버전, 암호화 여부
- Document Info: Title, Author, Subject, Keywords, Creator, Producer
- 생성일/수정일 (`D:YYYYMMDDHHMMSS` → `YYYY-MM-DD HH:MM:SS` 변환)
- 기타 메타데이터 키(`/Trapped` 등)

### 2. 메타데이터 테스트 (`test_pdf_metadata.py`)

```bash
python3 test_pdf_metadata.py                     # 기본 data/ 폴더
python3 test_pdf_metadata.py data/pdf_sample.pdf # 단일 파일
python3 test_pdf_metadata.py a.pdf b.pdf data/   # 혼합 지정
```

### 3. PDF 텍스트 파싱 (`parsing_pdf.py`)

```bash
# 전체 엔진으로 한 번에 비교
python3 parsing_pdf.py data/parsing_sample.pdf

# 특정 엔진만 사용
python3 parsing_pdf.py data/parsing_sample.pdf pypdf
python3 parsing_pdf.py data/parsing_sample.pdf pdfplumber
python3 parsing_pdf.py data/parsing_sample.pdf pymupdf
```

엔진별 특징
- **pypdf** — 가벼움. 목차/폼/주석 등 문서 구조 메타에 강점
- **pdfplumber** — 표(테이블) 추출, 단어/문자 단위 bbox에 강점
- **pymupdf** (`fitz`) — 빠르고 강력. 블록·이미지·폰트·색상 등 풍부한 메타

### 4. 파싱 테스트 (`test_parsing_pdf.py`)

```bash
python3 test_parsing_pdf.py                       # 기본 data/ 폴더
python3 test_parsing_pdf.py data/pdf_sample.pdf   # 단일 파일
python3 test_parsing_pdf.py /다른/경로/             # 다른 폴더
```

출력
- 엔진 × 파일 시간/페이지/텍스트길이 매트릭스
- 엔진별 특화 지표 (예: pdfplumber → 표 개수, pymupdf → 블록·이미지·폰트 수)

### 5. OCR 실행 (`ocr_pdf.py`)

```bash
# 전체 엔진으로 비교 (tesseract → paddleocr 순)
python3 ocr_pdf.py data/pdf_sample.pdf

# 특정 엔진만 사용
python3 ocr_pdf.py data/pdf_sample.pdf tesseract
python3 ocr_pdf.py data/pdf_sample.pdf paddleocr
```

처리 흐름
1. `pymupdf`로 PDF 각 페이지를 PNG로 렌더링(기본 200 DPI)
2. 이미지를 OCR 엔진에 전달
3. 텍스트 + 신뢰도 + 박스/단어 통계 반환

엔진별 특징
- **tesseract** — 가벼움/빠름. `kor+eng` 등 다국어 동시 인식. 단어 단위 신뢰도 제공
- **paddleocr** — 딥러닝 기반. 검출(detection) + 인식(recognition) 2단계로 라인별 박스 + 신뢰도 반환

### 6. OCR 테스트 (`test_ocr_pdf.py`)

```bash
python3 test_ocr_pdf.py                              # 기본 파일 + 전체 엔진
python3 test_ocr_pdf.py data/pdf_sample.pdf          # 지정 파일 + 전체 엔진
python3 test_ocr_pdf.py /다른/경로/                    # 지정 폴더 + 전체 엔진

# 엔진 단독 실행 (마지막 인자가 엔진 이름이면 그것만 실행)
python3 test_ocr_pdf.py data/pdf_sample.pdf tesseract
python3 test_ocr_pdf.py data/pdf_sample.pdf paddleocr
python3 test_ocr_pdf.py paddleocr                    # 엔진만 지정 → 기본 파일 사용
```

출력
- 엔진 × 파일 시간/페이지/텍스트길이 매트릭스
- 엔진별 특화 지표
  - **tesseract**: 인식 단어 수, 평균 신뢰도(%), 사용 언어
  - **paddleocr**: 검출 텍스트 박스 수, 평균 신뢰도, 사용 언어

라이브러리 미설치 시 해당 엔진은 자동으로 `SKIP` 처리됩니다.

### 7. 표 추출 (`table_pdf.py`)

```bash
# 전체 엔진으로 비교
python3 table_pdf.py data/table_sample.pdf

# 특정 엔진만 사용
python3 table_pdf.py data/table_sample.pdf camelot
python3 table_pdf.py data/table_sample.pdf tabula
python3 table_pdf.py data/table_sample.pdf layoutparser
```

엔진별 특징
- **camelot** — PDF 표 추출 전용. `lattice`(선 기반) / `stream`(좌표 기반) 두 모드. 정확도(accuracy)·여백률(whitespace) 등 품질 지표 제공. Ghostscript 필요
- **tabula** — `tabula-java` 래퍼. pandas DataFrame 리스트 반환. JRE 필요
- **layoutparser** — 페이지를 이미지로 렌더링 후 'Table' 영역의 bbox를 탐지하는 레이아웃 검출기. 셀 내용 추출이 아닌 '표 위치' 검출용. PaddleDetection 백엔드 + TableBank 모델 (영문 PubLayNet 대신 표 전용 학습)

### 8. 표 추출 테스트 (`test_table_pdf.py`)

```bash
python3 test_table_pdf.py                            # 기본 파일 + 전체 엔진
python3 test_table_pdf.py data/table_sample.pdf      # 지정 파일 + 전체 엔진
python3 test_table_pdf.py /다른/경로/                   # 지정 폴더 + 전체 엔진

# 엔진 단독 실행
python3 test_table_pdf.py data/table_sample.pdf camelot
python3 test_table_pdf.py data/table_sample.pdf tabula
python3 test_table_pdf.py data/table_sample.pdf layoutparser
python3 test_table_pdf.py camelot                    # 엔진만 지정 → 기본 파일 사용
```

기본 파일은 `data/table_sample.pdf`입니다. 출력에는 표 개수, 각 표의 행/열 크기, 첫 표 미리보기, 엔진별 특화 지표(camelot 정확도, tabula 헤더, layoutparser bbox)가 포함됩니다.

## 폴더 구조

```
code/
├── README.md
├── requirements.txt
├── pdf_metadata.py
├── test_pdf_metadata.py
├── parsing_pdf.py
├── test_parsing_pdf.py
├── ocr_pdf.py
├── test_ocr_pdf.py
├── table_pdf.py
├── test_table_pdf.py
└── data/
    ├── pdf_sample.pdf
    ├── parsing_sample.pdf
    └── table_sample.pdf
```

`data/`에 PDF를 추가하면 인자 없이 테스트를 실행해도 자동으로 같이 검증됩니다.
