You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:24:46