Добавить номер страницы, используя python-docx - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь добавить номер страницы в нижний колонтитул слова doc, используя python-docx.До сих пор я не смог найти, как это сделать. Этот адрес вопроса, как найти номер страницы (или как вы не можете). Этот говорит о создании шаблона и добавлении туда номеров страниц.Есть ли способ добавить номера страниц в документ, который я создал, используя doc = Document ()?

Ответы [ 3 ]

1 голос
/ 19 июня 2019

Автоматический номер страницы в нижнем колонтитуле реализован в виде поля . Поля еще не поддерживают API в python-docx, поэтому вы не можете делать то, что хотите, с документом, созданным из шаблона по умолчанию (document = Document()), по крайней мере, не делая вызов API.

Два возможных подхода - создать шаблон документа, который уже имеет номер страницы в нижнем колонтитуле и начать с него:

document = Document("my-template.docx")

Или создать обходную функцию, которая добавляет в XML, используя низкоуровневые lxml вызовы объекта элемента XML, полученного из объекта python-docx, например paragraph._p.

Ссылки, предоставленные Syafiqur__ в его ответе, могут помочь вам с этим последним подходом.

1 голос
/ 20 июня 2019

Благодаря Syafiqur__ и scanny я нашел решение для добавления номеров страниц.

def create_element(name):
    return OxmlElement(name)

def create_attribute(element, name, value):
    element.set(ns.qn(name), value)


def add_page_number(run):
    fldChar1 = create_element('w:fldChar')
    create_attribute(fldChar1, 'w:fldCharType', 'begin')

    instrText = create_element('w:instrText')
    create_attribute(instrText, 'xml:space', 'preserve')
    instrText.text = "PAGE"

    fldChar2 = create_element('w:fldChar')
    create_attribute(fldChar2, 'w:fldCharType', 'end')

    run._r.append(fldChar1)
    run._r.append(instrText)
    run._r.append(fldChar2)

doc = Document()
add_page_number(doc.sections[0].footer.paragraphs[0].add_run())
doc.save("your_doc.docx")
1 голос
/ 19 июня 2019

Я думаю, что добавление PageNumber - это функция, которая еще не реализована.

Однако ...

  1. Если это существующий документ, вы хотите добавить колонтитулы в Вы можете вызвать VBA-макрос. Я недавно опубликовал способ сделать это (https://stackoverflow.com/a/44767400/7386332)
  2. Если это новый документ, то вы действительно можете продолжить и создать сначала шаблон документа, а затем откройте его и продолжите редактирование как описан scanny.
  3. Это относится к этому варианту использования в его документах, но не демонстрирует как https://python -docx.readthedocs.io / о / последний / DEV / анализ / функция / header.html? Изюминка = страница% 20number
  4. Или вы можете попробовать это https://github.com/python-openxml/python-docx/issues/498
...