Python-docx:确定段落中的分页符

时间:2018-10-31 13:14:48

标签: python search python-docx page-break

我按段落遍历文档,然后按.(带空格的点)将每个段落文本分成句子。我将段落文本拆分为句子,以便进行更有效的文本搜索,而不是对整个段落文本进行搜索。

然后,代码在句子的每个单词中搜索错误,该错误来自纠错数据库。我在下面显示一个简化的代码:

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显示了how to add page break,但是如何识别

最好是,如果还可以识别段落中的换行符

我可以做到:

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 插入的中断。未检测到软分页符 ...(软分页符是在用户持续键入直到其所在的页面用完然后流到下一页时形成的)

有任何提示吗?

2 个答案:

答案 0 :(得分:1)

无法从.docx文件检测软分页符。这些文件的位置仅对呈现引擎已知,而不会反映在.docx文件本身中。如果您在此处搜索“ [python-docx]分页符”或“ [python-docx]目录”,您将找到对此的更详细说明。

关于问题的第一部分,python-docx文档的技术分析部分的本页显示了基础XML的中断情况:
https://python-docx.readthedocs.io/en/latest/dev/analysis/features/text/breaks.html#specimen-xml

尽管run.text属性使用\n换行符指示它们,但尚无API支持用于明确查找中断。 \n不能将换行符和分页符区分开。

如果需要更具体,则需要在每次运行中深入研究XML,并查找您感兴趣的特定break(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=属性。

答案 1 :(得分:0)

对于 Soft 分页符,我现在使用以下内容:

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]