Python-docx: определить разрыв страницы в абзаце - PullRequest
0 голосов
/ 31 октября 2018

Я перебираю документ по абзацам, затем разбиваю каждый текст абзаца на предложения по . (точка с пробелом). Я делю текст абзаца на предложения в i n, чтобы сделать более эффективный поиск текста по сравнению с поиском по всему тексту абзаца.

Затем код ищет ошибку в каждом слове предложения, ошибка берется из базы данных с исправлением ошибок. Я показываю ниже упрощенный код:

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 показал как добавить разрыв страницы , но как идентифицировать его ?

Лучше всего было бы, если бы в абзаце * 1017 можно было также указать разрыв строки.

Я мог бы сделать:

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 голосов
/ 16 ноября 2018

Для разрывов страниц 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]
0 голосов
/ 01 ноября 2018

Нет способа обнаружить мягкие разрывы страниц из файла .docx. Их положение известно только движку рендеринга и не отражается в самом файле .docx. Если вы ищете здесь «[python-docx] page break» или «[python-docx] TOC», вы найдете более подробное объяснение этого.

Что касается первой части вашего вопроса, эта страница из раздела технического анализа документации python-docx показывает, как выглядят разрывы в базовом XML:
https://python -docx.readthedocs.io / о / последний / DEV / анализ / функция / текст / breaks.html # образец-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=.

...