# gandol2-ocr
이미지 섹션 분리와 OCR을 통합한 Python 유틸리티입니다. 세로로 긴 상세페이지 이미지를 시각적 경계 기준으로 안전하게 섹션 분리하고, 각 섹션에 대해 OCR을 수행할 수 있습니다.
## ✨ 주요 기능
### 🖼️ 이미지 섹션 분리 (Splitter)
- 세로로 긴 상세페이지 이미지를 시각적 경계 기준으로 자동 분리
- OpenCV 기반의 고급 이미지 처리 알고리즘
- 시각적 경계 감지 및 안전한 섹션 분할
- 분리된 섹션 정보를 구조화된 데이터로 제공
### 🔍 OCR (Optical Character Recognition)
- PaddleOCR 기반의 고성능 OCR 엔진
- 한국어(`korean`) 포함 다국어 지원
- GPU/CPU 선택 가능
- 바운딩박스와 텍스트 결과를 JSON으로 저장
## 📦 설치
### **중요**
```bash
# paddlepaddle-gpu==3.2.0 버전이 필수 입니다.
# pyproject.toml 설정 이후 패키지를 설치해주세요
dependencies = [
...
"paddlepaddle-gpu==3.2.0",
...
]
[tool.uv.sources]
paddlepaddle-gpu = { index = "paddle" }
[[tool.uv.index]]
name = "paddle"
url = "https://www.paddlepaddle.org.cn/packages/stable/cu126/"
explicit = true
> uv sync
```
```bash
# uv 사용 (권장)
uv add gandol2-ocr
# pip 사용
pip install gandol2-ocr
```
또는 소스에서 설치:
```bash
# uv 사용
uv add git+https://github.com/gandol2/gandol2-ocr.git
# pip 사용
pip install git+https://github.com/gandol2/gandol2-ocr.git
```
## 🖥️ 요구 사항
- Python **3.9-3.12** (pyproject.toml에 명시됨)
- (선택) NVIDIA GPU + CUDA 12.6 환경 (PaddlePaddle GPU 지원)
## 🚀 사용법
### 1) 이미지 섹션 분리
```python
from gandol2_ocr.splitter import split_image_sections
# 이미지를 섹션으로 분리
sections = split_image_sections(
image_path="./input/image.png",
output_dir="./output"
)
print(f"총 {len(sections)}개 섹션 생성:")
for section in sections:
print(f" {section.order}. {section.top}-{section.bottom} ({section.height}px)")
```
### 2) OCR 실행
```python
from gandol2_ocr.ocr import run_ocr
# OCR 실행
results = run_ocr(
input_image="./input/image.png",
output_dir="./output",
lang="korean",
device="gpu"
)
# 결과 출력
for result in results:
print(result["rec_texts"])
```
### 3) 통합 워크플로우
```python
from gandol2_ocr.splitter import split_image_sections
from gandol2_ocr.ocr import run_ocr
# 1단계: 이미지 섹션 분리
sections = split_image_sections(
image_path="./input/long_image.png",
output_dir="./sections"
)
# 2단계: 각 섹션에 대해 OCR 수행
for section in sections:
ocr_results = run_ocr(
input_image=section.path,
output_dir=f"./ocr_results/section_{section.order}",
lang="korean",
device="gpu"
)
print(f"섹션 {section.order}: {len(ocr_results)}개 텍스트 감지")
```
### 4) 다양한 Import 방법
```python
# 방법 1: 최상위 모듈 (권장)
from gandol2_ocr.ocr import run_ocr
from gandol2_ocr.splitter import split_image_sections
# 방법 2: 패키지 레벨
from gandol2_ocr import run_ocr, split_image_sections
# 방법 3: 서브모듈 직접 접근
from gandol2_ocr.image_ocr.ocr import run_ocr
from gandol2_ocr.splitter.splitter import split_image_sections
# 방법 4: 클래스 import
from gandol2_ocr.splitter import ImageSectionSplitter, SectionInfo
```
## 🧱 프로젝트 구조
```
gandol2-ocr/
├─ pyproject.toml
├─ README.md
├─ src/
│ └─ gandol2_ocr/ # 메인 패키지
│ ├─ __init__.py # 패키지 진입점
│ ├─ ocr.py # 최상위 OCR 모듈 (re-export)
│ ├─ splitter.py # 최상위 Splitter 모듈 (re-export)
│ ├─ image_ocr/ # 내부 OCR 모듈
│ │ ├─ __init__.py
│ │ ├─ cli.py
│ │ └─ ocr.py
│ └─ splitter/ # 내부 Splitter 모듈
│ ├─ __init__.py
│ └─ splitter.py
├─ examples/
│ ├─ demo_splitter.py # 섹션 분리 예제
│ └─ demo_ocr.py # OCR 예제
├─ input/ # 입력 이미지
└─ output/ # 출력 결과
```
## 🔧 API 참조
### Splitter API
#### `split_image_sections(image_path, output_dir, debug_verbose=True, save_diagnostic=True)`
이미지를 섹션으로 분리하는 메인 함수입니다.
**사용법:**
```python
from gandol2_ocr.splitter import split_image_sections
```
**매개변수:**
- `image_path` (str): 입력 이미지 경로
- `output_dir` (str): 출력 디렉토리
- `debug_verbose` (bool): 디버그 출력 여부 (기본: True)
- `save_diagnostic` (bool): 진단 이미지 저장 여부 (기본: True)
**반환값:**
- `List[SectionInfo]`: 섹션 정보 리스트
#### `SectionInfo` 클래스
```python
@dataclass
class SectionInfo:
order: int # 섹션 순서
top: int # 상단 좌표
bottom: int # 하단 좌표
height: int # 섹션 높이
path: str # 저장된 파일 경로
```
### OCR API
#### `run_ocr(input_image, output_dir, lang="korean", device="cpu")`
이미지에서 텍스트를 인식하는 함수입니다.
**사용법:**
```python
from gandol2_ocr.ocr import run_ocr
```
**매개변수:**
- `input_image` (str): 입력 이미지 경로
- `output_dir` (str): 출력 디렉토리
- `lang` (str): OCR 언어 (기본: "korean")
- `device` (str): "cpu" 또는 "gpu" (기본: "cpu")
**반환값:**
- `List[dict]`: OCR 결과 리스트
## 🧪 소비측 테스트
패키지 설치 후 다음과 같이 테스트할 수 있습니다:
```python
# test_gandol2_ocr.py
def test_all_import_methods():
"""모든 import 방법 테스트"""
try:
# 방법 1: 최상위 모듈 (권장)
from gandol2_ocr.ocr import run_ocr
from gandol2_ocr.splitter import split_image_sections
print("✅ 최상위 모듈 import 성공")
# 방법 2: 패키지 레벨
from gandol2_ocr import run_ocr as run_ocr2, split_image_sections as split_sections2
print("✅ 패키지 레벨 import 성공")
# 방법 3: 서브모듈
from gandol2_ocr.image_ocr.ocr import run_ocr as run_ocr3
from gandol2_ocr.splitter.splitter import split_image_sections as split_sections3
print("✅ 서브모듈 import 성공")
# 방법 4: 클래스
from gandol2_ocr.splitter import ImageSectionSplitter, SectionInfo
print("✅ 클래스 import 성공")
print("🎉 모든 import 방법 성공!")
return True
except ImportError as e:
print(f"❌ Import 오류: {e}")
return False
if __name__ == "__main__":
test_all_import_methods()
```
## 🛠️ 개발 및 배포
### 로컬 빌드
```bash
uv build
```
### TestPyPI 업로드
### PyPI 업로드
```bash
twine upload dist/*
```
## 🔎 참고사항
- **의존성**: OpenCV, PaddleOCR, PaddlePaddle, Matplotlib, Pandas, SciPy
- **GPU 지원**: CUDA 12.6 환경에서 PaddlePaddle GPU 사용 가능
- **이미지 형식**: PNG, JPG, JPEG 등 OpenCV 지원 형식
- **언어 지원**: PaddleOCR이 지원하는 모든 언어 (한국어, 영어, 중국어 등)
## 📄 라이선스
MIT License
Raw data
{
"_id": null,
"home_page": null,
"name": "gandol2-ocr",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.13,>=3.9",
"maintainer_email": null,
"keywords": "image, section, split, opencv, computer-vision",
"author": null,
"author_email": "gandol2 <sskim2333@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/f1/b2/189f29f59d0b1f4d41f0752da301b502c816f18f69c8efb741b3a673149f/gandol2_ocr-0.0.3.tar.gz",
"platform": null,
"description": "# gandol2-ocr\n\n\uc774\ubbf8\uc9c0 \uc139\uc158 \ubd84\ub9ac\uc640 OCR\uc744 \ud1b5\ud569\ud55c Python \uc720\ud2f8\ub9ac\ud2f0\uc785\ub2c8\ub2e4. \uc138\ub85c\ub85c \uae34 \uc0c1\uc138\ud398\uc774\uc9c0 \uc774\ubbf8\uc9c0\ub97c \uc2dc\uac01\uc801 \uacbd\uacc4 \uae30\uc900\uc73c\ub85c \uc548\uc804\ud558\uac8c \uc139\uc158 \ubd84\ub9ac\ud558\uace0, \uac01 \uc139\uc158\uc5d0 \ub300\ud574 OCR\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n## \u2728 \uc8fc\uc694 \uae30\ub2a5\n\n### \ud83d\uddbc\ufe0f \uc774\ubbf8\uc9c0 \uc139\uc158 \ubd84\ub9ac (Splitter)\n\n- \uc138\ub85c\ub85c \uae34 \uc0c1\uc138\ud398\uc774\uc9c0 \uc774\ubbf8\uc9c0\ub97c \uc2dc\uac01\uc801 \uacbd\uacc4 \uae30\uc900\uc73c\ub85c \uc790\ub3d9 \ubd84\ub9ac\n- OpenCV \uae30\ubc18\uc758 \uace0\uae09 \uc774\ubbf8\uc9c0 \ucc98\ub9ac \uc54c\uace0\ub9ac\uc998\n- \uc2dc\uac01\uc801 \uacbd\uacc4 \uac10\uc9c0 \ubc0f \uc548\uc804\ud55c \uc139\uc158 \ubd84\ud560\n- \ubd84\ub9ac\ub41c \uc139\uc158 \uc815\ubcf4\ub97c \uad6c\uc870\ud654\ub41c \ub370\uc774\ud130\ub85c \uc81c\uacf5\n\n### \ud83d\udd0d OCR (Optical Character Recognition)\n\n- PaddleOCR \uae30\ubc18\uc758 \uace0\uc131\ub2a5 OCR \uc5d4\uc9c4\n- \ud55c\uad6d\uc5b4(`korean`) \ud3ec\ud568 \ub2e4\uad6d\uc5b4 \uc9c0\uc6d0\n- GPU/CPU \uc120\ud0dd \uac00\ub2a5\n- \ubc14\uc6b4\ub529\ubc15\uc2a4\uc640 \ud14d\uc2a4\ud2b8 \uacb0\uacfc\ub97c JSON\uc73c\ub85c \uc800\uc7a5\n\n## \ud83d\udce6 \uc124\uce58\n\n### **\uc911\uc694**\n\n```bash\n# paddlepaddle-gpu==3.2.0 \ubc84\uc804\uc774 \ud544\uc218 \uc785\ub2c8\ub2e4.\n# pyproject.toml \uc124\uc815 \uc774\ud6c4 \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud574\uc8fc\uc138\uc694\n\ndependencies = [\n ...\n \"paddlepaddle-gpu==3.2.0\",\n ...\n]\n\n[tool.uv.sources]\npaddlepaddle-gpu = { index = \"paddle\" }\n\n\n[[tool.uv.index]]\nname = \"paddle\"\nurl = \"https://www.paddlepaddle.org.cn/packages/stable/cu126/\"\nexplicit = true\n\n> uv sync\n\n```\n\n```bash\n# uv \uc0ac\uc6a9 (\uad8c\uc7a5)\nuv add gandol2-ocr\n\n# pip \uc0ac\uc6a9\npip install gandol2-ocr\n```\n\n\ub610\ub294 \uc18c\uc2a4\uc5d0\uc11c \uc124\uce58:\n\n```bash\n# uv \uc0ac\uc6a9\nuv add git+https://github.com/gandol2/gandol2-ocr.git\n\n# pip \uc0ac\uc6a9\npip install git+https://github.com/gandol2/gandol2-ocr.git\n```\n\n## \ud83d\udda5\ufe0f \uc694\uad6c \uc0ac\ud56d\n\n- Python **3.9-3.12** (pyproject.toml\uc5d0 \uba85\uc2dc\ub428)\n- (\uc120\ud0dd) NVIDIA GPU + CUDA 12.6 \ud658\uacbd (PaddlePaddle GPU \uc9c0\uc6d0)\n\n## \ud83d\ude80 \uc0ac\uc6a9\ubc95\n\n### 1) \uc774\ubbf8\uc9c0 \uc139\uc158 \ubd84\ub9ac\n\n```python\nfrom gandol2_ocr.splitter import split_image_sections\n\n# \uc774\ubbf8\uc9c0\ub97c \uc139\uc158\uc73c\ub85c \ubd84\ub9ac\nsections = split_image_sections(\n image_path=\"./input/image.png\",\n output_dir=\"./output\"\n)\n\nprint(f\"\ucd1d {len(sections)}\uac1c \uc139\uc158 \uc0dd\uc131:\")\nfor section in sections:\n print(f\" {section.order}. {section.top}-{section.bottom} ({section.height}px)\")\n```\n\n### 2) OCR \uc2e4\ud589\n\n```python\nfrom gandol2_ocr.ocr import run_ocr\n\n# OCR \uc2e4\ud589\nresults = run_ocr(\n input_image=\"./input/image.png\",\n output_dir=\"./output\",\n lang=\"korean\",\n device=\"gpu\"\n)\n\n# \uacb0\uacfc \ucd9c\ub825\nfor result in results:\n print(result[\"rec_texts\"])\n```\n\n### 3) \ud1b5\ud569 \uc6cc\ud06c\ud50c\ub85c\uc6b0\n\n```python\nfrom gandol2_ocr.splitter import split_image_sections\nfrom gandol2_ocr.ocr import run_ocr\n\n# 1\ub2e8\uacc4: \uc774\ubbf8\uc9c0 \uc139\uc158 \ubd84\ub9ac\nsections = split_image_sections(\n image_path=\"./input/long_image.png\",\n output_dir=\"./sections\"\n)\n\n# 2\ub2e8\uacc4: \uac01 \uc139\uc158\uc5d0 \ub300\ud574 OCR \uc218\ud589\nfor section in sections:\n ocr_results = run_ocr(\n input_image=section.path,\n output_dir=f\"./ocr_results/section_{section.order}\",\n lang=\"korean\",\n device=\"gpu\"\n )\n print(f\"\uc139\uc158 {section.order}: {len(ocr_results)}\uac1c \ud14d\uc2a4\ud2b8 \uac10\uc9c0\")\n```\n\n### 4) \ub2e4\uc591\ud55c Import \ubc29\ubc95\n\n```python\n# \ubc29\ubc95 1: \ucd5c\uc0c1\uc704 \ubaa8\ub4c8 (\uad8c\uc7a5)\nfrom gandol2_ocr.ocr import run_ocr\nfrom gandol2_ocr.splitter import split_image_sections\n\n# \ubc29\ubc95 2: \ud328\ud0a4\uc9c0 \ub808\ubca8\nfrom gandol2_ocr import run_ocr, split_image_sections\n\n# \ubc29\ubc95 3: \uc11c\ube0c\ubaa8\ub4c8 \uc9c1\uc811 \uc811\uadfc\nfrom gandol2_ocr.image_ocr.ocr import run_ocr\nfrom gandol2_ocr.splitter.splitter import split_image_sections\n\n# \ubc29\ubc95 4: \ud074\ub798\uc2a4 import\nfrom gandol2_ocr.splitter import ImageSectionSplitter, SectionInfo\n```\n\n## \ud83e\uddf1 \ud504\ub85c\uc81d\ud2b8 \uad6c\uc870\n\n```\ngandol2-ocr/\n\u251c\u2500 pyproject.toml\n\u251c\u2500 README.md\n\u251c\u2500 src/\n\u2502 \u2514\u2500 gandol2_ocr/ # \uba54\uc778 \ud328\ud0a4\uc9c0\n\u2502 \u251c\u2500 __init__.py # \ud328\ud0a4\uc9c0 \uc9c4\uc785\uc810\n\u2502 \u251c\u2500 ocr.py # \ucd5c\uc0c1\uc704 OCR \ubaa8\ub4c8 (re-export)\n\u2502 \u251c\u2500 splitter.py # \ucd5c\uc0c1\uc704 Splitter \ubaa8\ub4c8 (re-export)\n\u2502 \u251c\u2500 image_ocr/ # \ub0b4\ubd80 OCR \ubaa8\ub4c8\n\u2502 \u2502 \u251c\u2500 __init__.py\n\u2502 \u2502 \u251c\u2500 cli.py\n\u2502 \u2502 \u2514\u2500 ocr.py\n\u2502 \u2514\u2500 splitter/ # \ub0b4\ubd80 Splitter \ubaa8\ub4c8\n\u2502 \u251c\u2500 __init__.py\n\u2502 \u2514\u2500 splitter.py\n\u251c\u2500 examples/\n\u2502 \u251c\u2500 demo_splitter.py # \uc139\uc158 \ubd84\ub9ac \uc608\uc81c\n\u2502 \u2514\u2500 demo_ocr.py # OCR \uc608\uc81c\n\u251c\u2500 input/ # \uc785\ub825 \uc774\ubbf8\uc9c0\n\u2514\u2500 output/ # \ucd9c\ub825 \uacb0\uacfc\n```\n\n## \ud83d\udd27 API \ucc38\uc870\n\n### Splitter API\n\n#### `split_image_sections(image_path, output_dir, debug_verbose=True, save_diagnostic=True)`\n\n\uc774\ubbf8\uc9c0\ub97c \uc139\uc158\uc73c\ub85c \ubd84\ub9ac\ud558\ub294 \uba54\uc778 \ud568\uc218\uc785\ub2c8\ub2e4.\n\n**\uc0ac\uc6a9\ubc95:**\n\n```python\nfrom gandol2_ocr.splitter import split_image_sections\n```\n\n**\ub9e4\uac1c\ubcc0\uc218:**\n\n- `image_path` (str): \uc785\ub825 \uc774\ubbf8\uc9c0 \uacbd\ub85c\n- `output_dir` (str): \ucd9c\ub825 \ub514\ub809\ud1a0\ub9ac\n- `debug_verbose` (bool): \ub514\ubc84\uadf8 \ucd9c\ub825 \uc5ec\ubd80 (\uae30\ubcf8: True)\n- `save_diagnostic` (bool): \uc9c4\ub2e8 \uc774\ubbf8\uc9c0 \uc800\uc7a5 \uc5ec\ubd80 (\uae30\ubcf8: True)\n\n**\ubc18\ud658\uac12:**\n\n- `List[SectionInfo]`: \uc139\uc158 \uc815\ubcf4 \ub9ac\uc2a4\ud2b8\n\n#### `SectionInfo` \ud074\ub798\uc2a4\n\n```python\n@dataclass\nclass SectionInfo:\n order: int # \uc139\uc158 \uc21c\uc11c\n top: int # \uc0c1\ub2e8 \uc88c\ud45c\n bottom: int # \ud558\ub2e8 \uc88c\ud45c\n height: int # \uc139\uc158 \ub192\uc774\n path: str # \uc800\uc7a5\ub41c \ud30c\uc77c \uacbd\ub85c\n```\n\n### OCR API\n\n#### `run_ocr(input_image, output_dir, lang=\"korean\", device=\"cpu\")`\n\n\uc774\ubbf8\uc9c0\uc5d0\uc11c \ud14d\uc2a4\ud2b8\ub97c \uc778\uc2dd\ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4.\n\n**\uc0ac\uc6a9\ubc95:**\n\n```python\nfrom gandol2_ocr.ocr import run_ocr\n```\n\n**\ub9e4\uac1c\ubcc0\uc218:**\n\n- `input_image` (str): \uc785\ub825 \uc774\ubbf8\uc9c0 \uacbd\ub85c\n- `output_dir` (str): \ucd9c\ub825 \ub514\ub809\ud1a0\ub9ac\n- `lang` (str): OCR \uc5b8\uc5b4 (\uae30\ubcf8: \"korean\")\n- `device` (str): \"cpu\" \ub610\ub294 \"gpu\" (\uae30\ubcf8: \"cpu\")\n\n**\ubc18\ud658\uac12:**\n\n- `List[dict]`: OCR \uacb0\uacfc \ub9ac\uc2a4\ud2b8\n\n## \ud83e\uddea \uc18c\ube44\uce21 \ud14c\uc2a4\ud2b8\n\n\ud328\ud0a4\uc9c0 \uc124\uce58 \ud6c4 \ub2e4\uc74c\uacfc \uac19\uc774 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:\n\n```python\n# test_gandol2_ocr.py\ndef test_all_import_methods():\n \"\"\"\ubaa8\ub4e0 import \ubc29\ubc95 \ud14c\uc2a4\ud2b8\"\"\"\n try:\n # \ubc29\ubc95 1: \ucd5c\uc0c1\uc704 \ubaa8\ub4c8 (\uad8c\uc7a5)\n from gandol2_ocr.ocr import run_ocr\n from gandol2_ocr.splitter import split_image_sections\n print(\"\u2705 \ucd5c\uc0c1\uc704 \ubaa8\ub4c8 import \uc131\uacf5\")\n\n # \ubc29\ubc95 2: \ud328\ud0a4\uc9c0 \ub808\ubca8\n from gandol2_ocr import run_ocr as run_ocr2, split_image_sections as split_sections2\n print(\"\u2705 \ud328\ud0a4\uc9c0 \ub808\ubca8 import \uc131\uacf5\")\n\n # \ubc29\ubc95 3: \uc11c\ube0c\ubaa8\ub4c8\n from gandol2_ocr.image_ocr.ocr import run_ocr as run_ocr3\n from gandol2_ocr.splitter.splitter import split_image_sections as split_sections3\n print(\"\u2705 \uc11c\ube0c\ubaa8\ub4c8 import \uc131\uacf5\")\n\n # \ubc29\ubc95 4: \ud074\ub798\uc2a4\n from gandol2_ocr.splitter import ImageSectionSplitter, SectionInfo\n print(\"\u2705 \ud074\ub798\uc2a4 import \uc131\uacf5\")\n\n print(\"\ud83c\udf89 \ubaa8\ub4e0 import \ubc29\ubc95 \uc131\uacf5!\")\n return True\n\n except ImportError as e:\n print(f\"\u274c Import \uc624\ub958: {e}\")\n return False\n\nif __name__ == \"__main__\":\n test_all_import_methods()\n```\n\n## \ud83d\udee0\ufe0f \uac1c\ubc1c \ubc0f \ubc30\ud3ec\n\n### \ub85c\uceec \ube4c\ub4dc\n\n```bash\nuv build\n```\n\n### TestPyPI \uc5c5\ub85c\ub4dc\n\n### PyPI \uc5c5\ub85c\ub4dc\n\n```bash\ntwine upload dist/*\n```\n\n## \ud83d\udd0e \ucc38\uace0\uc0ac\ud56d\n\n- **\uc758\uc874\uc131**: OpenCV, PaddleOCR, PaddlePaddle, Matplotlib, Pandas, SciPy\n- **GPU \uc9c0\uc6d0**: CUDA 12.6 \ud658\uacbd\uc5d0\uc11c PaddlePaddle GPU \uc0ac\uc6a9 \uac00\ub2a5\n- **\uc774\ubbf8\uc9c0 \ud615\uc2dd**: PNG, JPG, JPEG \ub4f1 OpenCV \uc9c0\uc6d0 \ud615\uc2dd\n- **\uc5b8\uc5b4 \uc9c0\uc6d0**: PaddleOCR\uc774 \uc9c0\uc6d0\ud558\ub294 \ubaa8\ub4e0 \uc5b8\uc5b4 (\ud55c\uad6d\uc5b4, \uc601\uc5b4, \uc911\uad6d\uc5b4 \ub4f1)\n\n## \ud83d\udcc4 \ub77c\uc774\uc120\uc2a4\n\nMIT License\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\uc774\ubbf8\uc9c0\ub97c \uc2dc\uac01\uc801 \uacbd\uacc4 \uae30\uc900\uc73c\ub85c \uc548\uc804\ud558\uac8c \uc139\uc158 \ubd84\ub9ac & OCR (Korean, Chinese)",
"version": "0.0.3",
"project_urls": {
"Documentation": "https://github.com/gandol2/gandol2-ocr#readme",
"Homepage": "https://github.com/gandol2/gandol2-ocr",
"Repository": "https://github.com/gandol2/gandol2-ocr"
},
"split_keywords": [
"image",
" section",
" split",
" opencv",
" computer-vision"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "b271765372cd3aee49eaf821a96c04367d3cb2e7b50c34abd8584d5f5a966cf0",
"md5": "b061d20a17ac6a10ad16498532659b75",
"sha256": "5c0819083b005eb6d97977bfca1307d9823d9139bd72fc3f0354aef28c368fd6"
},
"downloads": -1,
"filename": "gandol2_ocr-0.0.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "b061d20a17ac6a10ad16498532659b75",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<3.13,>=3.9",
"size": 13308,
"upload_time": "2025-10-21T05:08:00",
"upload_time_iso_8601": "2025-10-21T05:08:00.622152Z",
"url": "https://files.pythonhosted.org/packages/b2/71/765372cd3aee49eaf821a96c04367d3cb2e7b50c34abd8584d5f5a966cf0/gandol2_ocr-0.0.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f1b2189f29f59d0b1f4d41f0752da301b502c816f18f69c8efb741b3a673149f",
"md5": "60611950ed79829d8a339234577f3353",
"sha256": "e43d2eb428002c03dbd0422e5ee43f6668ce623b11b78da31531b0a5d763e8c3"
},
"downloads": -1,
"filename": "gandol2_ocr-0.0.3.tar.gz",
"has_sig": false,
"md5_digest": "60611950ed79829d8a339234577f3353",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.13,>=3.9",
"size": 13595,
"upload_time": "2025-10-21T05:08:02",
"upload_time_iso_8601": "2025-10-21T05:08:02.116479Z",
"url": "https://files.pythonhosted.org/packages/f1/b2/189f29f59d0b1f4d41f0752da301b502c816f18f69c8efb741b3a673149f/gandol2_ocr-0.0.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-21 05:08:02",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "gandol2",
"github_project": "gandol2-ocr#readme",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "gandol2-ocr"
}