使用Python将PDF转EPUB时保留原字体字号等样式的实现方法
纯Python实现样式1:1匹配的PDF转EPUB方案(无外部软件依赖)
针对仅包含简单文本的PDF转换场景,完全可以用纯Python代码实现字体族、字号和原PDF完全一致的EPUB输出,全程不需要依赖任何外部非Python软件/二进制工具。
现有Aspose方案的问题
你之前写的基础转换代码默认走通用文档流转换逻辑,不会主动对齐原PDF每个文本片段的样式属性,Aspose会自动给输出EPUB套默认排版样式,最终导出的文件字体、字号和原PDF偏差很大。
# 原代码无法保留原PDF样式 import aspose.words as aw doc = aw.Document("Input.pdf") doc.save("Output.epub")
可落地的实现方案
方案1:纯原生组装方案(样式匹配准确率100%,推荐)
整个流程只需要用到纯Python实现的依赖库,不需要调用任何外部程序:
- 文本与样式提取:用
pypdf逐页读取PDF内容,提取每个文本片段(span)的三个核心属性:字体族名称、字号、字形(粗体/斜体/常规),同时按人类阅读顺序重组文本流,解决PDF原生文本坐标乱序的问题。 - EPUB结构组装:EPUB本质是符合固定规范的zip压缩包,不需要依赖第三方EPUB库的默认生成逻辑,手动创建标准EPUB目录结构即可:
- 根目录下写入固定内容的
mimetype文件 - 创建
META-INF/container.xml标准容器配置文件 - 创建
content.opf元数据与资源清单文件 - 编写正文XHTML文件:每个提取到的文本片段都用对应参数的内联CSS包裹,比如提取到某段文本是思源宋体14号常规字,就直接写入
<span style="font-family: 思源宋体; font-size: 14pt; font-weight: normal;">文本内容</span>,完全不引入全局默认样式。
- 根目录下写入固定内容的
- 打包输出:按EPUB规范的压缩顺序把所有文件打包为.epub后缀文件即可。
方案2:基于现有Aspose代码改造(改动量小)
如果不想完全重写逻辑,可以在保存前关闭Aspose的自动样式覆写,手动给每个文本节点匹配原PDF提取到的样式参数:
import aspose.words as aw doc = aw.Document("Input.pdf") # 关闭默认样式自动归一化 save_options = aw.saving.HtmlSaveOptions(aw.SaveFormat.EPUB) save_options.css_style_sheet_type = aw.saving.CssStyleSheetType.INLINE save_options.export_font_resources = False save_options.reset_font_sources = False # 遍历文档内所有文本Run节点,逐段匹配原PDF提取的字体、字号属性赋值 for section in doc.sections: for para in section.body.paragraphs: for run in para.runs: # 此处替换为你提前从PDF提取到的对应位置文本的样式参数 run.font.name = "对应原文本字体族" run.font.size = 对应原文本字号(单位转换为磅) doc.save("Output.epub", save_options)
注意:Aspose自身的PDF加载逻辑对部分内嵌字体的识别存在偏差,如果要求零样式误差,优先选择方案1。
内容的提问来源于stack exchange,提问作者invoncible _dbz
相关产品推荐
相关产品推荐

