nadf


Namenadf JSON
Version 0.1.23 PyPI version JSON
download
home_pageNone
SummaryNamuWiki crawler & PDF utilities
upload_time2025-08-25 07:09:55
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseMIT
keywords crawler namuwiki pdf
VCS
bugtrack_url
requirements annotated-types anyio beautifulsoup4 bs4 certifi charset-normalizer click defusedxml fonttools fpdf fpdf2 h11 httpcore httpx idna Jinja2 MarkupSafe pdfkit pillow pydantic pydantic_core python-multipart requests sniffio soupsieve starlette typing-inspection typing_extensions urllib3 uvicorn
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # NADF — 나무위키 PDF 보고서 생성기

### 개요
NADF는 나무위키 문서를 자동으로 크롤링하고,
섹션 구조를 유지한 PDF 보고서로 변환하는 파이썬 오픈소스 라이브러리입니다. <br>
이 프로젝트의 핵심 목적은 챗봇 학습을 위한 한국어 데이터 수집 및 검증입니다.<br>
한국어 데이터셋은 여전히 부족하고, 특히 최신성과 범용성을 동시에 확보하기 어렵습니다. <br>
NADF는 방대한 주제를 다루는 나무위키에서 문서를 가져와, 사람이 직접 읽으며 확인할 수 있는 형태의 PDF 보고서로 만들어줍니다.

즉, NADF는 단순한 PDF 변환기를 넘어서, <Strong>한국어 데이터 수집 위한 실용적 도구</Strong>를 목적으로 설계되었습니다.

### 프로젝트 배경 및 필요성
#### 한국어 데이터셋 부족 문제
영어권은 Common Crawl, Wikipedia, OpenWebText 등 다양한 대규모 공개 데이터셋이 존재합니다.
한국어 데이터셋은 제한적이고, 주로 뉴스/학술 중심으로 되어 있어 챗봇 학습에는 한계가 있습니다.
대화형 챗봇에는 실생활 언어, 대중문화, 최신 사건 같은 폭넓은 데이터가 필요합니다.

### 나무위키의 가치
최신성: 시사, 연예, 사건 등 실시간으로 갱신되는 자료
폭넓은 주제: 학문·문화·역사·인물·기술까지 다양한 영역을 포괄
구조화된 데이터: 목차 기반의 섹션 구조를 그대로 보존 가능
한국어 중심: 자연어 처리 및 챗봇 학습에 직접 활용하기 적합

### 보고서 형태의 필요성
데이터셋을 기계가 곧바로 학습하기 전에 사람이 직접 검증하는 단계가 반드시 필요합니다.
NADF는 이 과정을 지원하기 위해 “사람이 읽을 수 있는 PDF 보고서” 형태를 기본 출력물로 제공합니다.
다만 목적은 데이터 수집이므로, PDF는 화려한 디자인을 지향하지 않고 기본적인 가독성만 보장합니다.

### 아키텍처 개요
```bash
nadf/
 ├─ crawler/         # 크롤러 & HTTP/셀레니움 클라이언트
 ├─ decorator/       # URL 검증 등 데코레이터
 ├─ exception/       # 커스텀 예외
 ├─ fonts/           # 한글 폰트
 ├─ parser/          # BeautifulSoup 기반 파서
 └─ pdf/             # PDF 보고서 생성기 
```
### 동작 흐름
```bash
Crawler: URL을 입력받아 나무위키 문서를 크롤링
Parser: HTML → 텍스트 변환, 섹션별 분리
PDF Generator: fpdf2 기반으로 보고서 생성 (폰트 포함, 섹션 구조 반영)

출력: [문서명] 분석 보고서.pdf
```
### 설치
```bash
pip install nadf
```
> Python: 3.10 이상, 크롬 브라우저 설치 필요

### 사용 방법
#### 1. 파이썬 라이브러리로 사용
```python
import asyncio
from nadf.crawler import Crawler
from nadf.pdf import PDF

async def create_pdf(name : str):
    crawler = Crawler()
    name, data = await crawler.get_namuwiki_list(name)

    pdf = PDF(doc_title=f"{name} 분석 보고서")
    await pdf.create_pdf_from_namuwiki_list(data, "./")

if __name__ == "__main__":
    name = "나루토"
    asyncio.run(create_pdf(name))
```
#### 2. CLI 명령어로 사용
라이브러리 설치 후, CLI 명령어도 사용할 수 있습니다.
```bash
nadf invoke -p ./output -u "https://namu.wiki/w/%EC%84%AC%EC%97%90%EC%96%B4"
```
옵션 설명:
-p : PDF 저장 경로
-u : 나무위키 문서 URL
이렇게 실행하면 지정 경로에 [문서명] 분석 보고서.pdf 파일이 생성됩니다.

### 출력물의 특징
섹션 구조 보존: 목차에 따라 본문이 구분되어 출력
한글 폰트 내장: Noto Serif KR Regular/Bold 동봉, 한글 깨짐 문제 없음
읽을 수 있는 수준의 가독성: 기본적인 여백, 줄바꿈, 글꼴 적용
디자인 단순성: 본래 목적은 데이터 검증용이므로 시각적 화려함은 최소화

### 기대되는 활용 시나리오
폭넓은 데이터를 통한 RAG 챗봇
연구/학습 자료
특정 주제를 자동으로 수집해 보고서화
수업 보조 자료로 사용
PDF를 바탕으로 데이터셋 전처리 파이프라인 구축
이후 Q/A 쌍, 요약 데이터로 가공 가능
### 기술적 특징
#### 라이브러리 & CLI 이중 지원 
#### 파이썬 코드에서 직접 사용 가능 
#### Noto Serif KR 내장, 별도 설치 불필요 
#### 크롤러/파서/PDF 생성기가 분리되어 있어 확장성 용이 
> PR 마음껏 올려주세요.

### 기여 방법
PR과 Issue 모두 환영합니다!
버그 리포트 시 Python 버전, 실행 로그, 재현 코드를 함께 제공해 주세요.
새로운 기능/출력 포맷 제안도 적극적으로 검토합니다.

### 라이선스
MIT License (패키지 내 LICENSE 파일 참고)

### 첨언
본 프로젝트는 단순한 PDF 생성기가 아니라,
한국어 챗봇 학습 생태계 확장을 위해 실용적인 도구로 발전하기를 목표로 합니다. <br>
한국어 데이터 활용의 범위를 넓히는 데 기여하기를 기대합니다.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "nadf",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "crawler, namuwiki, pdf",
    "author": null,
    "author_email": "Donghyeon Park <pdh0128a@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/8d/c6/3fac9ef33c3f55396d528cbb41c7fdd51a3ea6c5ae48bc5a200312bb3dee/nadf-0.1.23.tar.gz",
    "platform": null,
    "description": "# NADF \u2014 \ub098\ubb34\uc704\ud0a4 PDF \ubcf4\uace0\uc11c \uc0dd\uc131\uae30\n\n### \uac1c\uc694\nNADF\ub294 \ub098\ubb34\uc704\ud0a4 \ubb38\uc11c\ub97c \uc790\ub3d9\uc73c\ub85c \ud06c\ub864\ub9c1\ud558\uace0,\n\uc139\uc158 \uad6c\uc870\ub97c \uc720\uc9c0\ud55c PDF \ubcf4\uace0\uc11c\ub85c \ubcc0\ud658\ud558\ub294 \ud30c\uc774\uc36c \uc624\ud508\uc18c\uc2a4 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc785\ub2c8\ub2e4. <br>\n\uc774 \ud504\ub85c\uc81d\ud2b8\uc758 \ud575\uc2ec \ubaa9\uc801\uc740 \ucc57\ubd07 \ud559\uc2b5\uc744 \uc704\ud55c \ud55c\uad6d\uc5b4 \ub370\uc774\ud130 \uc218\uc9d1 \ubc0f \uac80\uc99d\uc785\ub2c8\ub2e4.<br>\n\ud55c\uad6d\uc5b4 \ub370\uc774\ud130\uc14b\uc740 \uc5ec\uc804\ud788 \ubd80\uc871\ud558\uace0, \ud2b9\ud788 \ucd5c\uc2e0\uc131\uacfc \ubc94\uc6a9\uc131\uc744 \ub3d9\uc2dc\uc5d0 \ud655\ubcf4\ud558\uae30 \uc5b4\ub835\uc2b5\ub2c8\ub2e4. <br>\nNADF\ub294 \ubc29\ub300\ud55c \uc8fc\uc81c\ub97c \ub2e4\ub8e8\ub294 \ub098\ubb34\uc704\ud0a4\uc5d0\uc11c \ubb38\uc11c\ub97c \uac00\uc838\uc640, \uc0ac\ub78c\uc774 \uc9c1\uc811 \uc77d\uc73c\uba70 \ud655\uc778\ud560 \uc218 \uc788\ub294 \ud615\ud0dc\uc758 PDF \ubcf4\uace0\uc11c\ub85c \ub9cc\ub4e4\uc5b4\uc90d\ub2c8\ub2e4.\n\n\uc989, NADF\ub294 \ub2e8\uc21c\ud55c PDF \ubcc0\ud658\uae30\ub97c \ub118\uc5b4\uc11c, <Strong>\ud55c\uad6d\uc5b4 \ub370\uc774\ud130 \uc218\uc9d1 \uc704\ud55c \uc2e4\uc6a9\uc801 \ub3c4\uad6c</Strong>\ub97c \ubaa9\uc801\uc73c\ub85c \uc124\uacc4\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n### \ud504\ub85c\uc81d\ud2b8 \ubc30\uacbd \ubc0f \ud544\uc694\uc131\n#### \ud55c\uad6d\uc5b4 \ub370\uc774\ud130\uc14b \ubd80\uc871 \ubb38\uc81c\n\uc601\uc5b4\uad8c\uc740 Common Crawl, Wikipedia, OpenWebText \ub4f1 \ub2e4\uc591\ud55c \ub300\uaddc\ubaa8 \uacf5\uac1c \ub370\uc774\ud130\uc14b\uc774 \uc874\uc7ac\ud569\ub2c8\ub2e4.\n\ud55c\uad6d\uc5b4 \ub370\uc774\ud130\uc14b\uc740 \uc81c\ud55c\uc801\uc774\uace0, \uc8fc\ub85c \ub274\uc2a4/\ud559\uc220 \uc911\uc2ec\uc73c\ub85c \ub418\uc5b4 \uc788\uc5b4 \ucc57\ubd07 \ud559\uc2b5\uc5d0\ub294 \ud55c\uacc4\uac00 \uc788\uc2b5\ub2c8\ub2e4.\n\ub300\ud654\ud615 \ucc57\ubd07\uc5d0\ub294 \uc2e4\uc0dd\ud65c \uc5b8\uc5b4, \ub300\uc911\ubb38\ud654, \ucd5c\uc2e0 \uc0ac\uac74 \uac19\uc740 \ud3ed\ub113\uc740 \ub370\uc774\ud130\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.\n\n### \ub098\ubb34\uc704\ud0a4\uc758 \uac00\uce58\n\ucd5c\uc2e0\uc131: \uc2dc\uc0ac, \uc5f0\uc608, \uc0ac\uac74 \ub4f1 \uc2e4\uc2dc\uac04\uc73c\ub85c \uac31\uc2e0\ub418\ub294 \uc790\ub8cc\n\ud3ed\ub113\uc740 \uc8fc\uc81c: \ud559\ubb38\u00b7\ubb38\ud654\u00b7\uc5ed\uc0ac\u00b7\uc778\ubb3c\u00b7\uae30\uc220\uae4c\uc9c0 \ub2e4\uc591\ud55c \uc601\uc5ed\uc744 \ud3ec\uad04\n\uad6c\uc870\ud654\ub41c \ub370\uc774\ud130: \ubaa9\ucc28 \uae30\ubc18\uc758 \uc139\uc158 \uad6c\uc870\ub97c \uadf8\ub300\ub85c \ubcf4\uc874 \uac00\ub2a5\n\ud55c\uad6d\uc5b4 \uc911\uc2ec: \uc790\uc5f0\uc5b4 \ucc98\ub9ac \ubc0f \ucc57\ubd07 \ud559\uc2b5\uc5d0 \uc9c1\uc811 \ud65c\uc6a9\ud558\uae30 \uc801\ud569\n\n### \ubcf4\uace0\uc11c \ud615\ud0dc\uc758 \ud544\uc694\uc131\n\ub370\uc774\ud130\uc14b\uc744 \uae30\uacc4\uac00 \uace7\ubc14\ub85c \ud559\uc2b5\ud558\uae30 \uc804\uc5d0 \uc0ac\ub78c\uc774 \uc9c1\uc811 \uac80\uc99d\ud558\ub294 \ub2e8\uacc4\uac00 \ubc18\ub4dc\uc2dc \ud544\uc694\ud569\ub2c8\ub2e4.\nNADF\ub294 \uc774 \uacfc\uc815\uc744 \uc9c0\uc6d0\ud558\uae30 \uc704\ud574 \u201c\uc0ac\ub78c\uc774 \uc77d\uc744 \uc218 \uc788\ub294 PDF \ubcf4\uace0\uc11c\u201d \ud615\ud0dc\ub97c \uae30\ubcf8 \ucd9c\ub825\ubb3c\ub85c \uc81c\uacf5\ud569\ub2c8\ub2e4.\n\ub2e4\ub9cc \ubaa9\uc801\uc740 \ub370\uc774\ud130 \uc218\uc9d1\uc774\ubbc0\ub85c, PDF\ub294 \ud654\ub824\ud55c \ub514\uc790\uc778\uc744 \uc9c0\ud5a5\ud558\uc9c0 \uc54a\uace0 \uae30\ubcf8\uc801\uc778 \uac00\ub3c5\uc131\ub9cc \ubcf4\uc7a5\ud569\ub2c8\ub2e4.\n\n### \uc544\ud0a4\ud14d\ucc98 \uac1c\uc694\n```bash\nnadf/\n \u251c\u2500 crawler/         # \ud06c\ub864\ub7ec & HTTP/\uc140\ub808\ub2c8\uc6c0 \ud074\ub77c\uc774\uc5b8\ud2b8\n \u251c\u2500 decorator/       # URL \uac80\uc99d \ub4f1 \ub370\ucf54\ub808\uc774\ud130\n \u251c\u2500 exception/       # \ucee4\uc2a4\ud140 \uc608\uc678\n \u251c\u2500 fonts/           # \ud55c\uae00 \ud3f0\ud2b8\n \u251c\u2500 parser/          # BeautifulSoup \uae30\ubc18 \ud30c\uc11c\n \u2514\u2500 pdf/             # PDF \ubcf4\uace0\uc11c \uc0dd\uc131\uae30 \n```\n### \ub3d9\uc791 \ud750\ub984\n```bash\nCrawler: URL\uc744 \uc785\ub825\ubc1b\uc544 \ub098\ubb34\uc704\ud0a4 \ubb38\uc11c\ub97c \ud06c\ub864\ub9c1\nParser: HTML \u2192 \ud14d\uc2a4\ud2b8 \ubcc0\ud658, \uc139\uc158\ubcc4 \ubd84\ub9ac\nPDF Generator: fpdf2 \uae30\ubc18\uc73c\ub85c \ubcf4\uace0\uc11c \uc0dd\uc131 (\ud3f0\ud2b8 \ud3ec\ud568, \uc139\uc158 \uad6c\uc870 \ubc18\uc601)\n\n\ucd9c\ub825: [\ubb38\uc11c\uba85] \ubd84\uc11d \ubcf4\uace0\uc11c.pdf\n```\n### \uc124\uce58\n```bash\npip install nadf\n```\n> Python: 3.10 \uc774\uc0c1, \ud06c\ub86c \ube0c\ub77c\uc6b0\uc800 \uc124\uce58 \ud544\uc694\n\n### \uc0ac\uc6a9 \ubc29\ubc95\n#### 1. \ud30c\uc774\uc36c \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c \uc0ac\uc6a9\n```python\nimport asyncio\nfrom nadf.crawler import Crawler\nfrom nadf.pdf import PDF\n\nasync def create_pdf(name : str):\n    crawler = Crawler()\n    name, data = await crawler.get_namuwiki_list(name)\n\n    pdf = PDF(doc_title=f\"{name} \ubd84\uc11d \ubcf4\uace0\uc11c\")\n    await pdf.create_pdf_from_namuwiki_list(data, \"./\")\n\nif __name__ == \"__main__\":\n    name = \"\ub098\ub8e8\ud1a0\"\n    asyncio.run(create_pdf(name))\n```\n#### 2. CLI \uba85\ub839\uc5b4\ub85c \uc0ac\uc6a9\n\ub77c\uc774\ube0c\ub7ec\ub9ac \uc124\uce58 \ud6c4, CLI \uba85\ub839\uc5b4\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n```bash\nnadf invoke -p ./output -u \"https://namu.wiki/w/%EC%84%AC%EC%97%90%EC%96%B4\"\n```\n\uc635\uc158 \uc124\uba85:\n-p : PDF \uc800\uc7a5 \uacbd\ub85c\n-u : \ub098\ubb34\uc704\ud0a4 \ubb38\uc11c URL\n\uc774\ub807\uac8c \uc2e4\ud589\ud558\uba74 \uc9c0\uc815 \uacbd\ub85c\uc5d0 [\ubb38\uc11c\uba85] \ubd84\uc11d \ubcf4\uace0\uc11c.pdf \ud30c\uc77c\uc774 \uc0dd\uc131\ub429\ub2c8\ub2e4.\n\n### \ucd9c\ub825\ubb3c\uc758 \ud2b9\uc9d5\n\uc139\uc158 \uad6c\uc870 \ubcf4\uc874: \ubaa9\ucc28\uc5d0 \ub530\ub77c \ubcf8\ubb38\uc774 \uad6c\ubd84\ub418\uc5b4 \ucd9c\ub825\n\ud55c\uae00 \ud3f0\ud2b8 \ub0b4\uc7a5: Noto Serif KR Regular/Bold \ub3d9\ubd09, \ud55c\uae00 \uae68\uc9d0 \ubb38\uc81c \uc5c6\uc74c\n\uc77d\uc744 \uc218 \uc788\ub294 \uc218\uc900\uc758 \uac00\ub3c5\uc131: \uae30\ubcf8\uc801\uc778 \uc5ec\ubc31, \uc904\ubc14\uafc8, \uae00\uaf34 \uc801\uc6a9\n\ub514\uc790\uc778 \ub2e8\uc21c\uc131: \ubcf8\ub798 \ubaa9\uc801\uc740 \ub370\uc774\ud130 \uac80\uc99d\uc6a9\uc774\ubbc0\ub85c \uc2dc\uac01\uc801 \ud654\ub824\ud568\uc740 \ucd5c\uc18c\ud654\n\n### \uae30\ub300\ub418\ub294 \ud65c\uc6a9 \uc2dc\ub098\ub9ac\uc624\n\ud3ed\ub113\uc740 \ub370\uc774\ud130\ub97c \ud1b5\ud55c RAG \ucc57\ubd07\n\uc5f0\uad6c/\ud559\uc2b5 \uc790\ub8cc\n\ud2b9\uc815 \uc8fc\uc81c\ub97c \uc790\ub3d9\uc73c\ub85c \uc218\uc9d1\ud574 \ubcf4\uace0\uc11c\ud654\n\uc218\uc5c5 \ubcf4\uc870 \uc790\ub8cc\ub85c \uc0ac\uc6a9\nPDF\ub97c \ubc14\ud0d5\uc73c\ub85c \ub370\uc774\ud130\uc14b \uc804\ucc98\ub9ac \ud30c\uc774\ud504\ub77c\uc778 \uad6c\ucd95\n\uc774\ud6c4 Q/A \uc30d, \uc694\uc57d \ub370\uc774\ud130\ub85c \uac00\uacf5 \uac00\ub2a5\n### \uae30\uc220\uc801 \ud2b9\uc9d5\n#### \ub77c\uc774\ube0c\ub7ec\ub9ac & CLI \uc774\uc911 \uc9c0\uc6d0 \n#### \ud30c\uc774\uc36c \ucf54\ub4dc\uc5d0\uc11c \uc9c1\uc811 \uc0ac\uc6a9 \uac00\ub2a5 \n#### Noto Serif KR \ub0b4\uc7a5, \ubcc4\ub3c4 \uc124\uce58 \ubd88\ud544\uc694 \n#### \ud06c\ub864\ub7ec/\ud30c\uc11c/PDF \uc0dd\uc131\uae30\uac00 \ubd84\ub9ac\ub418\uc5b4 \uc788\uc5b4 \ud655\uc7a5\uc131 \uc6a9\uc774 \n> PR \ub9c8\uc74c\uaecf \uc62c\ub824\uc8fc\uc138\uc694.\n\n### \uae30\uc5ec \ubc29\ubc95\nPR\uacfc Issue \ubaa8\ub450 \ud658\uc601\ud569\ub2c8\ub2e4!\n\ubc84\uadf8 \ub9ac\ud3ec\ud2b8 \uc2dc Python \ubc84\uc804, \uc2e4\ud589 \ub85c\uadf8, \uc7ac\ud604 \ucf54\ub4dc\ub97c \ud568\uaed8 \uc81c\uacf5\ud574 \uc8fc\uc138\uc694.\n\uc0c8\ub85c\uc6b4 \uae30\ub2a5/\ucd9c\ub825 \ud3ec\ub9f7 \uc81c\uc548\ub3c4 \uc801\uadf9\uc801\uc73c\ub85c \uac80\ud1a0\ud569\ub2c8\ub2e4.\n\n### \ub77c\uc774\uc120\uc2a4\nMIT License (\ud328\ud0a4\uc9c0 \ub0b4 LICENSE \ud30c\uc77c \ucc38\uace0)\n\n### \ucca8\uc5b8\n\ubcf8 \ud504\ub85c\uc81d\ud2b8\ub294 \ub2e8\uc21c\ud55c PDF \uc0dd\uc131\uae30\uac00 \uc544\ub2c8\ub77c,\n\ud55c\uad6d\uc5b4 \ucc57\ubd07 \ud559\uc2b5 \uc0dd\ud0dc\uacc4 \ud655\uc7a5\uc744 \uc704\ud574 \uc2e4\uc6a9\uc801\uc778 \ub3c4\uad6c\ub85c \ubc1c\uc804\ud558\uae30\ub97c \ubaa9\ud45c\ub85c \ud569\ub2c8\ub2e4. <br>\n\ud55c\uad6d\uc5b4 \ub370\uc774\ud130 \ud65c\uc6a9\uc758 \ubc94\uc704\ub97c \ub113\ud788\ub294 \ub370 \uae30\uc5ec\ud558\uae30\ub97c \uae30\ub300\ud569\ub2c8\ub2e4.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "NamuWiki crawler & PDF utilities",
    "version": "0.1.23",
    "project_urls": {
        "Homepage": "https://github.com/pdh0128/nadf",
        "Issues": "https://github.com/pdh0128/nadf/issues"
    },
    "split_keywords": [
        "crawler",
        " namuwiki",
        " pdf"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "84c829f54ce80cb92616e23a2ab7e67073a9a55f2f001942c1e705198cc4dcf2",
                "md5": "01165bf728d9608e9af18af36b771e99",
                "sha256": "f4190c6807e7880a865434579889aabf33437aa6298b25e1d781c4d449ee5cf1"
            },
            "downloads": -1,
            "filename": "nadf-0.1.23-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "01165bf728d9608e9af18af36b771e99",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 11130199,
            "upload_time": "2025-08-25T07:09:50",
            "upload_time_iso_8601": "2025-08-25T07:09:50.225770Z",
            "url": "https://files.pythonhosted.org/packages/84/c8/29f54ce80cb92616e23a2ab7e67073a9a55f2f001942c1e705198cc4dcf2/nadf-0.1.23-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8dc63fac9ef33c3f55396d528cbb41c7fdd51a3ea6c5ae48bc5a200312bb3dee",
                "md5": "560863a8a6f9014743e9f242aeea7b2b",
                "sha256": "01c2e2a1737696f90aa91fa87e6e5368695737d2323344ac61fde76c4588f749"
            },
            "downloads": -1,
            "filename": "nadf-0.1.23.tar.gz",
            "has_sig": false,
            "md5_digest": "560863a8a6f9014743e9f242aeea7b2b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 11077749,
            "upload_time": "2025-08-25T07:09:55",
            "upload_time_iso_8601": "2025-08-25T07:09:55.104202Z",
            "url": "https://files.pythonhosted.org/packages/8d/c6/3fac9ef33c3f55396d528cbb41c7fdd51a3ea6c5ae48bc5a200312bb3dee/nadf-0.1.23.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-25 07:09:55",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "pdh0128",
    "github_project": "nadf",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "annotated-types",
            "specs": [
                [
                    "==",
                    "0.7.0"
                ]
            ]
        },
        {
            "name": "anyio",
            "specs": [
                [
                    "==",
                    "4.10.0"
                ]
            ]
        },
        {
            "name": "beautifulsoup4",
            "specs": [
                [
                    "==",
                    "4.13.4"
                ]
            ]
        },
        {
            "name": "bs4",
            "specs": [
                [
                    "==",
                    "0.0.2"
                ]
            ]
        },
        {
            "name": "certifi",
            "specs": [
                [
                    "==",
                    "2025.8.3"
                ]
            ]
        },
        {
            "name": "charset-normalizer",
            "specs": [
                [
                    "==",
                    "3.4.3"
                ]
            ]
        },
        {
            "name": "click",
            "specs": [
                [
                    "==",
                    "8.2.1"
                ]
            ]
        },
        {
            "name": "defusedxml",
            "specs": [
                [
                    "==",
                    "0.7.1"
                ]
            ]
        },
        {
            "name": "fonttools",
            "specs": [
                [
                    "==",
                    "4.59.0"
                ]
            ]
        },
        {
            "name": "fpdf",
            "specs": [
                [
                    "==",
                    "1.7.2"
                ]
            ]
        },
        {
            "name": "fpdf2",
            "specs": [
                [
                    "==",
                    "2.8.4"
                ]
            ]
        },
        {
            "name": "h11",
            "specs": [
                [
                    "==",
                    "0.16.0"
                ]
            ]
        },
        {
            "name": "httpcore",
            "specs": [
                [
                    "==",
                    "1.0.9"
                ]
            ]
        },
        {
            "name": "httpx",
            "specs": [
                [
                    "==",
                    "0.28.1"
                ]
            ]
        },
        {
            "name": "idna",
            "specs": [
                [
                    "==",
                    "3.10"
                ]
            ]
        },
        {
            "name": "Jinja2",
            "specs": [
                [
                    "==",
                    "3.1.6"
                ]
            ]
        },
        {
            "name": "MarkupSafe",
            "specs": [
                [
                    "==",
                    "3.0.2"
                ]
            ]
        },
        {
            "name": "pdfkit",
            "specs": [
                [
                    "==",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "pillow",
            "specs": [
                [
                    "==",
                    "11.3.0"
                ]
            ]
        },
        {
            "name": "pydantic",
            "specs": [
                [
                    "==",
                    "2.11.7"
                ]
            ]
        },
        {
            "name": "pydantic_core",
            "specs": [
                [
                    "==",
                    "2.33.2"
                ]
            ]
        },
        {
            "name": "python-multipart",
            "specs": [
                [
                    "==",
                    "0.0.20"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.32.4"
                ]
            ]
        },
        {
            "name": "sniffio",
            "specs": [
                [
                    "==",
                    "1.3.1"
                ]
            ]
        },
        {
            "name": "soupsieve",
            "specs": [
                [
                    "==",
                    "2.7"
                ]
            ]
        },
        {
            "name": "starlette",
            "specs": [
                [
                    "==",
                    "0.47.2"
                ]
            ]
        },
        {
            "name": "typing-inspection",
            "specs": [
                [
                    "==",
                    "0.4.1"
                ]
            ]
        },
        {
            "name": "typing_extensions",
            "specs": [
                [
                    "==",
                    "4.14.1"
                ]
            ]
        },
        {
            "name": "urllib3",
            "specs": [
                [
                    "==",
                    "2.5.0"
                ]
            ]
        },
        {
            "name": "uvicorn",
            "specs": [
                [
                    "==",
                    "0.35.0"
                ]
            ]
        }
    ],
    "lcname": "nadf"
}
        
Elapsed time: 1.09684s