Как сделать так, чтобы номера страниц начинались со страницы N под номером 1?

Используя 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, но также не смог заставить его работать.

@mirслав-valcicak Я думаю, что ты лучший человек, способный ответить на этот вопрос.

AnastasiaShishkova 14.09.2023 10:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
65
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Чтобы номера страниц начинались с 1 на странице, которая не является первой страницей документа, вы можете изменить функцию add_page_number, указав номер начальной страницы. добавьте необязательный параметр start_page_number в функцию add_page_number, который позволяет указать номер начальной страницы. В функции add_page_number добавьте номер страницы после команды поля «СТРАНИЦА». Вы можете установить start_page_number равным 1, чтобы начать нумерацию с 1 на нужной странице.

Спасибо, можно поточнее, как добавить его в поле «СТРАНИЦА»? Может, дадите фрагмент кода?

AnastasiaShishkova 14.09.2023 11:25
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 перед фактическим номером страницы, поэтому не обеспечивает желаемого поведения.

AnastasiaShishkova 14.09.2023 13:00
Ответ принят как подходящий

Сначала определите новый раздел, страницы которого вы хотите нумеровать: 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)

Другие вопросы по теме