Python 从docx中删除标题号

Python 从docx中删除标题号,python,pandoc,python-docx,Python,Pandoc,Python Docx,我需要使用python来预处理docx(Word)文档,以便pandoc能够正确地将它们转换为markdown。其中一项关键要求是应“清理”docx文件的样式,特别是应删除标题编号(标题1、标题2等) 限制:我知道如何使用VBA实现这一点(很可能可以通过python使用PyWin32或类似工具实现)。但它必须在没有Microsoft Windows和LibreOffice/UNO的情况下实现 如何使用pythondocx包来实现这一点?我已经看过了文档,但似乎没有什么合适的方法(实际上似乎没有实

我需要使用python来预处理docx(Word)文档,以便pandoc能够正确地将它们转换为markdown。其中一项关键要求是应“清理”docx文件的样式,特别是应删除标题编号(标题1、标题2等)

限制:我知道如何使用VBA实现这一点(很可能可以通过python使用PyWin32或类似工具实现)。但它必须在没有Microsoft Windows和LibreOffice/UNO的情况下实现

如何使用pythondocx包来实现这一点?我已经看过了文档,但似乎没有什么合适的方法(实际上似乎没有实现)。我错过什么了吗

除非我应该使用另一种方法,例如对docx文档应用不同的Word模板,并根据我的要求正确预定义主要样式?这可以通过一个可用的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

在术语上,我理解你的意思是“标题段落的编号”,而不是像页眉中的页码,对吗?不幸的是,“heading”和“header”这两个词很接近,用词的说法,它们的意思完全不同:)

我假设你的段落标题是编号的,比如“标题1”样式会在标题段落文本前加上下一个连续整数,比如“9”。第九节标题',(第2节->第9.1节、第9.2节等也是如此

您是对的,这尚未在python docx中实现。您需要使用python docx API尽可能接近所讨论的XML元素(例如标题1的
元素),然后使用lxml调用在该API下操作XML

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

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

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

无论如何,这就是我的出发点。

这个问题在中解决了,于2016年3月20日发布(“不要将编号的标题转换为列表”)。如果其他人遇到同样的问题,在这个阶段最好升级到该版本或更高版本


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

非常感谢!是的,这肯定是标题段落(样式)的编号。如果我们删除“标题1”、“标题2”的所有属性,也许我们可以得到一个更简单的解决方案,等等。样式?可以这样做吗?换句话说,只保留样式的裸机默认值?这听起来有点激进,但它让我认为,如果删除现有的标题1样式并创建一个同名的新样式,它将没有编号。值得一试。为此,它可能会起作用?(参见上面的VBA示例)。我会查一下。这看起来很有希望;它表明列表定义只有一个链接。如果您打印标题1样式的XML,我可能会为您选择正确的元素。您可以这样做:
print(document.styles['Heading 1'].\u element.XML)