Используя python-docx
, как сделать так, чтобы номера страниц начинались с другой страницы, отличной от первой, но все равно начинались с 1?
Используя ответ на этот вопрос, я придумал воспроизводимый пример ниже.
Нумерация начинается с правильной страницы (страница 4), но начинается с номера 4, а я хочу, чтобы это был номер 1. Как решить эту проблему?
import docx
from docx.enum.section import WD_SECTION
from docx.oxml import OxmlElement, ns
def create_element(name):
return OxmlElement(name)
def create_attribute(element, name, value):
element.set(ns.qn(name), value)
def add_page_number(section):
p = section.footer.paragraphs[0]
p.alignment = 1
p.style.font.size = Pt(9)
p.style.font.name = DEFAULT_FONT_NAME
run = p.add_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)
document = docx.Document()
# first blank page
document.add_page_break()
# second blank page
document.add_page_break()
# 3rd page with some text
p = document.add_paragraph("Title")
document.add_page_break()
# page from which I want to get page numbers:
document.add_section(WD_SECTION.NEW_PAGE)
document.sections[1].footer.is_linked_to_previous = False
document.add_paragraph("text of my first page")
# add page numbers
add_page_number(document.sections[1])
# save
document.save('example.docx')
Обновлено: я только что нашел это и думаю, что мне нужно использовать w:pgNumType
с w:start
, но также не смог заставить его работать.
Чтобы номера страниц начинались с 1 на странице, которая не является первой страницей документа, вы можете изменить функцию add_page_number, указав номер начальной страницы. добавьте необязательный параметр start_page_number в функцию add_page_number, который позволяет указать номер начальной страницы. В функции add_page_number добавьте номер страницы после команды поля «СТРАНИЦА». Вы можете установить start_page_number равным 1, чтобы начать нумерацию с 1 на нужной странице.
Спасибо, можно поточнее, как добавить его в поле «СТРАНИЦА»? Может, дадите фрагмент кода?
import docx
from docx.enum.section import WD_SECTION
from docx.shared import Pt
from docx.oxml import OxmlElement, ns
def create_element(name):
return OxmlElement(name)
def create_attribute(element, name, value):
element.set(ns.qn(name), value)
def add_page_number(section, start_page_number=1):
p = section.footer.paragraphs[0]
p.alignment = 1
p.style.font.size = Pt(9)
run = p.add_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 = f"PAGE \* MERGEFORMAT"
fldChar2 = create_element('w:fldChar')
create_attribute(fldChar2, 'w:fldCharType', 'end')
run._r.append(fldChar1)
run._r.append(instrText)
run._r.append(fldChar2)
# Add the starting page number
run = p.add_run()
run.text = f" {start_page_number}"
document = docx.Document()
# first blank page
document.add_page_break()
# second blank page
document.add_page_break()
# 3rd page with some text
p = document.add_paragraph("Title")
document.add_page_break()
# page from which you want to get page numbers:
document.add_section(WD_SECTION.NEW_PAGE)
document.sections[1].footer.is_linked_to_previous = False
document.add_paragraph("text of my first page")
# add page numbers starting from page 4
add_page_number(document.sections[1], start_page_number=1)
# save
document.save('example.docx')
Он добавляет цифру 1 перед фактическим номером страницы, поэтому не обеспечивает желаемого поведения.
Сначала определите новый раздел, страницы которого вы хотите нумеровать: page_number_starting_at_section
. Затем отключите предыдущую ссылку и добавьте номера страниц.
page_number_starting_at_section = 2
# Disable linking headers and footers to the previous section for the preamble
for i in range(0, page_number_starting_at_section + 1):
document.sections[i].footer.is_linked_to_previous = False
document.sections[i].header.is_linked_to_previous = False
document.sections[i].even_page_footer.is_linked_to_previous = False
document.sections[i].even_page_header.is_linked_to_previous = False
# Configure the section to start page numbering from 1
section = document.sections[page_number_starting_at_section]
sectPr = section._sectPr
pgNumType = OxmlElement("w:pgNumType")
pgNumType.set(qn("w:start"), "1")
sectPr.append(pgNumType)
add_page_numbers(section.footer)
@mirслав-valcicak Я думаю, что ты лучший человек, способный ответить на этот вопрос.