同一本书,为什么 EPUB 比 PDF 小?
从 EPUB 与 PDF 出发,理解内容表示、图片、字体、压缩与编辑历史如何影响文件体积。
同一本书,EPUB 只有几 MB,PDF 却有上百 MB。文字明明一样,差出来的空间用在哪里了?
一个常见解释是:EPUB 保存内容,PDF 保存排版。这个解释抓住了两者的设计差异,却容易让人误以为,固定排版本身就要多占几十倍空间。
更大的差别往往是:一个文件保存了文字,另一个文件保存的是整页文字的图像。 字体、图片精度和压缩方式又会把差距拉大。同样叫 PDF,内部装的东西可以很不一样;同样叫 EPUB,也未必小。
先分清:保存文字,还是保存文字的样子
假设书里有一句话:“今天适合读书。”
在常见的流式 EPUB 中,它可以作为一段 XHTML 正文保存,样式文件再规定标题、段落和缩进。阅读器打开文件后,根据屏幕大小、字号和字体重新断行、分页。EPUB 把这些正文、样式、图片和必要的目录信息打包到一个 ZIP 容器中。W3C EPUB 规范
文字型 PDF 则会描述这句话在页面上的绘制方式,比如使用哪个字体、字号多大、从哪个位置开始显示。它不必把每个字都变成图片,也不必为每个字单独写一条完整指令。文字、线条、曲线和图像可以共同组成一页,相关数据也能压缩。Adobe PDF Reference,第 2.3 节
所以,固定排版不等于截图。一本直接从排版软件导出的文字型 PDF,即使页数很多,也可能很紧凑。页面结构和定位数据确实占空间,但仅凭“它固定排版”,无法解释一个具体文件为什么大了上百倍。
扫描版是另一回事。扫描仪并不知道纸上写了什么,它先记录纸面的像素,包括文字边缘、纸张底色、污点和阴影。读者看到的仍是一句话,文件保存的却是一块图像。
同样显示 BOOK,文件里可以保存不同的东西:
+-- 流式 EPUB
| "BOOK" + 段落样式
| -> 阅读器负责断行、分页
|
+-- 文字型 PDF
| "BOOK" + 字体 + 页面坐标
| -> 按指定位置绘制文字
|
+-- 扫描 PDF
+-----------------------+
| |
| ### ## ## # # |
| # # # # # # # # |
| ### # # # # ## |
| # # # # # # # # |
| ### ## ## # # |
| |
+-----------------------+
整页像素,包括文字、底色和噪点
图中只示意正文的保存方式,不代表固定的体积排名;图片、字体和压缩方式仍会影响实际大小。
假设一本小说有十万个字,纸质书排了 300 页。做成流式 EPUB 时,主要保存正文和段落规则,阅读器负责把文字排成页面;逐页扫描时,则要保存 300 页的图像。假设每页扫描图压缩后平均占 500 KB,仅图像就约有:
300 页 × 500 KB/页 = 150 MB
这里按十进制单位计算,是为了说明量级,不是实际测量,也不是说扫描书每页都有固定大小。它解释的是:为什么相同的文字内容,保存成整页图像后,体积可能增加很多。
给扫描 PDF 加上 OCR,也不一定会明显缩小文件。OCR 是识别图像中的文字;如果输出方式是在原图上叠加可搜索的文字层,扫描图仍然留着,文件甚至可能略微变大。只有进一步重建正文、处理或替换原图,保存内容的方式才真正改变。Adobe 对可搜索图像 OCR 的说明
反过来,EPUB 也能装进大量整页图片。漫画、画册或固定版式电子书,并不会因为扩展名换成 .epub 就自动变小。EPUB 规范本身就支持固定版式,它并不只是一种流式文字格式。W3C EPUB 版式控制
图片决定大头,字体决定是否还要随书带一套字形
即使都是扫描 PDF,体积也能相差很多,因为“扫描一页”没有唯一的精度。
在纸张大小不变的情况下,把扫描分辨率从 150 dpi 提高到 300 dpi,横向和纵向的采样点都增加一倍,像素总数就变成四倍。彩色、灰度、黑白二值图所需的数据量也不同。最终文件还受压缩影响,不能直接断言体积也一定变成四倍,但原始数据规模已经变了。
图片内容也有影响。干净的白底文字与带有纸纹、噪点的彩色扫描,即使像素尺寸相同,压缩后的大小也可能不同。保留印刷细节和只供手机阅读,对图片精度的要求本来就不一样。Adobe 的 PDF 优化设置因此把降低图片分辨率、选择压缩方式和调整质量分成了不同选项。Adobe PDF 图片优化设置
字体解决的是另一个问题:文件里记录了一个字,不代表另一台电脑知道该把这个字画成什么样。比如,一张邀请函只有两页、几十个字,却使用了特殊的中文字体。为了让接收者也看到同样的字形,文件可能需要把字体数据一起带上。这时,字体占用的空间可能比正文数据还多,页数少也不保证文件小。
如果 EPUB 使用阅读器已有的字体,书里就不必再附带字体文件。代价是,换一个设备或阅读器,文字的外观可能变化。为了保留指定字形,PDF 常会嵌入字体;EPUB 也可以这样做。这不是两种格式的绝对分界。
嵌入字体还有“整套带上”和“只带用到的字形”之分,后者叫字体子集化。邀请函只用了几十个字,就可以只附带所需字形,不必总把整套字体放进去。对于字形数量较多的中文字体,这个区别尤其值得检查。字体资源还可以供多页共用,并不需要每一页各带一份。Adobe 字体嵌入说明
因此,“PDF 有字体,所以一定很大”仍然不够准确。要看它嵌入了多少字体、是否做了子集化,以及导出程序有没有合理复用资源。
EPUB 有 ZIP,PDF 也不是不压缩
EPUB 使用 ZIP 打包,很容易让人把体积差归结为“一个压缩了,一个没有”。PDF 同样支持对文字、图形和图片数据进行压缩,只是组织方式不同。
压缩能省多少,取决于原来的数据。正文和标记中有重复模式,通常能通过无损压缩缩小。已经压缩过的 JPEG 图片,再套一层 ZIP,往往省不了多少,有时还会因为包装开销略微变大。
这里还要区分两种“变小”。无损压缩允许恢复原来的数据;有损压缩则舍弃一部分信息,换取更小体积。降低扫描分辨率、降低 JPEG 质量,都可能损失细节,不能笼统叫作无损优化。MDN 图片格式指南
把扫描书重建成以文字为主的 EPUB,体积可能明显下降,但这也不只是换了一种压缩算法。纸张纹理、原始版面和部分细节可能不再保留,识别和重排还可能引入错字、公式错误或阅读顺序问题。文件变小了,不代表原来的信息被完整保留。
换成其他格式,仍然可以沿着这个思路看
离开电子书,类似的差异随处可见。与其记住“哪种扩展名更小”,不如看格式如何表示内容、附带了哪些资源,以及允许丢掉什么。
TXT 与 DOCX:结构更多,也可能因为压缩而更小
假设把同一篇长文章分别存成 TXT 和 DOCX。TXT 通常直接保存编码后的文字;DOCX 除了正文,还会保存样式等结构,但这些部分会放进 ZIP 压缩包。正文较长、重复模式较多时,压缩收益可能超过新增结构的开销,因此不能断言 TXT 一定更小。反过来,只有几个字的短文档,DOCX 的额外结构就可能更显眼。微软 Open XML 文档
比较文档时,还需要确认资源是否包含在文件内。比如,单个 Markdown 文件可能只是引用了一张外部图片,而 DOCX 把图片直接嵌进去了。只比较两个文件本身,就把外部资源的体积漏算了。要比较完整交付的大小,应该把被引用、需要一同交付的资源也算上。
SVG 与 PNG:画一个圆,还是记录一张像素图
假设要保存一张白底红圆图。SVG 可以用圆心、半径和颜色描述这个圆;PNG 保存的则是像素图像。把概念简化后,两者的区别是:
SVG:圆心 (1000, 1000),半径 800,填充红色
|
v
显示时绘制这个圆
PNG:保存整个画布的像素图像
|
v
解码后得到各位置的颜色
一张 2000 × 2000、每像素 3 字节的 RGB 图像,不计其他开销,未压缩像素数据约有 12 MB。把宽高都扩大一倍,像素总数就增加到四倍;SVG 的几何描述却不必因此增加四倍。
不过,12 MB 并不是最终 PNG 文件的大小,白底和纯色区域通常能被有效压缩。SVG 也不是始终更小:如果要用大量路径描出一张森林照片,描述就可能很复杂;如果直接内嵌位图,也没有消除图像数据。MDN 图片格式指南中的 SVG 说明
PNG 与 JPEG:照片和代码截图,不能只比谁更小
再看两张像素尺寸相同的图片:一张是天空、树木和人像组成的照片,另一张是白底黑字的代码截图。常见 JPEG 编码会舍弃部分细节来缩小体积,照片中的一些变化可能不容易察觉;同样的有损压缩放到代码截图上,却可能让字边出现模糊和杂色。PNG 无损保存像素,通常更适合保留这类锐利边缘。MDN 对 JPEG 与 PNG 的说明
这里比较的还包括损失是否可以接受。扫描书也是如此:压缩后正文看着还清楚,不代表小字、公式和图表的细节都保住了。
都是 MP4,体积也可以相差四倍
视频则提醒我们,再多分清一层:容器不等于编码方式。 MP4 主要规定音视频轨道和相关信息怎样组织;同样的 MP4 文件,可以使用不同编码和参数,不能仅凭 .mp4 判断它的压缩程度。MDN 媒体容器说明
码率表示单位时间用了多少数据。可以用“时长 × 音视频总平均码率 ÷ 8”估算媒体数据的字节数:时长按秒、码率按 bit/s 计,除以 8 是把比特换成字节。
假设两个 MP4 都长 10 分钟,视频轨道的平均码率分别是 2 Mb/s 和 8 Mb/s。暂时不计音频和封装开销,按十进制单位计算:
视频 A:600 秒 × 2 Mb/s ÷ 8 = 150 MB
视频 B:600 秒 × 8 Mb/s ÷ 8 = 600 MB
扩展名和时长相同,仅码率这一项就能带来四倍差距。分辨率、帧率、画面复杂度和编码设置,会影响达到某种画质所需的码率。所以,“都是 MP4”甚至“都是 1080p”,也不足以推出文件大小应该接近。
还有一个容易漏掉的原因:旧数据可能没有被删掉
前面讨论的是文件需要保存什么,但文件还可能保存着当前页面已经不用的东西。
PDF 支持增量更新。软件保存修改时,可以保留原文件,把新增或修改的对象以及索引追加到末尾,而不是每次重写整个文件。这样能减少一次保存需要写入的数据,却也意味着旧内容可能继续占着空间。Adobe PDF Reference,第 5.6 节
比如,一个 PDF 原来有 20 MB,删掉一半页面后保存,并不保证变成 10 MB。一方面,各页的数据量未必相同,字体等资源也可能由多页共用;另一方面,如果这次保存使用增量更新,旧数据还可能留在原处:
保存前:[ 原始文件:20 MB ]
保存后:[ 原始文件:20 MB ][ 追加的修改对象和索引 ]
|
v
阅读器不再显示被删的页面
当前页面不再引用旧对象,并不等于旧对象的字节已经从文件中移除。于是文件可能没明显缩小,甚至因追加修改而略微变大。是否发生这种情况,取决于软件的保存方式,不能说每个 PDF 都如此。
这个原因与图片太大不同:图片太大,是正在使用的数据本来就多;编辑残留,则是当前显示不再需要的数据还留在文件里。重写文件并清理未使用对象,有时可以缩小体积,但不能保证具体能省多少。原理也不限于 PDF:支持追加写入或保留历史的文件、数据存储,都可能出现“逻辑上删除了,物理空间还没释放”的情况。
这也意味着,普通删除或遮盖内容不能当成可靠的敏感信息清除方式。看不见与文件里不存在,是两件事。
判断体积之前,先确认比较的是什么
回到开头,同一本书的 EPUB 和 PDF 差很多,可以先看:正文是文字还是扫描图;图片保留了多少精度;字体和其他资源是否内嵌;保存过程中有没有留下重复或不再使用的数据。需要定位某个 PDF 的具体原因时,查看各类对象的空间占用,比只看总大小更直接。Adobe 空间使用审计说明
文件体积取决于实际保存了哪些数据,以及这些数据怎样表示和压缩。 格式会影响这些选择,却不会替所有文件作出同一种选择。两份文件看起来相似,也可能一个保留了原始图像和版面,另一个只留下可供阅读的正文;一个把资源全部带上,另一个依赖设备或外部文件。
先弄清楚这些差别,才能判断多出来的空间是必要内容、质量要求,还是可以清理的冗余。否则,把一个大文件转成另一个小文件,可能省掉的恰好是原本需要保留的东西。