Создание верхнего и нижнего колонтитула в версиях до 0.8.8 - PullRequest
0 голосов
/ 08 июня 2018

Есть ли обходной путь для добавления верхних и нижних колонтитулов в файл Microsoft Word (docx)?

Они не реализованы в версиях от python-docx до до 0.8.8.

Более конкретно, я хотел бы добавить:

  1. Номер страницы в нижнем колонтитуле
  2. Случайный текст заголовков

Код идеальный будет выглядеть следующим образом:

from docx import Document

document = Document()

# Add header and footer on all pages

document.save("demo.docx")

Ответы [ 5 ]

0 голосов
/ 08 апреля 2019

Я использую его для работы

from docx import Document
document = Document()

header = document.sections[0].header
header.add_paragraph('Test Header') 

header = document.sections[0].footer
header.add_paragraph('Test Footers')

https://python -docx.readthedocs.io / en / latest / dev / analysis / features / header.html

enter image description here

0 голосов
/ 20 июня 2018

Как на счет этого (спасибо Элиоту К)

from docx import Document
import win32com.client as win32
import os.path
import tempfile

tempdir = tempfile.gettempdir()
msword = win32.gencache.EnsureDispatch('Word.Application')
tempfile = os.path.join(tempdir, "temp.doc")

document = Document()

document.save(tempfile)

doc = msword.Documents.Open(tempfile)

doc.Sections(1).Footers(1).Range.Text = r'Text to be included'
doc.Sections(1).Footers(1).PageNumbers.Add()
doc.SaveAs(tempfile, FileFormat = 0)

document = Document(tempfile)

Возможно, это не самый элегантный подход, но он должен делать то, что вам нужно.Может быть, изолировать некрасивый код сохранения / загрузки в функции где-то в пыльном углу вашего кода; -)

Опять же, требуется Windows-машина с установленным офисом Microsoft.

Удачи!

0 голосов
/ 15 июня 2018

Одним из возможных способов решения проблемы является использование шаблонного документа, созданного в Word.Создайте пустой документ, добавьте любой заголовок с нужным текстом, нижний колонтитул с номерами страниц и сохраните документ.Затем используйте:

from docx import Document
document = Document("template.docx")
# Do your editing
document.save("demo.docx")

... и вы сможете редактировать все остальное, сохраняя верхний и нижний колонтитулы.

В конечном счете, я думаю, что это решение отлично подойдет для проблемы с номерами страниц.,Если вам нужен уникальный текст заголовка для каждого документа, все может стать немного сложнее.Если это так, вы можете попробовать редактировать XML-файл docx напрямую.Вы можете использовать это в терминале:

unzip template.docx

..., чтобы вывести XML-файлы docx в каталог.Вы также можете использовать zipfile, чтобы сделать это в python:

import zipfile

document = zipfile.ZipFile("template.docx")
for xml in document.filelist:
    if "header" in xml.filename:
        read = document.read(xml.filename)
        print(read.decode())

Оператор print напечатает весь XML-файл, но вы сможете найти этот фрагмент:

<w:r><w:t>ThisIsMyHeader</w:t></w:r>

Какойбудет текст в вашем заголовке.Все, что вам нужно сделать, это отредактировать файл XML, объединить файлы обратно, а затем изменить тип файла обратно на docx.

Это, очевидно, супер хакерский обходной путь, и, к сожалению, я не смог заставить его работать полностью, но по крайней мере это был бы хороший шаг в правильном направлении, если он вам абсолютно необходим.

Удачи!

0 голосов
/ 17 июня 2018

Шаблонный подход работает, и его главное преимущество заключается в том, что это действительно кроссплатформенное решение.Однако для этого необходимо, чтобы стиль уже применялся в документе один раз.

Давайте рассмотрим (упрощенную) версию примера игрушки со страницы документации python-docx .

Первый шаг включает создание шаблонного документа:

from docx import Document

document = Document()

document.add_heading('Document Title', 0)

p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='IntenseQuote')

document.add_paragraph(
    'first item in unordered list', style='ListBullet'
)
document.add_paragraph(
    'first item in ordered list', style='ListNumber'
)

document.save('demo.docx')

(Обратите внимание, что на этом первом шаге вы также можете применить стили вручную без использования python-docx, то есть изв Word.)

Далее вы открываете demo.docx в Microsoft Word, где вы:

  1. добавляете нужный заголовок
  2. вставляете номера страниц из меню
  3. сохранить документ

После того, как вы сделали вышеупомянутое, вы просто удаляете основное содержимое документа demo.docx (но не содержимое верхнего и нижнего колонтитула!) Исохраните файл еще раз.

На втором шаге вы вызываете demo.docx, используя python-docx, чтобы внести необходимые изменения:

from docx import Document

document = Document('demo.docx')

document.add_heading('A New Title for my Document', 0)

p = document.add_paragraph('A new paragraph having some plain ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

document.add_heading('New Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='IntenseQuote')

document.add_paragraph(
    'first new item in unordered list', style='ListBullet'
)
document.add_paragraph(
    'first new item in ordered list', style='ListNumber'
)

document.save('demo.docx')

Вы можете даже добавлять дополнительные дополнения, напримеркак таблица с существующим стилем таблицы:

from docx import Document

document = Document('demo.docx')

document.add_page_break()

recordset = [ [1, "101", "Spam"], [2, "42", "Eggs"], [3, "631", "Spam, spam, eggs, and spam"]]

table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'

for item in recordset:
    row_cells = table.add_row().cells
    row_cells[0].text = str(item[0])
    row_cells[1].text = str(item[1])
    row_cells[2].text = item[2]

table.style = 'ColorfulShading'

document.save('demo.docx')

Конечно, можно избежать повторения первого шага все время, скопировав настроенный файл , а затем внеся необходимые изменения (например, demo_copy.docx), не затрагивая шаблон:

import shutil
shutil.copyfile('demo.docx', 'demo_copy.docx')

Наконец, стоит отметить, что вы также можете использовать настроенные стили!Пример того, как это сделать, используя python-docx и стили таблиц см. Здесь .

0 голосов
/ 14 июня 2018

Это не самый элегантный (он требует навигации между VBA и Python), но вы можете использовать библиотеку win32com для доступа к функциональности MS Word.Для этого, конечно, требуется компьютер под управлением Windows с установленным MS Office.

import win32com.client as win32
msword = win32.gencache.EnsureDispatch('Word.Application')
doc = msword.Documents.Add
doc.Sections(1).Footers(1).Range.Text = r'Text to be included'
doc.Sections(1).Footers(1).PageNumbers.Add()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...