我需要使用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
答案 0 :(得分:0)
关于术语,我理解你的意思是"标题段落的编号"与页眉中的页码相对应,我是否做到了这一点?两个术语"标题"和#34;标题"不幸的是,它们很接近并且意味着完全不同的东西,无论如何用Word的说法:)
我假设您的段落标题已编号,例如'标题1' style会导致下一个连续的整数以标题段落文本为前缀,例如	 9。第九节标题'(然后同样用于标题2 - > 9.1,9.2等。
您已经纠正了此问题尚未在python-docx中实现。您需要尽可能使用python-docx API尽可能接近有问题的XML元素(例如,标题1的<w:style>
元素),然后使用lxml调用来操作XML。< / p>
您需要从制定需要进行的XML更改的策略开始。 opc-diag
对此非常方便。您可以使用Word手动更改.docx(最好是一个根本剥离的超短文档),使其看起来像您想要的那样,然后比较之前和之后的XML,以发现您需要对XML进行哪些更改。
然后,您可以通过提取.docx(使用opc-diag),使用所需的最少更改手动更新XML,重新打包它(也使用opc-diag)并在Word中加载它来确认您的策略以确保它表现得像预期的那样。
我怀疑是否有一种方法可以断开&#34; &#34;标题1&#34; style.xml部分中的编号定义中的样式,可以完成您之后所做的事情,并且是一个相当简单的元素更改。
无论如何,这就是我要去的地方。
答案 1 :(得分:0)
此问题已于2016年3月20日发布的version 1.17 of pandoc中解决(“请勿将编号标题转换为列表”)。如果其他人遇到同样的问题,那么现阶段最好的事情就是升级到该版本或更高版本。
然而,使用python-docx探索各种解决方案很有意思,因为它表明了可能的改进点。