Обновление полей с помощью python-docx

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

Я искал везде и не нашел ни одной темы, объясняющей, как обновлять поля в MS Word с помощью python-docx. Он еще не реализован?

Я имею в виду поля, расположенные в Advanced Document Properties/Custom.

Поля, настроенные в меню "Дополнительные свойства документа"

Добавление полей в документ

Пример полей в документе


person Daniel Serrano    schedule 18.06.2020    source источник
comment
Можете ли вы привести пример?   -  person Kasper    schedule 18.06.2020
comment
Конечно, прикрепляю скриншоты: ibb.co/phW44HT ibb.co/8bBDCrx ibb.co/StWb1jX   -  person Daniel Serrano    schedule 18.06.2020
comment
Добро пожаловать в СО. Можете ли вы добавить эти изображения в свой вопрос, используя инструмент изображения, а также дополнительную информацию о том, что вы пробовали. См. раздел Как задать вопрос.   -  person Vepth    schedule 18.06.2020
comment
Спасибо и извините за плохое объяснение, это мой самый первый пост здесь   -  person Daniel Serrano    schedule 18.06.2020


Ответы (2)


Решение 1

user:1902513 или scanny еще не внедрили атрибут custom_properties в основной репозиторий python-docx -- и, вероятно, не в ближайшем будущем, поскольку, по его словам, разработчики не активны для изменения репозитория.

Я предлагаю переустановить модуль, но из другой копии репозитория, сделанной user:652546 или renejsum; здесь.

>> source of solution <<

Пример использования приведен в этом скрипте.

person Azhar    schedule 26.06.2020
comment
Это действительно работает, но не обновляет поля после их изменения. Я искал, как обновить поля, но это не работает для меня. Кроме того, этот модуль выдает некоторые ошибки при доступе к заголовку документа. - person Daniel Serrano; 02.07.2020

Решение 2

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

Пример:

from re import compile # regex module to emulate keyword search by pattern 


keyword = re.compile(r'\s*Creator: (?P<creator_name>\w+)\s*')
word_replacement = 'Daniel Serrano'


for _p in doc.paragraphs: # doc = docx.Document(...) 

    found_word = keyword.match(_p.text)

    if found_word: 

        for _r in _p.runs: 
            _r.text = _r.text.replace(
                found_word.group('creator_name'), 
                word_replacement
            )

Лучше избегать изменения набора на самом _p.text, хотя это выполнимо, поскольку это может переформатировать прогон (т. е. жирный, курсивный, подчеркнутый).

person Azhar    schedule 26.06.2020
comment
Ну, это решение работает, но просто удаляет поле и заменяет его текстом, оно не обновляет значение поля. - person Daniel Serrano; 02.07.2020
comment
Извини. Я был сбит с толку, так как вы упомянули ... которые встроены в разделы обложки, верхнего и нижнего колонтитула... Я думал, вы пытаетесь изменить вывод чтения документа - person Azhar; 02.07.2020