python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python代码导出Word

Python读取.py文件源码并导出为Word的完整指南

作者:Eiceblue

在日常技术工作中,我们经常需要把代码整理到 Word 文档里,本文将基于 Free Spire.Doc for Python 免费库讲解该方案,演示从读取 .py 源码文件到生成规范可读 Word 文档的多种实现方式,有需要的可以参考下

在日常技术工作中,我们经常需要把代码整理到 Word 文档里:编写技术方案、输出测试报告、整理学习笔记、归档脚本源码等。如果直接复制粘贴代码到 Word,很容易遇到格式错乱、缩进丢失、无法区分代码样式、批量处理效率低等问题。

借助 Python 文档操作库,我们可以自动化完成代码写入 Word、保留缩进、配置代码样式、批量生成文档等流程。本文将基于 Free Spire.Doc for Python 免费库讲解该方案,演示从读取 .py 源码文件到生成规范可读 Word 文档的多种实现方式。

环境准备

通过 pip 安装免费版:

pip install Spire.Doc.Free

导入时通常需要同时引入核心模块与公共类型:

from spire.doc import *
from spire.doc.common import *

需要提前了解免费版的硬性限制:文档最多 500 个段落和 25 个表格,这意味着它适合中小规模的代码文件或代码片段归档。

下面是最简文档创建模板,也是后续所有代码格式化方案的基础骨架:

doc = Document()
section = doc.AddSection()
paragraph = section.AddParagraph()
paragraph.AppendText("Hello")
doc.SaveToFile("output.docx", FileFormat.Docx2019)
doc.Dispose()

方案一:纯文本逐行写入(等宽字体 + 段落格式)

最直接的方式是将代码文件按行读取,逐行追加到同一段落中,并用 BreakType.LineBreak 换行。关键在于所有代码行必须使用等宽字体(如 Courier New 或 Consolas),否则缩进和对齐会完全失效。

with open("demo.py", "r", encoding="utf-8") as f:
    lines = f.read().split("\n")

doc = Document()
section = doc.AddSection()
para = section.AddParagraph()

for i, line in enumerate(lines):
    run = para.AppendText(line)
    run.CharacterFormat.FontName = "Courier New"
    run.CharacterFormat.FontSize = 10.5
    if i < len(lines) - 1:
        para.AppendBreak(BreakType.LineBreak)

你还可以在此基础上优化阅读体验:给段落设置浅灰色背景 Color.get_WhiteSmoke()、配置多倍行距 LineSpacingRule.Multiple,也可以通过 section.PageSetup 开启行号,方便阅读与打印。

如果希望将样式集中管理,可以用 ParagraphStyle 预先定义代码样式,再通过 ApplyStyle 应用到目标段落:

style = ParagraphStyle(doc)
style.Name = "code"
style.CharacterFormat.FontName = "Consolas"
style.CharacterFormat.FontSize = 10
doc.Styles.Add(style)
para.ApplyStyle("code")

输出效果预览:

方案二:借助 Pygments 实现语法高亮

纯文本方式虽然可靠,但关键字、字符串、注释缺少颜色区分。Pygments 可以将 Python 代码解析为带样式的中间格式,再交给 Free Spire.Doc 渲染。这里有两条可选的路径。

先安装依赖: pip install Pygments

路径 A:RTF 插入(保持可编辑性)

RTF 是 Word 原生支持的富文本格式。Pygments 的 RtfFormatter 生成带颜色和字体控制字的 RTF 字符串,通过 paragraph.AppendRTF() 直接嵌入,输出内容在 Word 中仍然是可选中、可编辑的文本,语法高亮得以保留。

from spire.doc import *
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import RtfFormatter

code = open("demo.py", encoding="utf-8").read()
formatter = RtfFormatter(fontface="Consolas")
rtf_text = highlight(code, PythonLexer(), formatter)
rtf_text = rtf_text.replace(r"\f0", r"\f0\fs24")  # 将字号调整为约 12pt

doc = Document()
section = doc.AddSection()
para = section.AddParagraph()
para.AppendRTF(rtf_text)
doc.SaveToFile("highlighted.docx", FileFormat.Docx2019)

这里有一个细节:RtfFormatter 的字号控制依赖对 RTF 控制字 \fs 的修改,\fs24 大致对应 12 磅字体。

效果预览:

路径 B:HTML 插入(视觉丰富、自动换行)

如果代码来源于 Web 内容,或者更看重渲染效果而非可编辑性,可以先用 HtmlFormatter 生成带内联样式的 HTML,再通过 paragraph.AppendHTML() 插入。Free Spire.Doc 会将 HTML 元素映射为 Word 的格式结构,长行也会自动换行。

from spire.doc import *
from pathlib import Path
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter

code = Path("demo.py").read_text(encoding="utf-8")
html_text = highlight(code, PythonLexer(), HtmlFormatter(full=True))

doc = Document()
section = doc.AddSection()
section.PageSetup.Margins.All = 60
para = section.AddParagraph()
para.AppendHTML(html_text)

doc.SaveToFile("code_html.docx", FileFormat.Docx2019)
doc.Dispose()

选型建议:

效果预览:

方案三:渲染为图片插入(纯视觉保真)

当格式一致性优先于可编辑性时,可以将语法高亮后的代码渲染为图片再插入文档。Pygments 的 ImageFormatter 配合 paragraph.AppendPicture() 即可完成。

ImageFormatter 依赖 Pillow 绘图,提前安装依赖: pip install pillow

import textwrap
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import ImageFormatter
from spire.doc import *

# 1. 读取 Python 源码
with open("demo.py", "r", encoding="utf-8") as f:
    code = f.read()

# 2. 手动处理长行换行
def wrap_code_lines(code_text, max_width=75):
    wrapped_lines = []
    for line in code_text.splitlines():
        if len(line) > max_width:
            wrapped_lines.extend(textwrap.wrap(
                line,
                width=max_width,
                replace_whitespace=False,
                drop_whitespace=False
            ))
        else:
            wrapped_lines.append(line)
    return "\n".join(wrapped_lines)

code = wrap_code_lines(code, max_width=75)

# 3. 生成图片
formatter = ImageFormatter(
    font_name="SimHei",
    font_size=18,
    scale=2,            
    image_pad=10,
    line_pad=2,
    background_color="#ffffff"
)

img_bytes = highlight(code, PythonLexer(), formatter)

with open("code.png", "wb") as f:
    f.write(img_bytes)

# 4. 创建 Word 文档
doc = Document()
section = doc.AddSection()
section.PageSetup.Margins.All = 60

# 5. 插入图片
paragraph = section.AddParagraph()
picture = paragraph.AppendPicture("code.png")

# 6. 设置图片尺寸
page_width = (
    section.PageSetup.PageSize.Width
    - section.PageSetup.Margins.Left
    - section.PageSetup.Margins.Right
)
picture.Width = page_width

# 7. 保存 Word 文档
doc.SaveToFile("code_image.docx", FileFormat.Docx2016)
doc.Dispose()

效果预览:

字体注意事项:ImageFormatter 在渲染图片时没有字体回退机制,只会使用指定字体渲染全部字符。Consolas 仅支持英文,不包含中文字形;如果代码注释包含中文,请替换为支持中文的字体。

方案对比与小结

三种方案在可编辑性、视觉表现和实现复杂度上各有取舍:

方案语法高亮可编辑性换行处理适用场景
纯文本逐行写入无完全可编辑需自行处理快速归档、低复杂度场景
Pygments + RTF有可编辑需自行处理需保留高亮且后续要修改
Pygments + HTML有部分可编辑自动换行追求渲染效果与换行处理
Pygments + 图片有不可编辑需软换行短片段、封版文档、格式一致性优先

选择时主要考虑三点:代码规模是否接近免费版段落上限、后续是否需要修改代码内容、长行与中文字符是否需要特殊处理。理解这些边界后,基本可以覆盖日常技术文档中的代码嵌入需求。

到此这篇关于Python读取.py文件源码并导出为Word的完整指南的文章就介绍到这了,更多相关Python代码导出Word内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文