Metadata-Version: 2.2
Name: tokenpdf
Version: 0.4.1
Summary: Generate printable PDF files for tabletop RPG tokens and maps
Home-page: https://github.com/Dormar2/tokenpdf
Author-email: Dor Marciano <doormarci@gmail.com>
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Topic :: Games/Entertainment :: Role-Playing
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: certifi==2025.1.31
Requires-Dist: charset-normalizer==3.4.1
Requires-Dist: colorama==0.4.6
Requires-Dist: idna==3.10
Requires-Dist: imagesize==1.4.1
Requires-Dist: networkx==3.4.2
Requires-Dist: numpy==2.1.3
Requires-Dist: opencv-python==4.11.0.86
Requires-Dist: papersizes==0.6.1
Requires-Dist: pillow==11.1.0
Requires-Dist: platformdirs==4.3.6
Requires-Dist: pyyaml==6.0.2
Requires-Dist: rectpack==0.2.2
Requires-Dist: requests==2.32.3
Requires-Dist: svgwrite==1.4.3
Requires-Dist: tabulate==0.9.0
Requires-Dist: toml==0.10.2
Requires-Dist: tqdm==4.67.1
Requires-Dist: urllib3==2.3.0
Requires-Dist: wrapt==1.17.2
Provides-Extra: gpu
Requires-Dist: aiofiles==23.2.1; extra == "gpu"
Requires-Dist: aiohappyeyeballs==2.4.6; extra == "gpu"
Requires-Dist: aiohttp==3.11.12; extra == "gpu"
Requires-Dist: aiosignal==1.3.2; extra == "gpu"
Requires-Dist: annotated-types==0.7.0; extra == "gpu"
Requires-Dist: anyio==4.8.0; extra == "gpu"
Requires-Dist: asyncer==0.0.8; extra == "gpu"
Requires-Dist: attrs==25.1.0; extra == "gpu"
Requires-Dist: certifi==2025.1.31; extra == "gpu"
Requires-Dist: charset-normalizer==3.4.1; extra == "gpu"
Requires-Dist: click==8.1.8; extra == "gpu"
Requires-Dist: colorama==0.4.6; extra == "gpu"
Requires-Dist: coloredlogs==15.0.1; extra == "gpu"
Requires-Dist: fastapi==0.115.8; extra == "gpu"
Requires-Dist: ffmpy==0.5.0; extra == "gpu"
Requires-Dist: filelock==3.17.0; extra == "gpu"
Requires-Dist: filetype==1.2.0; extra == "gpu"
Requires-Dist: flatbuffers==25.1.24; extra == "gpu"
Requires-Dist: frozenlist==1.5.0; extra == "gpu"
Requires-Dist: fsspec==2025.2.0; extra == "gpu"
Requires-Dist: gradio==5.15.0; extra == "gpu"
Requires-Dist: gradio-client==1.7.0; extra == "gpu"
Requires-Dist: h11==0.14.0; extra == "gpu"
Requires-Dist: httpcore==1.0.7; extra == "gpu"
Requires-Dist: httpx==0.28.1; extra == "gpu"
Requires-Dist: huggingface-hub==0.28.1; extra == "gpu"
Requires-Dist: humanfriendly==10.0; extra == "gpu"
Requires-Dist: idna==3.10; extra == "gpu"
Requires-Dist: imageio==2.37.0; extra == "gpu"
Requires-Dist: imagesize==1.4.1; extra == "gpu"
Requires-Dist: jinja2==3.1.5; extra == "gpu"
Requires-Dist: jsonschema==4.23.0; extra == "gpu"
Requires-Dist: jsonschema-specifications==2024.10.1; extra == "gpu"
Requires-Dist: lazy-loader==0.4; extra == "gpu"
Requires-Dist: llvmlite==0.44.0; extra == "gpu"
Requires-Dist: markdown-it-py==3.0.0; extra == "gpu"
Requires-Dist: markupsafe==2.1.5; extra == "gpu"
Requires-Dist: mdurl==0.1.2; extra == "gpu"
Requires-Dist: mpmath==1.3.0; extra == "gpu"
Requires-Dist: multidict==6.1.0; extra == "gpu"
Requires-Dist: networkx==3.4.2; extra == "gpu"
Requires-Dist: numba==0.61.0; extra == "gpu"
Requires-Dist: numpy==2.1.3; extra == "gpu"
Requires-Dist: onnxruntime-gpu==1.20.1; extra == "gpu"
Requires-Dist: opencv-python==4.11.0.86; extra == "gpu"
Requires-Dist: opencv-python-headless==4.11.0.86; extra == "gpu"
Requires-Dist: orjson==3.10.15; extra == "gpu"
Requires-Dist: packaging==24.2; extra == "gpu"
Requires-Dist: pandas==2.2.3; extra == "gpu"
Requires-Dist: papersizes==0.6.1; extra == "gpu"
Requires-Dist: pillow==11.1.0; extra == "gpu"
Requires-Dist: platformdirs==4.3.6; extra == "gpu"
Requires-Dist: pooch==1.8.2; extra == "gpu"
Requires-Dist: propcache==0.2.1; extra == "gpu"
Requires-Dist: protobuf==5.29.3; extra == "gpu"
Requires-Dist: pydantic==2.10.6; extra == "gpu"
Requires-Dist: pydantic-core==2.27.2; extra == "gpu"
Requires-Dist: pydub==0.25.1; extra == "gpu"
Requires-Dist: pygments==2.19.1; extra == "gpu"
Requires-Dist: pymatting==1.1.13; extra == "gpu"
Requires-Dist: pyreadline3==3.5.4; extra == "gpu"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "gpu"
Requires-Dist: python-multipart==0.0.20; extra == "gpu"
Requires-Dist: pytz==2025.1; extra == "gpu"
Requires-Dist: pyyaml==6.0.2; extra == "gpu"
Requires-Dist: rectpack==0.2.2; extra == "gpu"
Requires-Dist: referencing==0.36.2; extra == "gpu"
Requires-Dist: rembg==2.0.62; extra == "gpu"
Requires-Dist: requests==2.32.3; extra == "gpu"
Requires-Dist: rich==13.9.4; extra == "gpu"
Requires-Dist: rpds-py==0.22.3; extra == "gpu"
Requires-Dist: ruff==0.9.5; extra == "gpu"
Requires-Dist: safehttpx==0.1.6; extra == "gpu"
Requires-Dist: scikit-image==0.25.1; extra == "gpu"
Requires-Dist: scipy==1.15.1; extra == "gpu"
Requires-Dist: semantic-version==2.10.0; extra == "gpu"
Requires-Dist: shellingham==1.5.4; extra == "gpu"
Requires-Dist: six==1.17.0; extra == "gpu"
Requires-Dist: sniffio==1.3.1; extra == "gpu"
Requires-Dist: starlette==0.45.3; extra == "gpu"
Requires-Dist: svgwrite==1.4.3; extra == "gpu"
Requires-Dist: sympy==1.13.3; extra == "gpu"
Requires-Dist: tabulate==0.9.0; extra == "gpu"
Requires-Dist: tifffile==2025.1.10; extra == "gpu"
Requires-Dist: toml==0.10.2; extra == "gpu"
Requires-Dist: tomlkit==0.13.2; extra == "gpu"
Requires-Dist: tqdm==4.67.1; extra == "gpu"
Requires-Dist: typer==0.15.1; extra == "gpu"
Requires-Dist: typing-extensions==4.12.2; extra == "gpu"
Requires-Dist: tzdata==2025.1; extra == "gpu"
Requires-Dist: urllib3==2.3.0; extra == "gpu"
Requires-Dist: uvicorn==0.34.0; extra == "gpu"
Requires-Dist: watchdog==6.0.0; extra == "gpu"
Requires-Dist: websockets==14.2; extra == "gpu"
Requires-Dist: wrapt==1.17.2; extra == "gpu"
Requires-Dist: yarl==1.18.3; extra == "gpu"
Provides-Extra: cpu
Requires-Dist: aiofiles==23.2.1; extra == "cpu"
Requires-Dist: aiohappyeyeballs==2.4.6; extra == "cpu"
Requires-Dist: aiohttp==3.11.12; extra == "cpu"
Requires-Dist: aiosignal==1.3.2; extra == "cpu"
Requires-Dist: annotated-types==0.7.0; extra == "cpu"
Requires-Dist: anyio==4.8.0; extra == "cpu"
Requires-Dist: asyncer==0.0.8; extra == "cpu"
Requires-Dist: attrs==25.1.0; extra == "cpu"
Requires-Dist: certifi==2025.1.31; extra == "cpu"
Requires-Dist: charset-normalizer==3.4.1; extra == "cpu"
Requires-Dist: click==8.1.8; extra == "cpu"
Requires-Dist: colorama==0.4.6; extra == "cpu"
Requires-Dist: coloredlogs==15.0.1; extra == "cpu"
Requires-Dist: fastapi==0.115.8; extra == "cpu"
Requires-Dist: ffmpy==0.5.0; extra == "cpu"
Requires-Dist: filelock==3.17.0; extra == "cpu"
Requires-Dist: filetype==1.2.0; extra == "cpu"
Requires-Dist: flatbuffers==25.1.24; extra == "cpu"
Requires-Dist: frozenlist==1.5.0; extra == "cpu"
Requires-Dist: fsspec==2025.2.0; extra == "cpu"
Requires-Dist: gradio==5.15.0; extra == "cpu"
Requires-Dist: gradio-client==1.7.0; extra == "cpu"
Requires-Dist: h11==0.14.0; extra == "cpu"
Requires-Dist: httpcore==1.0.7; extra == "cpu"
Requires-Dist: httpx==0.28.1; extra == "cpu"
Requires-Dist: huggingface-hub==0.28.1; extra == "cpu"
Requires-Dist: humanfriendly==10.0; extra == "cpu"
Requires-Dist: idna==3.10; extra == "cpu"
Requires-Dist: imageio==2.37.0; extra == "cpu"
Requires-Dist: imagesize==1.4.1; extra == "cpu"
Requires-Dist: jinja2==3.1.5; extra == "cpu"
Requires-Dist: jsonschema==4.23.0; extra == "cpu"
Requires-Dist: jsonschema-specifications==2024.10.1; extra == "cpu"
Requires-Dist: lazy-loader==0.4; extra == "cpu"
Requires-Dist: llvmlite==0.44.0; extra == "cpu"
Requires-Dist: markdown-it-py==3.0.0; extra == "cpu"
Requires-Dist: markupsafe==2.1.5; extra == "cpu"
Requires-Dist: mdurl==0.1.2; extra == "cpu"
Requires-Dist: mpmath==1.3.0; extra == "cpu"
Requires-Dist: multidict==6.1.0; extra == "cpu"
Requires-Dist: networkx==3.4.2; extra == "cpu"
Requires-Dist: numba==0.61.0; extra == "cpu"
Requires-Dist: numpy==2.1.3; extra == "cpu"
Requires-Dist: onnxruntime==1.20.1; extra == "cpu"
Requires-Dist: opencv-python==4.11.0.86; extra == "cpu"
Requires-Dist: opencv-python-headless==4.11.0.86; extra == "cpu"
Requires-Dist: orjson==3.10.15; extra == "cpu"
Requires-Dist: packaging==24.2; extra == "cpu"
Requires-Dist: pandas==2.2.3; extra == "cpu"
Requires-Dist: papersizes==0.6.1; extra == "cpu"
Requires-Dist: pillow==11.1.0; extra == "cpu"
Requires-Dist: platformdirs==4.3.6; extra == "cpu"
Requires-Dist: pooch==1.8.2; extra == "cpu"
Requires-Dist: propcache==0.2.1; extra == "cpu"
Requires-Dist: protobuf==5.29.3; extra == "cpu"
Requires-Dist: pydantic==2.10.6; extra == "cpu"
Requires-Dist: pydantic-core==2.27.2; extra == "cpu"
Requires-Dist: pydub==0.25.1; extra == "cpu"
Requires-Dist: pygments==2.19.1; extra == "cpu"
Requires-Dist: pymatting==1.1.13; extra == "cpu"
Requires-Dist: pyreadline3==3.5.4; extra == "cpu"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "cpu"
Requires-Dist: python-multipart==0.0.20; extra == "cpu"
Requires-Dist: pytz==2025.1; extra == "cpu"
Requires-Dist: pyyaml==6.0.2; extra == "cpu"
Requires-Dist: rectpack==0.2.2; extra == "cpu"
Requires-Dist: referencing==0.36.2; extra == "cpu"
Requires-Dist: rembg==2.0.62; extra == "cpu"
Requires-Dist: requests==2.32.3; extra == "cpu"
Requires-Dist: rich==13.9.4; extra == "cpu"
Requires-Dist: rpds-py==0.22.3; extra == "cpu"
Requires-Dist: ruff==0.9.5; extra == "cpu"
Requires-Dist: safehttpx==0.1.6; extra == "cpu"
Requires-Dist: scikit-image==0.25.1; extra == "cpu"
Requires-Dist: scipy==1.15.1; extra == "cpu"
Requires-Dist: semantic-version==2.10.0; extra == "cpu"
Requires-Dist: shellingham==1.5.4; extra == "cpu"
Requires-Dist: six==1.17.0; extra == "cpu"
Requires-Dist: sniffio==1.3.1; extra == "cpu"
Requires-Dist: starlette==0.45.3; extra == "cpu"
Requires-Dist: svgwrite==1.4.3; extra == "cpu"
Requires-Dist: sympy==1.13.3; extra == "cpu"
Requires-Dist: tabulate==0.9.0; extra == "cpu"
Requires-Dist: tifffile==2025.1.10; extra == "cpu"
Requires-Dist: toml==0.10.2; extra == "cpu"
Requires-Dist: tomlkit==0.13.2; extra == "cpu"
Requires-Dist: tqdm==4.67.1; extra == "cpu"
Requires-Dist: typer==0.15.1; extra == "cpu"
Requires-Dist: typing-extensions==4.12.2; extra == "cpu"
Requires-Dist: tzdata==2025.1; extra == "cpu"
Requires-Dist: urllib3==2.3.0; extra == "cpu"
Requires-Dist: uvicorn==0.34.0; extra == "cpu"
Requires-Dist: watchdog==6.0.0; extra == "cpu"
Requires-Dist: websockets==14.2; extra == "cpu"
Requires-Dist: wrapt==1.17.2; extra == "cpu"
Requires-Dist: yarl==1.18.3; extra == "cpu"
Provides-Extra: pdf-rl
Requires-Dist: certifi==2025.1.31; extra == "pdf-rl"
Requires-Dist: chardet==5.2.0; extra == "pdf-rl"
Requires-Dist: charset-normalizer==3.4.1; extra == "pdf-rl"
Requires-Dist: colorama==0.4.6; extra == "pdf-rl"
Requires-Dist: deprecated==1.2.18; extra == "pdf-rl"
Requires-Dist: idna==3.10; extra == "pdf-rl"
Requires-Dist: imagesize==1.4.1; extra == "pdf-rl"
Requires-Dist: lxml==5.3.0; extra == "pdf-rl"
Requires-Dist: networkx==3.4.2; extra == "pdf-rl"
Requires-Dist: numpy==2.1.3; extra == "pdf-rl"
Requires-Dist: opencv-python==4.11.0.86; extra == "pdf-rl"
Requires-Dist: packaging==24.2; extra == "pdf-rl"
Requires-Dist: papersizes==0.6.1; extra == "pdf-rl"
Requires-Dist: pikepdf==9.5.2; extra == "pdf-rl"
Requires-Dist: pillow==11.1.0; extra == "pdf-rl"
Requires-Dist: platformdirs==4.3.6; extra == "pdf-rl"
Requires-Dist: pypdf2==3.0.1; extra == "pdf-rl"
Requires-Dist: pyyaml==6.0.2; extra == "pdf-rl"
Requires-Dist: rectpack==0.2.2; extra == "pdf-rl"
Requires-Dist: reportlab==4.3.0; extra == "pdf-rl"
Requires-Dist: requests==2.32.3; extra == "pdf-rl"
Requires-Dist: svgwrite==1.4.3; extra == "pdf-rl"
Requires-Dist: tabulate==0.9.0; extra == "pdf-rl"
Requires-Dist: toml==0.10.2; extra == "pdf-rl"
Requires-Dist: tqdm==4.67.1; extra == "pdf-rl"
Requires-Dist: urllib3==2.3.0; extra == "pdf-rl"
Requires-Dist: wrapt==1.17.2; extra == "pdf-rl"
Provides-Extra: pdf-qt
Requires-Dist: certifi==2025.1.31; extra == "pdf-qt"
Requires-Dist: charset-normalizer==3.4.1; extra == "pdf-qt"
Requires-Dist: colorama==0.4.6; extra == "pdf-qt"
Requires-Dist: deprecated==1.2.18; extra == "pdf-qt"
Requires-Dist: idna==3.10; extra == "pdf-qt"
Requires-Dist: imagesize==1.4.1; extra == "pdf-qt"
Requires-Dist: lxml==5.3.0; extra == "pdf-qt"
Requires-Dist: networkx==3.4.2; extra == "pdf-qt"
Requires-Dist: numpy==2.1.3; extra == "pdf-qt"
Requires-Dist: opencv-python==4.11.0.86; extra == "pdf-qt"
Requires-Dist: packaging==24.2; extra == "pdf-qt"
Requires-Dist: papersizes==0.6.1; extra == "pdf-qt"
Requires-Dist: pikepdf==9.5.2; extra == "pdf-qt"
Requires-Dist: pillow==11.1.0; extra == "pdf-qt"
Requires-Dist: platformdirs==4.3.6; extra == "pdf-qt"
Requires-Dist: pypdf2==3.0.1; extra == "pdf-qt"
Requires-Dist: pyside6==6.8.2.1; extra == "pdf-qt"
Requires-Dist: pyside6-addons==6.8.2.1; extra == "pdf-qt"
Requires-Dist: pyside6-essentials==6.8.2.1; extra == "pdf-qt"
Requires-Dist: pyyaml==6.0.2; extra == "pdf-qt"
Requires-Dist: rectpack==0.2.2; extra == "pdf-qt"
Requires-Dist: requests==2.32.3; extra == "pdf-qt"
Requires-Dist: shiboken6==6.8.2.1; extra == "pdf-qt"
Requires-Dist: svgwrite==1.4.3; extra == "pdf-qt"
Requires-Dist: tabulate==0.9.0; extra == "pdf-qt"
Requires-Dist: toml==0.10.2; extra == "pdf-qt"
Requires-Dist: tqdm==4.67.1; extra == "pdf-qt"
Requires-Dist: urllib3==2.3.0; extra == "pdf-qt"
Requires-Dist: wrapt==1.17.2; extra == "pdf-qt"
Provides-Extra: pdf-pr
Requires-Dist: certifi==2025.1.31; extra == "pdf-pr"
Requires-Dist: charset-normalizer==3.4.1; extra == "pdf-pr"
Requires-Dist: colorama==0.4.6; extra == "pdf-pr"
Requires-Dist: deprecated==1.2.18; extra == "pdf-pr"
Requires-Dist: greenlet==3.1.1; extra == "pdf-pr"
Requires-Dist: idna==3.10; extra == "pdf-pr"
Requires-Dist: imagesize==1.4.1; extra == "pdf-pr"
Requires-Dist: lxml==5.3.0; extra == "pdf-pr"
Requires-Dist: networkx==3.4.2; extra == "pdf-pr"
Requires-Dist: numpy==2.1.3; extra == "pdf-pr"
Requires-Dist: opencv-python==4.11.0.86; extra == "pdf-pr"
Requires-Dist: packaging==24.2; extra == "pdf-pr"
Requires-Dist: papersizes==0.6.1; extra == "pdf-pr"
Requires-Dist: pikepdf==9.5.2; extra == "pdf-pr"
Requires-Dist: pillow==11.1.0; extra == "pdf-pr"
Requires-Dist: platformdirs==4.3.6; extra == "pdf-pr"
Requires-Dist: playwright==1.50.0; extra == "pdf-pr"
Requires-Dist: pyee==12.1.1; extra == "pdf-pr"
Requires-Dist: pypdf2==3.0.1; extra == "pdf-pr"
Requires-Dist: pyyaml==6.0.2; extra == "pdf-pr"
Requires-Dist: rectpack==0.2.2; extra == "pdf-pr"
Requires-Dist: requests==2.32.3; extra == "pdf-pr"
Requires-Dist: svgwrite==1.4.3; extra == "pdf-pr"
Requires-Dist: tabulate==0.9.0; extra == "pdf-pr"
Requires-Dist: toml==0.10.2; extra == "pdf-pr"
Requires-Dist: tqdm==4.67.1; extra == "pdf-pr"
Requires-Dist: typing-extensions==4.12.2; extra == "pdf-pr"
Requires-Dist: urllib3==2.3.0; extra == "pdf-pr"
Requires-Dist: wrapt==1.17.2; extra == "pdf-pr"
Provides-Extra: pdf-all
Requires-Dist: certifi==2025.1.31; extra == "pdf-all"
Requires-Dist: chardet==5.2.0; extra == "pdf-all"
Requires-Dist: charset-normalizer==3.4.1; extra == "pdf-all"
Requires-Dist: colorama==0.4.6; extra == "pdf-all"
Requires-Dist: deprecated==1.2.18; extra == "pdf-all"
Requires-Dist: greenlet==3.1.1; extra == "pdf-all"
Requires-Dist: idna==3.10; extra == "pdf-all"
Requires-Dist: imagesize==1.4.1; extra == "pdf-all"
Requires-Dist: lxml==5.3.1; extra == "pdf-all"
Requires-Dist: networkx==3.4.2; extra == "pdf-all"
Requires-Dist: numpy==2.1.3; extra == "pdf-all"
Requires-Dist: opencv-python==4.11.0.86; extra == "pdf-all"
Requires-Dist: packaging==24.2; extra == "pdf-all"
Requires-Dist: papersizes==0.6.1; extra == "pdf-all"
Requires-Dist: pikepdf==9.5.2; extra == "pdf-all"
Requires-Dist: pillow==11.1.0; extra == "pdf-all"
Requires-Dist: platformdirs==4.3.6; extra == "pdf-all"
Requires-Dist: playwright==1.50.0; extra == "pdf-all"
Requires-Dist: pyee==12.1.1; extra == "pdf-all"
Requires-Dist: pypdf2==3.0.1; extra == "pdf-all"
Requires-Dist: pyside6==6.8.2.1; extra == "pdf-all"
Requires-Dist: pyside6-addons==6.8.2.1; extra == "pdf-all"
Requires-Dist: pyside6-essentials==6.8.2.1; extra == "pdf-all"
Requires-Dist: pyyaml==6.0.2; extra == "pdf-all"
Requires-Dist: rectpack==0.2.2; extra == "pdf-all"
Requires-Dist: reportlab==4.3.0; extra == "pdf-all"
Requires-Dist: requests==2.32.3; extra == "pdf-all"
Requires-Dist: shiboken6==6.8.2.1; extra == "pdf-all"
Requires-Dist: svgwrite==1.4.3; extra == "pdf-all"
Requires-Dist: tabulate==0.9.0; extra == "pdf-all"
Requires-Dist: toml==0.10.2; extra == "pdf-all"
Requires-Dist: tqdm==4.67.1; extra == "pdf-all"
Requires-Dist: typing-extensions==4.12.2; extra == "pdf-all"
Requires-Dist: urllib3==2.3.0; extra == "pdf-all"
Requires-Dist: wrapt==1.17.2; extra == "pdf-all"
Provides-Extra: full
Requires-Dist: aiofiles==23.2.1; extra == "full"
Requires-Dist: aiohappyeyeballs==2.4.6; extra == "full"
Requires-Dist: aiohttp==3.11.12; extra == "full"
Requires-Dist: aiosignal==1.3.2; extra == "full"
Requires-Dist: annotated-types==0.7.0; extra == "full"
Requires-Dist: anyio==4.8.0; extra == "full"
Requires-Dist: asyncer==0.0.8; extra == "full"
Requires-Dist: attrs==25.1.0; extra == "full"
Requires-Dist: certifi==2025.1.31; extra == "full"
Requires-Dist: chardet==5.2.0; extra == "full"
Requires-Dist: charset-normalizer==3.4.1; extra == "full"
Requires-Dist: click==8.1.8; extra == "full"
Requires-Dist: colorama==0.4.6; extra == "full"
Requires-Dist: coloredlogs==15.0.1; extra == "full"
Requires-Dist: deprecated==1.2.18; extra == "full"
Requires-Dist: fastapi==0.115.8; extra == "full"
Requires-Dist: ffmpy==0.5.0; extra == "full"
Requires-Dist: filelock==3.17.0; extra == "full"
Requires-Dist: filetype==1.2.0; extra == "full"
Requires-Dist: flatbuffers==25.1.24; extra == "full"
Requires-Dist: frozenlist==1.5.0; extra == "full"
Requires-Dist: fsspec==2025.2.0; extra == "full"
Requires-Dist: gradio==5.15.0; extra == "full"
Requires-Dist: gradio-client==1.7.0; extra == "full"
Requires-Dist: greenlet==3.1.1; extra == "full"
Requires-Dist: h11==0.14.0; extra == "full"
Requires-Dist: httpcore==1.0.7; extra == "full"
Requires-Dist: httpx==0.28.1; extra == "full"
Requires-Dist: huggingface-hub==0.28.1; extra == "full"
Requires-Dist: humanfriendly==10.0; extra == "full"
Requires-Dist: idna==3.10; extra == "full"
Requires-Dist: imageio==2.37.0; extra == "full"
Requires-Dist: imagesize==1.4.1; extra == "full"
Requires-Dist: jinja2==3.1.5; extra == "full"
Requires-Dist: jsonschema==4.23.0; extra == "full"
Requires-Dist: jsonschema-specifications==2024.10.1; extra == "full"
Requires-Dist: lazy-loader==0.4; extra == "full"
Requires-Dist: llvmlite==0.44.0; extra == "full"
Requires-Dist: lxml==5.3.0; extra == "full"
Requires-Dist: markdown-it-py==3.0.0; extra == "full"
Requires-Dist: markupsafe==2.1.5; extra == "full"
Requires-Dist: mdurl==0.1.2; extra == "full"
Requires-Dist: mpmath==1.3.0; extra == "full"
Requires-Dist: multidict==6.1.0; extra == "full"
Requires-Dist: networkx==3.4.2; extra == "full"
Requires-Dist: numba==0.61.0; extra == "full"
Requires-Dist: numpy==2.1.3; extra == "full"
Requires-Dist: onnxruntime==1.20.1; extra == "full"
Requires-Dist: opencv-python==4.11.0.86; extra == "full"
Requires-Dist: opencv-python-headless==4.11.0.86; extra == "full"
Requires-Dist: orjson==3.10.15; extra == "full"
Requires-Dist: packaging==24.2; extra == "full"
Requires-Dist: pandas==2.2.3; extra == "full"
Requires-Dist: papersizes==0.6.1; extra == "full"
Requires-Dist: pikepdf==9.5.2; extra == "full"
Requires-Dist: pillow==11.1.0; extra == "full"
Requires-Dist: platformdirs==4.3.6; extra == "full"
Requires-Dist: playwright==1.50.0; extra == "full"
Requires-Dist: pooch==1.8.2; extra == "full"
Requires-Dist: propcache==0.2.1; extra == "full"
Requires-Dist: protobuf==5.29.3; extra == "full"
Requires-Dist: pydantic==2.10.6; extra == "full"
Requires-Dist: pydantic-core==2.27.2; extra == "full"
Requires-Dist: pydub==0.25.1; extra == "full"
Requires-Dist: pyee==12.1.1; extra == "full"
Requires-Dist: pygments==2.19.1; extra == "full"
Requires-Dist: pymatting==1.1.13; extra == "full"
Requires-Dist: pypdf2==3.0.1; extra == "full"
Requires-Dist: pyreadline3==3.5.4; extra == "full"
Requires-Dist: pyside6==6.8.2.1; extra == "full"
Requires-Dist: pyside6-addons==6.8.2.1; extra == "full"
Requires-Dist: pyside6-essentials==6.8.2.1; extra == "full"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "full"
Requires-Dist: python-multipart==0.0.20; extra == "full"
Requires-Dist: pytz==2025.1; extra == "full"
Requires-Dist: pyyaml==6.0.2; extra == "full"
Requires-Dist: rectpack==0.2.2; extra == "full"
Requires-Dist: referencing==0.36.2; extra == "full"
Requires-Dist: rembg==2.0.62; extra == "full"
Requires-Dist: reportlab==4.3.0; extra == "full"
Requires-Dist: requests==2.32.3; extra == "full"
Requires-Dist: rich==13.9.4; extra == "full"
Requires-Dist: rpds-py==0.22.3; extra == "full"
Requires-Dist: ruff==0.9.5; extra == "full"
Requires-Dist: safehttpx==0.1.6; extra == "full"
Requires-Dist: scikit-image==0.25.1; extra == "full"
Requires-Dist: scipy==1.15.1; extra == "full"
Requires-Dist: semantic-version==2.10.0; extra == "full"
Requires-Dist: shellingham==1.5.4; extra == "full"
Requires-Dist: shiboken6==6.8.2.1; extra == "full"
Requires-Dist: six==1.17.0; extra == "full"
Requires-Dist: sniffio==1.3.1; extra == "full"
Requires-Dist: starlette==0.45.3; extra == "full"
Requires-Dist: svgwrite==1.4.3; extra == "full"
Requires-Dist: sympy==1.13.3; extra == "full"
Requires-Dist: tabulate==0.9.0; extra == "full"
Requires-Dist: tifffile==2025.1.10; extra == "full"
Requires-Dist: toml==0.10.2; extra == "full"
Requires-Dist: tomlkit==0.13.2; extra == "full"
Requires-Dist: tqdm==4.67.1; extra == "full"
Requires-Dist: typer==0.15.1; extra == "full"
Requires-Dist: typing-extensions==4.12.2; extra == "full"
Requires-Dist: tzdata==2025.1; extra == "full"
Requires-Dist: urllib3==2.3.0; extra == "full"
Requires-Dist: uvicorn==0.34.0; extra == "full"
Requires-Dist: watchdog==6.0.0; extra == "full"
Requires-Dist: websockets==14.2; extra == "full"
Requires-Dist: wrapt==1.17.2; extra == "full"
Requires-Dist: yarl==1.18.3; extra == "full"
Provides-Extra: dev
Requires-Dist: aiofiles==23.2.1; extra == "dev"
Requires-Dist: aiohappyeyeballs==2.4.6; extra == "dev"
Requires-Dist: aiohttp==3.11.12; extra == "dev"
Requires-Dist: aiosignal==1.3.2; extra == "dev"
Requires-Dist: alabaster==1.0.0; extra == "dev"
Requires-Dist: annotated-types==0.7.0; extra == "dev"
Requires-Dist: anyio==4.8.0; extra == "dev"
Requires-Dist: asyncer==0.0.8; extra == "dev"
Requires-Dist: attrs==25.1.0; extra == "dev"
Requires-Dist: babel==2.17.0; extra == "dev"
Requires-Dist: certifi==2025.1.31; extra == "dev"
Requires-Dist: chardet==5.2.0; extra == "dev"
Requires-Dist: charset-normalizer==3.4.1; extra == "dev"
Requires-Dist: click==8.1.8; extra == "dev"
Requires-Dist: colorama==0.4.6; extra == "dev"
Requires-Dist: coloredlogs==15.0.1; extra == "dev"
Requires-Dist: deprecated==1.2.18; extra == "dev"
Requires-Dist: docutils==0.21.2; extra == "dev"
Requires-Dist: fastapi==0.115.8; extra == "dev"
Requires-Dist: fastcore==1.7.29; extra == "dev"
Requires-Dist: ffmpy==0.5.0; extra == "dev"
Requires-Dist: filelock==3.17.0; extra == "dev"
Requires-Dist: filetype==1.2.0; extra == "dev"
Requires-Dist: flatbuffers==25.1.24; extra == "dev"
Requires-Dist: frozenlist==1.5.0; extra == "dev"
Requires-Dist: fsspec==2025.2.0; extra == "dev"
Requires-Dist: ghapi==1.0.6; extra == "dev"
Requires-Dist: gradio==5.15.0; extra == "dev"
Requires-Dist: gradio-client==1.7.0; extra == "dev"
Requires-Dist: greenlet==3.1.1; extra == "dev"
Requires-Dist: h11==0.14.0; extra == "dev"
Requires-Dist: httpcore==1.0.7; extra == "dev"
Requires-Dist: httpx==0.28.1; extra == "dev"
Requires-Dist: huggingface-hub==0.28.1; extra == "dev"
Requires-Dist: humanfriendly==10.0; extra == "dev"
Requires-Dist: idna==3.10; extra == "dev"
Requires-Dist: imageio==2.37.0; extra == "dev"
Requires-Dist: imagesize==1.4.1; extra == "dev"
Requires-Dist: jinja2==3.1.5; extra == "dev"
Requires-Dist: jsonschema==4.23.0; extra == "dev"
Requires-Dist: jsonschema-specifications==2024.10.1; extra == "dev"
Requires-Dist: lazy-loader==0.4; extra == "dev"
Requires-Dist: llvmlite==0.44.0; extra == "dev"
Requires-Dist: lxml==5.3.0; extra == "dev"
Requires-Dist: markdown-it-py==3.0.0; extra == "dev"
Requires-Dist: markupsafe==2.1.5; extra == "dev"
Requires-Dist: mdit-py-plugins==0.4.2; extra == "dev"
Requires-Dist: mdurl==0.1.2; extra == "dev"
Requires-Dist: mpmath==1.3.0; extra == "dev"
Requires-Dist: multidict==6.1.0; extra == "dev"
Requires-Dist: myst-parser==4.0.0; extra == "dev"
Requires-Dist: networkx==3.4.2; extra == "dev"
Requires-Dist: numba==0.61.0; extra == "dev"
Requires-Dist: numpy==2.1.3; extra == "dev"
Requires-Dist: onnxruntime==1.20.1; extra == "dev"
Requires-Dist: opencv-python==4.11.0.86; extra == "dev"
Requires-Dist: opencv-python-headless==4.11.0.86; extra == "dev"
Requires-Dist: orjson==3.10.15; extra == "dev"
Requires-Dist: packaging==24.2; extra == "dev"
Requires-Dist: pandas==2.2.3; extra == "dev"
Requires-Dist: papersizes==0.6.1; extra == "dev"
Requires-Dist: pikepdf==9.5.2; extra == "dev"
Requires-Dist: pillow==11.1.0; extra == "dev"
Requires-Dist: platformdirs==4.3.6; extra == "dev"
Requires-Dist: playwright==1.50.0; extra == "dev"
Requires-Dist: pooch==1.8.2; extra == "dev"
Requires-Dist: propcache==0.2.1; extra == "dev"
Requires-Dist: protobuf==5.29.3; extra == "dev"
Requires-Dist: pydantic==2.10.6; extra == "dev"
Requires-Dist: pydantic-core==2.27.2; extra == "dev"
Requires-Dist: pydub==0.25.1; extra == "dev"
Requires-Dist: pyee==12.1.1; extra == "dev"
Requires-Dist: pygments==2.19.1; extra == "dev"
Requires-Dist: pymatting==1.1.13; extra == "dev"
Requires-Dist: pypdf2==3.0.1; extra == "dev"
Requires-Dist: pyreadline3==3.5.4; extra == "dev"
Requires-Dist: pyside6==6.8.2.1; extra == "dev"
Requires-Dist: pyside6-addons==6.8.2.1; extra == "dev"
Requires-Dist: pyside6-essentials==6.8.2.1; extra == "dev"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "dev"
Requires-Dist: python-multipart==0.0.20; extra == "dev"
Requires-Dist: pytz==2025.1; extra == "dev"
Requires-Dist: pyyaml==6.0.2; extra == "dev"
Requires-Dist: rectpack==0.2.2; extra == "dev"
Requires-Dist: referencing==0.36.2; extra == "dev"
Requires-Dist: rembg==2.0.62; extra == "dev"
Requires-Dist: reportlab==4.3.0; extra == "dev"
Requires-Dist: requests==2.32.3; extra == "dev"
Requires-Dist: rich==13.9.4; extra == "dev"
Requires-Dist: rpds-py==0.22.3; extra == "dev"
Requires-Dist: ruff==0.9.5; extra == "dev"
Requires-Dist: safehttpx==0.1.6; extra == "dev"
Requires-Dist: scikit-image==0.25.1; extra == "dev"
Requires-Dist: scipy==1.15.1; extra == "dev"
Requires-Dist: semantic-version==2.10.0; extra == "dev"
Requires-Dist: shellingham==1.5.4; extra == "dev"
Requires-Dist: shiboken6==6.8.2.1; extra == "dev"
Requires-Dist: six==1.17.0; extra == "dev"
Requires-Dist: sniffio==1.3.1; extra == "dev"
Requires-Dist: snowballstemmer==2.2.0; extra == "dev"
Requires-Dist: sphinx==8.1.3; extra == "dev"
Requires-Dist: sphinx-autobuild==2024.10.3; extra == "dev"
Requires-Dist: sphinx-rtd-theme==3.0.2; extra == "dev"
Requires-Dist: sphinxcontrib-applehelp==2.0.0; extra == "dev"
Requires-Dist: sphinxcontrib-devhelp==2.0.0; extra == "dev"
Requires-Dist: sphinxcontrib-htmlhelp==2.1.0; extra == "dev"
Requires-Dist: sphinxcontrib-jquery==4.1; extra == "dev"
Requires-Dist: sphinxcontrib-jsmath==1.0.1; extra == "dev"
Requires-Dist: sphinxcontrib-qthelp==2.0.0; extra == "dev"
Requires-Dist: sphinxcontrib-serializinghtml==2.0.0; extra == "dev"
Requires-Dist: starlette==0.45.3; extra == "dev"
Requires-Dist: svgwrite==1.4.3; extra == "dev"
Requires-Dist: sympy==1.13.3; extra == "dev"
Requires-Dist: tabulate==0.9.0; extra == "dev"
Requires-Dist: tifffile==2025.1.10; extra == "dev"
Requires-Dist: toml==0.10.2; extra == "dev"
Requires-Dist: tomlkit==0.13.2; extra == "dev"
Requires-Dist: tqdm==4.67.1; extra == "dev"
Requires-Dist: typer==0.15.1; extra == "dev"
Requires-Dist: typing-extensions==4.12.2; extra == "dev"
Requires-Dist: tzdata==2025.1; extra == "dev"
Requires-Dist: urllib3==2.3.0; extra == "dev"
Requires-Dist: uv==0.5.29; extra == "dev"
Requires-Dist: uvicorn==0.34.0; extra == "dev"
Requires-Dist: watchdog==6.0.0; extra == "dev"
Requires-Dist: watchfiles==1.0.4; extra == "dev"
Requires-Dist: websockets==14.2; extra == "dev"
Requires-Dist: wrapt==1.17.2; extra == "dev"
Requires-Dist: yarl==1.18.3; extra == "dev"
Dynamic: home-page

# TokenPDF: Generate printable PDFs for RPG tokens and map

**TokenPDF** is a lightweight Python library for creating printable PDF files containing RPG tokens and (possibly large) maps. It simplifies the process of generating monster-tokens, and fragmenting maps into printable pages, while minimizing the number of papers required.
The library is fully configureable.

![Example output](images/example_output.png)  

---
## Changelog

See the [Changelog](CHANGELOG.md) for details on recent changes.

## Getting Started

### Installation

#### From PyPI
To install, use one of the following commands:
```bash
pip install tokenpdf
pip install tokenpdf[full]
pip install tokenpdf[full-gpu]
```
See below for more details on the installation options.

##### Core
Contains the core functionality of the library, including token generation and map fragmentation, and rendering to .svg files, and conversion to pdf using rsvg-convert executable.
```bash
pip install tokenpdf
```
##### PDF
For other PDF backends, add the `pdf-rl`, `pdf-qt`, and/or `pdf-pr` extras:
- `pdf-rl`: PDF output using reportlab (default)
  - ```pip install tokenpdf[pdf-rl]```
- `pdf-qt`: PDF output using PySide6 (Qt)
  - ```pip install tokenpdf[pdf-qt]```
- `pdf-pr`: PDF output using playwright
  - ```pip install tokenpdf[pdf-pr]```
  - Note: `playwright install` is required to be run before using the playwright backend.

##### Image Filters
The `rembg` package is used for background removal. To install it, use either the `cpu` or `gpu` extras:
```bash
pip install tokenpdf[cpu]
```
The `gpu` extra will install `onnxruntime-gpu`. See that package for details about system requirements.

##### Full Installation
To install all extras, use either the `full` or the `full-gpu` extras:
```bash
pip install tokenpdf[full]
```
For CPU-based and GPU-based installations, respectively.



#### From source

```bash
git clone https://github.com/Dormat2/tokenpdf.git
cd tokenpdf
pip install -r requirements.txt
```

---

### Command-Line Interface

The library provides both a command-line interface and a Python API. The CLI is the easiest way to get started.

```bash
python -m tokenpdf <config_files> [-o OUTPUT] [-v] [-s]
```

- `config_files`: One or more configuration files in TOML, JSON, YAML, or INI format. See examples below, or [Configuration Reference](CONFIGURATION_REFERENCE.md) for more details. Can only be omitted if `-e` flag is used.
- `-e`: Use the example configuration file (`tokenpdf/data/example.toml`).
- `-o OUTPUT`: The output PDF file (default: `output.pdf`). If ommited, the output name is derived from the first configuration file.
- `-v`: Enable verbose output.
- `-s`: Silence most output.

Example usage:

```bash
python -m tokenpdf example.toml -o my_tokens.pdf -v
```

---

## Writing Configuration Files

Configurations define your monsters, their tokens, the maps, and the pdf layout and generation process. 

### Minimal Configuration: Single Token

#### TOML Example

```toml
output = "single_token.pdf"

[monsters.circle]
name = "Circle Token"
size = "Medium"
image_url = "https://picsum.photos/200"
tokens = [
    { type = "circle", size = "medium", count = 1 }
]
```

#### JSON Example

```json
{
  "output": "single_token.pdf",
  "monsters": {
    "circle_token": {
      "name": "Circle Token",
      "size": "Medium",
      "image_url": "https://picsum.photos/200",
      "tokens": [
        { "type": "circle", "size": "medium", "count": 1 }
      ]
    }
  }
}
```

---

### Adding Features Step-by-Step

#### 1. **Multiple Tokens for a single monster**
Add multiple tokens for the same monster:

**TOML Example**
```toml
[monsters.circle_token]
name = "Circle Token"
size = "Medium"
image_url = "https://picsum.photos/200"
tokens = [
    { type = "circle", size = "medium", count = 5 }
]
```

**JSON Example**
```json
{
  "monsters": {
    "circle_token": {
      "name": "Circle Token",
      "size": "Medium",
      "image_url": "https://picsum.photos/200",
      "tokens": [
        { "type": "circle", "size": "medium", "count": 5 }
      ]
    }
  }
}
```

Add a standing token for the same monster:

**TOML Example**
```toml
[monsters.circle_token]
name = "Circle Token"
size = "Medium"
image_url = "https://picsum.photos/200"
tokens = [
    { type = "circle", size = "small", count = 5 },
    { type = "standing", size = "medium", count = 5 }
]
```
Note: The `size` field is used to determine the token's dimensions in relation to the page size and the system (default: D&D5e) grid sizing (can be overriden). The size can be specified in the monster's configuration, and/or overriden in the token's configuration.

---

#### 2. **Customizing Token Appearance**
Scaling:

**TOML Example**
```toml
[monsters.circle_token]
name = "Circle Token"
size = "Medium"
image_url = "https://picsum.photos/200"
tokens = [
    { type = "circle", size = "medium", count = 5, scale = 1.1, scale_rho = 0.1 }
]
```

**JSON Example**
```json
{
  "monsters": {
    "circle_token": {
      "name": "Circle Token",
      "size": "Medium",
      "image_url": "https://picsum.photos/200",
      "tokens": [
        { "type": "circle", "size": "medium", "count": 5, "scale": 1.1, "scale_rho": 0.1 }
      ]
    }
  }
}
```
In this example, the `scale` field scales the token's size. The scale is determined by a log-normal distribution around `1.1`, with a standard deviation of `0.1`. This provides a more natural variation in token sizes. Omitting `scale_rho` will set the scale to a fixed value (`1.1`)

---

## Global Settings

Customize the entire output, page, and layout behavior. Here’s how to configure some global settings.

#### **1. Output File**
Specify the name of the PDF file:

**TOML**
```toml
output = "my_custom_tokens.pdf"
```

**JSON**
```json
{
  "output": "my_custom_tokens.pdf"
}
```

---

#### **2. Page Settings**
Define the paper size, orientation, and margins:

**TOML**
```toml
# General configuration
output = "wsc_{ps}.pdf"
verbose = true
system = "D&D 5e"
compress = true

# Paper settings
page_size = ["A2", "A3", "A4"]
orientation = "portrait"
margin = 0.05
optimize_images_for_dpi = 100
optimize_images_for_quality = 80

# Layout settings
rotation = true
```

**JSON**
```json
{
  "output": "wsc_{ps}.pdf",
  "verbose": true,
  "system": "D&D 5e",
  "compress": true,
  "page_size": ["A2", "A3", "A4"],
  "orientation": "portrait",
  "margin": 0.05,
  "optimize_images_for_dpi": 100,
  "optimize_images_for_quality": 80,
  "rotation": true
}
```

---

#### **3. Layout Options**
Enable token rotation for better page utilization:

**TOML**
```toml
rotation = true
```

**JSON**
```json
{
  "rotation": true
}
```

#### **4. Reference**
For a full reference of all available settings, see the [Configuration Reference](CONFIGURATION_REFERENCE.md).

---

### Screenshots

- Example configuration:  
  ![Example Configuration Screenshot](images/config_example.png)

- Generated PDF:  
  ![Generated PDF Screenshot](images/output_example.png)

---

## Contributing

Contributions are welcome! Feel free to submit issues or pull requests via GitHub.  

