【问题标题】:Removing heading numbers from docx从 docx 中删除标题编号
【发布时间】:2016-04-04 14:32:00
【问题描述】:

我需要使用python对docx(Word)文档进行预处理,以便pandoc可以正确地将它们转换为markdown。关键要求之一是 docx 文档的样式应该被“清理”,特别是应该删除 标题 的编号(标题 1、标题 2 等)。

限制:我知道如何使用 VBA 来做到这一点(并且可能可以使用 PyWin32 等从 python 中做到这一点)。但要求它必须在没有 Microsoft Windows 和 LibreOffice/UNO 的情况下实现。

如何使用 python-docx 包来做到这一点?我查看了文档,似乎没有任何合适的做法(实际上 heading numbering style 似乎没有实现)。我错过了什么吗?

除非我应该使用其他方法,例如将不同的 Word 模板应用于 docx 文档,并根据我的要求正确预定义主要样式?这可以通过可用的 python 包来完成吗?

VBA 中的代码 这是完成工作的 VBA 代码:

Sub RemoveHeaderNos()
' Remove the header nos

    Debug.Print "Removing header numbers and formatting..."
   For Each s In ActiveDocument.Styles
        s.LinkToListTemplate ListTemplate:=Nothing
    Next
End Sub

【问题讨论】:

    标签: python pandoc python-docx


    【解决方案1】:

    在术语上,我理解您的意思是“标题段落的编号”,而不是像页眉中的页码之类的东西,我理解对了吗?不幸的是,“标题”和“标题”这两个术语很接近,并且在 Word 用语中意味着完全不同的东西:)

    我假设您的段落标题已编号,例如“标题 1”样式会导致下一个连续整数作为标题段落文本的前缀,例如“9”。第九节标题',(然后同样适用于标题 2 -> 9.1、9.2 等。

    你说得对,这还没有在 python-docx 中实现。您需要使用 python-docx API 尽可能接近相关 XML 元素(例如标题 1 的 <w:style> 元素),然后使用 lxml 调用来操作其下的 XML。

    您需要从需要进行哪些 XML 更改的策略开始。 opc-diag 很方便。您可以使用 Word 手动更改 .docx(最好是彻底精简的超短文档),使其看起来符合您的要求,然后比较前后的 XML 以发现您需要对 XML 进行哪些更改。

    然后您可以通过提取 .docx(使用 opc-diag)来验证您的策略,手动更新 XML 所需的最少更改,重新打包它(也使用 opc-diag),然后将其加载到 Word 中以确保它行为符合预期。

    我怀疑有一种方法可以将“标题 1”样式与 styles.xml 部分中的编号定义“断开”,这将完成您所追求的目标,并且是相当简单的少量元素更改。

    无论如何,这就是我要开始的地方。

    【讨论】:

    • 非常感谢!是的,这绝对是标题段落(样式)的编号。如果我们删除“标题 1”、“标题 2”等样式的所有属性,或许我们可以获得更简单的解决方案?能做到吗?
    • 换句话说,只保留样式的裸机默认值?
    • 这听起来有点激进,但它让我觉得如果你删除现有的 Heading 1 样式并创建一个具有相同名称的新样式,它就不会有编号。值得一试。
    • 为了这个目的,它可能有用吗? (参见上面的 VBA 示例)。我会查的。
    • 这看起来很有希望;它表明只有与列表定义的单一链接。如果您打印出标题 1 样式的 XML,我可能会为您挑选出正确的元素。你会做这样的事情:print(document.styles['Heading 1']._element.xml)
    【解决方案2】:

    此问题已在 2016 年 3 月 20 日发布的 version 1.17 of pandoc 中得到解决(“不要将编号的标题变成列表”)。如果其他人遇到同样的问题,现阶段最好的办法是升级到该版本或更高版本。

    尽管如此,使用 python-docx 探索各种解决方案还是很有趣的,因为它表明了一个可能的改进点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 2012-02-23
      • 2021-08-26
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多