kindle-pdf-cropper
自动剪裁 PDF 四周白边与页眉/页脚、为 Kindle 生成阅读优化 PDF/EPUB 的命令行工具。
- 剪掉每页四周白边 + 页眉/页脚 + 页码,只保留正文内容;
- 可选
--split:把每页上下切成两页,输出横版页面,Kindle 横屏阅读字号接近翻倍;- 默认(自适应切分):不指定重叠参数时,程序自动把切线放在两行文字之间的空白处—— 文字型 PDF 用文本行 bbox 找行间空隙,扫描型 PDF 用图像识别算法找两行之间的空白带—— 因此不会切断任何一行,也不需要重叠区域;
- 也可以显式指定
--split-overlap-*恢复"中线切分 + 两页重叠"的旧模式;
- 自适应文字型与扫描图片型 PDF;输出结果保持原样——文字仍是文字、 扫描图仍是扫描图,文字/公式/表格的排版完全不变,只做整页剪裁与切分;
- 输出 PDF(文字/矢量/图片保真)或 EPUB(固定版式,排版不重排)。
技术选型调研见 docs/research.md,算法设计见 docs/design.md。
安装
要求 Python ≥ 3.10。
cd kindle-pdf-cropper
python -m venv .venv
.venv\Scripts\activate # Windows
# source .venv/bin/activate # Linux / macOS
pip install -e .
快速开始
# 只裁白边和页眉页脚,输出 PDF(默认)
kindle-crop 书.pdf
# 裁切 + 上下切分成横版两页(自适应:切线自动落在两行文字之间的空白处,不切行)
kindle-crop 书.pdf --split -o out/书_横版
# 旧模式:中线切分 + 两页重叠(需要指定重叠参数)
kindle-crop 书.pdf --split --split-overlap-pt 20 -o out/书_横版
# 同时输出 PDF 和 EPUB(自动:文字页=SVG,扫描页=位图)
kindle-crop 书.pdf --format both -o out/书
# 扫描件:调大安全边距、提高 EPUB 位图质量
kindle-crop 扫描.pdf --padding 10 --epub-dpi 220 --format epub
# 调试:把每页的分析叠加图(裁剪框/页眉页脚带/切分框)导出成 PNG
kindle-crop 书.pdf --debug-dir debug
常用参数
| 参数 | 默认 | 说明 |
|---|---|---|
--format pdf|epub|both |
pdf |
输出格式 |
--split |
关 | 每页上下切成两页横版 |
--split-overlap-pt |
—(自适应) | 指定后启用"中线切分+重叠":两页最小重叠(点) |
--split-overlap-ratio |
—(自适应) | 指定后启用"中线切分+重叠":重叠 = max(比例×裁剪高, 最小点数) |
--padding |
6 |
内容框外保留的安全边距(点) |
--no-header-footer |
关 | 只裁边距,不删除页眉/页脚/页码 |
--epub-mode image|svg|auto |
auto |
文字页→SVG,扫描页→位图 |
--epub-dpi |
200 |
EPUB 位图分辨率 |
--epub-image-format jpeg|png |
jpeg |
EPUB 位图格式 |
--analysis-dpi |
144 |
分析用渲染分辨率 |
--debug-dir DIR |
— | 导出每页分析叠加图 |
-o PATH |
输入名+_cropped |
输出路径(both 时自动补 .pdf/.epub) |
自适应切分说明(--split)
不指定 --split-overlap-* 时,切分线按如下方式自动确定:
- 文字型 PDF:取裁剪区内所有文本行 bbox,找出相邻两行之间宽度足够的空白间隙 (≥ 0.4 × 中位行高),选择离页面垂直中线最近的间隙,把切线放在该间隙正中 ——上一行完整保留在上半页,下一行完整保留在下半页,中间无重叠也不丢内容;
- 扫描型 PDF:用图像识别算法对裁剪区做行投影,找到连续"无墨水行"的空白带 (行与行之间的空白),取离中线最近的空白带,把切线放在空白带正中;
- 若页面附近不存在可用的空白带(例如旋转 90° 的扫描页、文字带接近满页), 退化为在中线处切分,保证上下两页尺寸均衡。
指定 --split-overlap-* 后恢复旧模式:在中线切分,两页保留
max(比例×裁剪高, 最小点数) 的重叠,保证中线附近的一行不会显示不全。
输出说明
- PDF 输出:每个输出页的页面尺寸就是裁剪后的尺寸(物理裁剪,而非仅改 CropBox, 任何阅读器都稳定显示);文字保持可选中的文字,表格线/公式等矢量、嵌入字体原样保留; 目录与元数据保留。
- EPUB 输出:EPUB 是流式重排容器,若要保持排版不变只能用固定版式:
每页钉死一个 viewport。
- 文字页 → 内联 SVG(文字仍为文字,矢量图形保留);
- 扫描页 → 整页 JPEG/PNG 位图;
- 若你的阅读器对 SVG/固定版式支持不佳(如部分 Kindle 固件),请用
--epub-mode image或直接使用 PDF 输出。
示例文件
examples/ 下有生成的样例(文字型、扫描型、旋转扫描型):
运行 python tests/make_samples.py text examples/sample_text.pdf 等重新生成。
开发与测试
pip install -e .[dev]
python -m pytest
测试覆盖:边距/页眉页脚分析、扫描与旋转页、PDF 输出文字保真、切分重叠、 自适应切分(文字行间 / 扫描空白带 / 旋转页退避)、EPUB 结构与内容校验、CLI 端到端。
许可
MIT,见 LICENSE。
Metadata
Release files for kindle-pdf-cropper 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| kindle_pdf_cropper-0.1.0.tar.gz | 29.7 kB | Without provenance | Details for kindle_pdf_cropper-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| kindle_pdf_cropper-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for kindle_pdf_cropper-0.1.0-py3-none-any.whl |
Total release size: 55.0 kB
Release files / kindle_pdf_cropper-0.1.0.tar.gz
| Download URL | kindle_pdf_cropper-0.1.0.tar.gz |
|---|---|
| Size | 29.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
081ae6ec61b0944829d00ff43bd714f33746da03f68811759b92e7fad103d828
|
|
BLAKE2b-256 checksum How to use checksums |
2f87753a773a3f7f38f94577143cb3bc085cda3d4aa040245ee3fd56067a315a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Release files / kindle_pdf_cropper-0.1.0-py3-none-any.whl
| Download URL | kindle_pdf_cropper-0.1.0-py3-none-any.whl |
|---|---|
| Size | 25.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
290425c23fac649556bf62f8dead7503b2a98ea75f2a87877cb8374f328d06a6
|
|
BLAKE2b-256 checksum How to use checksums |
e106cea09601d05ec53b02a2097787b5ef533b0b29ac5dd38f90c7173642d474
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Security for kindle-pdf-cropper 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.