Python-docx:识别段落中的分页符
Python-docx: identify a page break in paragraph
我按段落遍历文档,然后按 .
(点 space)将每个段落文本分成句子。我将段落文本拆分为句子 in 以便进行更有效的文本搜索 与在整个段落文本中进行搜索相比。
然后代码在句子的每个单词中搜索错误,错误是从纠错数据库中获取的。我在下面显示了一个简化的代码:
from docx.enum.text import WD_BREAK
for paragraph in document.paragraphs:
sentences = paragraph.text.split('. ')
for sentence in sentences:
words=sentence.split(' ')
for word in words:
for error in error_dictionary:
if error in word:
# (A) make simple replacement
word = word.replace(error, correction, 1)
# (B) alternative replacement based on runs
for run in paragraph.runs:
if error in run.text:
run.text = run.text.replace(error, correction, 1)
# here we may fetch page break attribute and knowing current number
# find out at what page the replacement has taken place
if run.page_break== WD_BREAK:
current_page_number +=1
replace_counter += 1
# write to a report what paragraph and what page
write_report(error, correction, sentence, current_page_number )
# for that I need to know a page break
问题是如何识别运行(或其他段落元素)是否包含分页符? run.page_break == WD_BREAK
有效吗?
@scanny 已经显示 ,但是如何识别它?
最好的办法是在段落 中也能识别出换行符。
我可以做到:
for run in paragraph.runs:
if run._element.br_lst:
for br in run._element.br_lst:
br_couter+=1
print br.type
但是此代码仅显示 硬中断,即通过 Ctrl+Enter 插入的中断。 未检测到软分页符...(软分页符 是在用户不断键入直到他所在的页面 运行 时形成的出来然后流到下一页)
有什么提示吗?
无法检测 .docx 文件的软分页符。它们的位置只有渲染引擎知道,不会反映在 .docx 文件本身中。如果您在此处搜索“[python-docx] 分页符”或“[python-docx] TOC”,您会找到更详尽的解释。
关于您问题的第一部分,python-docx
文档技术分析部分的这一页显示了基础 XML:
中的突破情况。
https://python-docx.readthedocs.io/en/latest/dev/analysis/features/text/breaks.html#specimen-xml
尚无 API 支持明确查找中断,尽管 run.text
属性 使用 \n
换行符指示它们。但是 \n
不区分换行符和分页符。
如果您需要更具体的信息,则需要深入研究每个 运行 下的 XML 并查找您要查找的特定中断 (w:br
) 元素兴趣及其属性:
>>> run._element.xml
<w:r>
<w:t>Text before</w:t>
<w:br/>
<w:t>and after line break</w:t>
</w:r>
你说的run._element.br_lst
方法很好,那你只需要检查每个w:br
的属性,看它是否有w:type=
属性。
对于 Soft 和 Hard 分页符,我现在使用以下内容:
for run in paragraph.runs:
if 'lastRenderedPageBreak' in run._element.xml:
print 'soft page break found at run:', run.text[:20]
if 'w:br' in run._element.xml and 'type="page"' in run._element.xml:
print 'hard page break found at run:', run.text[:20]
我按段落遍历文档,然后按 .
(点 space)将每个段落文本分成句子。我将段落文本拆分为句子 in 以便进行更有效的文本搜索 与在整个段落文本中进行搜索相比。
然后代码在句子的每个单词中搜索错误,错误是从纠错数据库中获取的。我在下面显示了一个简化的代码:
from docx.enum.text import WD_BREAK
for paragraph in document.paragraphs:
sentences = paragraph.text.split('. ')
for sentence in sentences:
words=sentence.split(' ')
for word in words:
for error in error_dictionary:
if error in word:
# (A) make simple replacement
word = word.replace(error, correction, 1)
# (B) alternative replacement based on runs
for run in paragraph.runs:
if error in run.text:
run.text = run.text.replace(error, correction, 1)
# here we may fetch page break attribute and knowing current number
# find out at what page the replacement has taken place
if run.page_break== WD_BREAK:
current_page_number +=1
replace_counter += 1
# write to a report what paragraph and what page
write_report(error, correction, sentence, current_page_number )
# for that I need to know a page break
问题是如何识别运行(或其他段落元素)是否包含分页符? run.page_break == WD_BREAK
有效吗?
@scanny 已经显示
最好的办法是在段落 中也能识别出换行符。
我可以做到:
for run in paragraph.runs:
if run._element.br_lst:
for br in run._element.br_lst:
br_couter+=1
print br.type
但是此代码仅显示 硬中断,即通过 Ctrl+Enter 插入的中断。 未检测到软分页符...(软分页符 是在用户不断键入直到他所在的页面 运行 时形成的出来然后流到下一页)
有什么提示吗?
无法检测 .docx 文件的软分页符。它们的位置只有渲染引擎知道,不会反映在 .docx 文件本身中。如果您在此处搜索“[python-docx] 分页符”或“[python-docx] TOC”,您会找到更详尽的解释。
关于您问题的第一部分,python-docx
文档技术分析部分的这一页显示了基础 XML:
中的突破情况。
https://python-docx.readthedocs.io/en/latest/dev/analysis/features/text/breaks.html#specimen-xml
尚无 API 支持明确查找中断,尽管 run.text
属性 使用 \n
换行符指示它们。但是 \n
不区分换行符和分页符。
如果您需要更具体的信息,则需要深入研究每个 运行 下的 XML 并查找您要查找的特定中断 (w:br
) 元素兴趣及其属性:
>>> run._element.xml
<w:r>
<w:t>Text before</w:t>
<w:br/>
<w:t>and after line break</w:t>
</w:r>
你说的run._element.br_lst
方法很好,那你只需要检查每个w:br
的属性,看它是否有w:type=
属性。
对于 Soft 和 Hard 分页符,我现在使用以下内容:
for run in paragraph.runs:
if 'lastRenderedPageBreak' in run._element.xml:
print 'soft page break found at run:', run.text[:20]
if 'w:br' in run._element.xml and 'type="page"' in run._element.xml:
print 'hard page break found at run:', run.text[:20]