Mobi 转 PDF 完整指南
671 字
3 分钟
Mobi 转 PDF 完整指南
前言
MOBI 是 Kindle 的经典格式,但有时候需要转成 PDF 方便在其他设备上阅读。直接转换往往会出现图片被挤压、页面大片空白的问题。本文记录了我从实战中总结出的正确转换方法。
问题:直接转 PDF 为什么会乱?
用 ebook-convert 直接 MOBI → PDF 时,Calibre 会用 QtWebEngine 渲染 HTML 内容,再输出为 PDF。MOBI 文件里的图片通常是窄长的竖版(比如 900×1280),但默认的 PDF 页面是 Letter 尺寸(612×792),渲染时图片就被挤到页面一侧,另一边全是空白。
❌ 错误效果:┌──────────────┐│ ││ [图片] │ ← 图片只占右边,左边大片空白│ │└──────────────┘解决方案:MOBI → EPUB → PDF
核心思路是分两步走:先转 EPUB 提取原始图片,再用 Python/PIL 从图片生成 PDF,这样可以保持原始宽高比。
第一步:安装 Calibre
sudo apt-get install -y calibre如果你遇到依赖问题,可以先修复:
sudo apt-get install -f第二步:MOBI → EPUB
QTWEBENGINE_DISABLE_SANDBOX=1 ebook-convert "输入.mobi" "/tmp/输出.epub"注意:加上
QTWEBENGINE_DISABLE_SANDBOX=1可以避免在无头环境中崩溃。
第三步:从 EPUB 提取图片生成 PDF
EPUB 本质是一个 ZIP 包,里面包含所有图片。用 Python 脚本逐页提取:
import zipfile, osfrom PIL import Imageimport io
with zipfile.ZipFile("输出.epub") as z: imgs = sorted([n for n in z.namelist() if n.endswith(('.jpg','.jpeg','.png'))]) pil_images = [Image.open(io.BytesIO(z.read(n))).convert('RGB') for n in imgs] pil_images[0].save("输出.pdf", 'PDF', save_all=True, append_images=pil_images[1:], resolution=150.0)这样生成的 PDF 每一页都对应一张原始图片,比例不会变形,不会出现空白边距。
批量处理脚本
如果有多个文件,可以写个循环:
cd "mobi文件夹"for f in *.mobi; do QTWEBENGINE_DISABLE_SANDBOX=1 ebook-convert "$f" "/tmp/$(basename "$f" .mobi).epub" 2>/dev/null python3 -c "import zipfile, osfrom PIL import Imageimport ioepub = '/tmp/$(basename "$f" .mobi).epub'pdf = '$f'.replace('.mobi', '.pdf')with zipfile.ZipFile(epub) as z: imgs = sorted([n for n in z.namelist() if n.endswith(('.jpg','.jpeg','.png'))]) pil = [Image.open(io.BytesIO(z.read(n))).convert('RGB') for n in imgs] pil[0].save(pdf, 'PDF', save_all=True, append_images=pil[1:], resolution=150.0) print(f'{pdf}: {len(pil)} pages')"donerm -f /tmp/*.epub实际效果
我用这套方法转换了《金牌得主》的 12 本 MOBI(共约 2300 页),每本 PDF 都完美保持了原图比例,没有变形也没有空白边距。
| 转换方式 | 效果 |
|---|---|
| ebook-convert MOBI→PDF | 图片挤在一边,大片空白 |
| MOBI→EPUB→PDF(图片提取) | 原比例呈现,排版正常 |
总结
- 不要直接用
ebook-convert转 PDF,渲染引擎会破坏图片比例 - 走 MOBI → EPUB → 提取图片 → PDF 的路线
- 安装 Calibre 时加上
QTWEBENGINE_DISABLE_SANDBOX=1环境变量 - 用 Python PIL 库从 EPUB 提取图片生成 PDF,保留原始分辨率
这个方法适用于漫画、杂志等以图片为主的 MOBI 文件。如果是纯文字 MOBI,直接转换也问题不大。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
dsh-toolcall-id:一个插件修好 dsh 的历史加载失败
开源dsh Web GUI 重开多步会话时报 "received more than one start Match",排源发现是工具调用 id 每步重号撞车。写了个开源插件挂在官方钩子上修掉它,升级 dsh 不会被覆盖
2
怎么让 dsh 无限重试
运维dsh 默认只会重试 5 次且间隔很快;本文展示通过配置 retryPolicy 为 always,实现指数退避的无限重试。
3
记一次博客收录优化:从 1 个页面到全部可收录
blog分享为博客排查 Google/Bing 收录问题的全过程:canonical 缺失、重复页面判定、meta description 雷同,以及 IndexNow 接入时踩过的各种坑。
4
开源推荐:把 QQ 机器人搬到 Hugging Face 免费跑(AstrBot + NapCat)
AI开源推荐:把 QQ 机器人搬到 Hugging Face 免费跑(AstrBot + NapCat)
5
无服务器部署 AstrBot:Hugging Face 免费方案
Astbot,无服务器把 AstrBot + NapCat 整套机器人塞进 Hugging Face 免费 Docker Space,零服务器成本,配合 GitHub 自动备份防止数据丢失,再加一个 Actions 定时请求防休眠
随机文章随机推荐



