Python-docx 非常丑陋的理由
Python-docx very ugly justification
我的问题
我是新手 Python 开发人员,目前正在开发一个使用 python-docx 模块写信的小应用程序。作为 Word 中对齐工具的强迫症用户,我的 'write_docx' 功能会自动对齐段落。整个事情都很好,但最后的理由太残酷了(一些非常小的行太长了)这使得最终的 *.docx 丑陋。
Here you can see an exemple of the bad justification (don't mind understanding : it's french)
最奇怪的是,当我只是写完全相同的文本并直接在 Word 中证明它时,没有任何证明问题(所以我想我在 python-docx模块)。
Here you can see that the justification tool is justifying softly the exact same paragraph
我试过的
我开始阅读 python-docx 文档(更具体地说是关于段落样式、对齐和缩进的部分),我发现了不同的对齐选项:
paragraph = document.add_paragraph()
paragraph.alignment = WD_ALIGN_PARAGRAPH.RIGHT
或
paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
等等
显然,我已经在使用 'WD_ALIGN_PARAGRAPH.JUSTIFY',但我尝试了其他一些,例如:
paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY_MED
paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY_LOW
但其中 none 有效(每次结果几乎相同)。
所以我开始寻找缩进和制表位选项(此处:https://python-docx.readthedocs.io/en/latest/user/text.html),但对我来说也没什么用。
规格
我正在使用:
- Python 3.8.3
- python-docx 0.8.10(lxml 4.5.1 附带)
- Windows 10.0.14393
- Word 2016
感谢您抽出宝贵的时间,我希望我已经说得足够清楚了:)(我不认为在这种情况下在此处添加一些代码会有用)。
P.S : 对不起,如果你理解我有任何问题,我不是英语。
我不是专家,但您的示例与内置方法之间的区别可以肯定的是,您没有从调整函数中排除段落的最后一行。
如果它是段落的最后一行,应该有一个 if
子句来阻止您的代码执行,因为只有这样,该行中的单词才会很少,这意味着空格很宽。此外,这是在常规文本处理器中执行此操作的标准方法。
我自己的问题的答案
我对 Dorian 的解决方案想了很多:
There should be an if
clause that stops your code from executing if it is the last line of a paragraph
但主要问题是我找不到识别段落内线条的方法。另一个问题是我的 'paragraph' 项目有时包含换行符。因此,即使是段落的内部(不仅仅是最后一行)也可能因理由而被过度拉伸。
隐藏的问题
所以我发现真正的问题实际上是我的段落包含未被正式识别为换行符的换行符(至少与按 [=29 时出现的换行符不同) =] 在 Word 中),因为我是从 *.xml 文件中获取它们的。因此,理由无法将那些换行符识别为“不应该被证明的行”。
到达那里后,解决方案很容易找到:
string_from_my_xml_file = get_xml(path,...)
for i in string_from_my_xml.split("\n"):
if i != "":
write_docx(path, i,...)
我的 *.xml 文件如下所示:
<item>This text is on multiple lines:
- One line here
- Another one here
</item>
我遇到了类似的问题,解决方案是删除转义字符,如下所示:
table.rows[1].cells[1].add_paragraph(item['description'].replace('\n', ' ')).alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
我的问题
我是新手 Python 开发人员,目前正在开发一个使用 python-docx 模块写信的小应用程序。作为 Word 中对齐工具的强迫症用户,我的 'write_docx' 功能会自动对齐段落。整个事情都很好,但最后的理由太残酷了(一些非常小的行太长了)这使得最终的 *.docx 丑陋。
Here you can see an exemple of the bad justification (don't mind understanding : it's french)
最奇怪的是,当我只是写完全相同的文本并直接在 Word 中证明它时,没有任何证明问题(所以我想我在 python-docx模块)。
Here you can see that the justification tool is justifying softly the exact same paragraph
我试过的
我开始阅读 python-docx 文档(更具体地说是关于段落样式、对齐和缩进的部分),我发现了不同的对齐选项:
paragraph = document.add_paragraph()
paragraph.alignment = WD_ALIGN_PARAGRAPH.RIGHT
或
paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
等等
显然,我已经在使用 'WD_ALIGN_PARAGRAPH.JUSTIFY',但我尝试了其他一些,例如:
paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY_MED
paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY_LOW
但其中 none 有效(每次结果几乎相同)。 所以我开始寻找缩进和制表位选项(此处:https://python-docx.readthedocs.io/en/latest/user/text.html),但对我来说也没什么用。
规格
我正在使用:
- Python 3.8.3
- python-docx 0.8.10(lxml 4.5.1 附带)
- Windows 10.0.14393
- Word 2016
感谢您抽出宝贵的时间,我希望我已经说得足够清楚了:)(我不认为在这种情况下在此处添加一些代码会有用)。
P.S : 对不起,如果你理解我有任何问题,我不是英语。
我不是专家,但您的示例与内置方法之间的区别可以肯定的是,您没有从调整函数中排除段落的最后一行。
如果它是段落的最后一行,应该有一个 if
子句来阻止您的代码执行,因为只有这样,该行中的单词才会很少,这意味着空格很宽。此外,这是在常规文本处理器中执行此操作的标准方法。
我自己的问题的答案
我对 Dorian 的解决方案想了很多:
There should be an
if
clause that stops your code from executing if it is the last line of a paragraph
但主要问题是我找不到识别段落内线条的方法。另一个问题是我的 'paragraph' 项目有时包含换行符。因此,即使是段落的内部(不仅仅是最后一行)也可能因理由而被过度拉伸。
隐藏的问题
所以我发现真正的问题实际上是我的段落包含未被正式识别为换行符的换行符(至少与按 [=29 时出现的换行符不同) =] 在 Word 中),因为我是从 *.xml 文件中获取它们的。因此,理由无法将那些换行符识别为“不应该被证明的行”。
到达那里后,解决方案很容易找到:
string_from_my_xml_file = get_xml(path,...)
for i in string_from_my_xml.split("\n"):
if i != "":
write_docx(path, i,...)
我的 *.xml 文件如下所示:
<item>This text is on multiple lines:
- One line here
- Another one here
</item>
我遇到了类似的问题,解决方案是删除转义字符,如下所示:
table.rows[1].cells[1].add_paragraph(item['description'].replace('\n', ' ')).alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY