Установка свойства pgNumType в python-docx не имеет никакого эффекта - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь установить номера страниц в текстовом документе, используя python-docx.Я нашел атрибут pgNumType (pageNumberType), который я устанавливаю с помощью этого кода:

document = Document()
section = document.add_section(WD_SECTION.CONTINUOUS)
sections = document.sections

sectPr = sections[0]._sectPr

pgNumType = OxmlElement('w:pgNumType')
pgNumType.set(qn('w:fmt'), 'decimal')
pgNumType.set(qn('w:start'), '1')

sectPr.append(pgNumType)

Этот код ничего не делает, в выходном документе нет номеров страниц.Я сделал то же самое с атрибутом lnNumType, который предназначен для номеров строк, и он работал нормально.Так что же с атрибутом pgNumType?Программа выполняется без ошибок, поэтому атрибут существует.Но кто-нибудь знает, почему это не имеет никакого эффекта?

Ответы [ 2 ]

0 голосов
/ 26 июля 2019

@T.Poe Я работал над той же проблемой.

new_section = document.add_section()  # Added new section for assigning different footer on each page.
sectPr = new_section._sectPr

pgNumType = OxmlElement('w:pgNumType')
pgNumType.set(qn('w:fmt'), 'decimal')
pgNumType.set(qn('w:start'), '1')

sectPr.append(pgNumType)

new_footer = new_section.footer  # Get footer-area of the recent section in document
new_footer.is_linked_to_previous = False  
footer_para = new_footer.add_paragraph()  
run_footer = footer_para.add_run("Your footer here")
_add_number_range(run_footer)
font = run_footer.font
font.name = 'Arial'
font.size = Pt(8)
footer_para.paragraph_format.page_break_before = True

Это сработало для меня :) Я не знаю, что не работает для вас.Я только что создал новый раздел

Некоторый код функции, которую я использовал для определения поля, выглядит следующим образом:

def _add_field(run, field):
    """ add a field to a run
    """
    fldChar1 = OxmlElement('w:fldChar')  # creates a new element
    fldChar1.set(qn('w:fldCharType'), 'begin')  # sets attribute on element
    instrText = OxmlElement('w:instrText')
    instrText.set(qn('xml:space'), 'preserve')  # sets attribute on element
    instrText.text = field

    fldChar2 = OxmlElement('w:fldChar')
    fldChar2.set(qn('w:fldCharType'), 'separate')
    t = OxmlElement('w:t')
    t.text = "Seq"
    fldChar2.append(t)

    fldChar4 = OxmlElement('w:fldChar')
    fldChar4.set(qn('w:fldCharType'), 'end')


    r_element = run._r
    r_element.append(fldChar1)
    r_element.append(instrText)
    r_element.append(fldChar2)
    r_element.append(fldChar4)



def _add_number_range(run):
    """ add a number range field to a run
    """
    _add_field(run, r'Page')
0 голосов
/ 10 июня 2018

Хотя ваш стиль страницы в порядке, но он не вставляет поле номера страницы автоматически в любом месте вашего документа.Обычно номера страниц появляются в верхнем или нижнем колонтитулах, но, к сожалению, python-docx в настоящее время не поддерживает верхние и нижние колонтитулы или поля.Первые два, похоже, находятся в стадии разработки: https://github.com/python-openxml/python-docx/issues/104.

В связанном выпуске упоминается ряд обходных путей.Единственное, что я нашел наиболее надежным, - это создать пустой документ, в котором верхние и нижние колонтитулы будут настроены так, как вы хотите в MS Word.Затем вы можете загрузить и добавить этот документ вместо шаблона по умолчанию, который возвращает docx.Document.

Предполагается, что этот метод является рекомендуемым методом для редактирования заголовков в официальном документация :

Многое из того, как выглядит документ, определяется частями, которые остаются при удалении всего содержимого.Такие вещи, как стили, верхние и нижние колонтитулы, содержатся отдельно от основного содержимого, что позволяет вам вносить значительные изменения в исходный документ, который затем появляется в создаваемом документе.

...