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
AI短剧越来越low,为什么?
随笔从AI短剧的观感变化聊起,谈谈剧情和人物到底决定了什么。用《简·爱》当例子,说说情感主题和反套路怎么落地。
2
把 Aemeath 的站点统计页移植到 Firefly
博客搭建记录把 Aemeath 主题的公开站点统计页 /analytics 移植到 Firefly 博客主题的过程:Umami 公开分享接口、Waline 最新评论、GitHub 推送热力图与侧栏统计快照组件的适配记录。
3
dsh-fs-link2symlink-fix:一个插件修好 dsh 在 PRoot 下 write 丢文件
开源dsh 的 write 工具在 Termux/PRoot 里新建文件只留一个悬空的 .l2s 符号链接,内容直接蒸发。排查到 PRoot 的 --link2symlink 把 link(2) 仿真坏了,于是写了个零依赖插件在发布原语上把它兜住。
4
随机封面修复记:同一篇文章,列表和详情页竟然两张图
blog博客列表页和文章详情页的随机封面每次都不一样,排查后发现是图床 /random 接口不支持种子参数。记录用"构建期固定封面"彻底解决这个问题的过程。
5
怎么让 dsh 搜索用上 Exa 插件
运维dsh 基础包把 web 行的 searchProvider 钉死为 deepseek-official,导致搜索插件的"零配置自动接管"不会生效;本文记录排查过程与 profile 补丁层的修复方法。2026-10-05 勘误:profile 补丁层是整值替换而非合并,web 行必须把 fetchProvider 一并写上。
随机文章随机推荐



