С python-docx работать немного сложно, но это возможно.
См. это объяснение , чтобы сначала понять некоторые проблемы со стилями и Word.
Долгий путь
Когда вы читаете файл как Document()
, он вводит все paragraphs
, и внутри каждого из них есть runs
. Эти runs
являются кусками текста с одинаковым стилем, прикрепленным к ним.
Вы можете узнать, сколько существует параграфов или прогонов, выполнив len()
для объекта, или вы можете просмотреть их, как вы делали в своем примере с paragraphs
.
Вы можете проверить стиль любого данного абзаца, но у прогонов могут быть другие стили, чем у абзаца в целом, поэтому я бы пропустил сам прогон и проверил стиль там, используя paragraphs[0].runs[0].style
, который даст вам объект стиля. Вы можете осмотреть объект font
за пределами того, что сообщит вам ряд атрибутов , таких как size
, italic
, bold
и т. Д.
Теперь к длинному решению:
Сначала вы должны создать новый пустой абзац, затем вы должны пойти и add_run()
один за другим со своим текстом из оригинала. Для каждого из них вы можете определить атрибут style
, но это должен быть именованный стиль , как описано в первой ссылке. Вы не можете применить объект стиля напрямую, так как он не будет копировать атрибуты. Но есть способ обойти это: проверьте атрибуты, которые вам нужны для копирования в вывод, а затем убедитесь, что ваш новый прогон применяет те же атрибуты.
doc_out = docx.Document()
for para in doc.paragraphs:
p = doc_out.add_paragraph()
for run in para.runs:
r = p.add_run(run.text)
if run.bold:
r.bold = True
if run.italic:
r.italic = True
# etc
Очевидно, что это неэффективно и не очень хорошее решение, но оно будет работать, чтобы убедиться, что вы скопировали стиль соответствующим образом.
Добавить новые стили
Существует способ добавить стили по имени , но поскольку маловероятно, что в документе Word, из которого вы получаете текст и стили, используются именованные стили (а не просто полужирный и т. Д. к словам, которые вы хотите), вероятно, будет долгий путь к добавлению множества слегка отличающихся стилей или иногда даже тех же самых.
К сожалению, это лучший ответ, который у меня есть для вас, как это сделать. Работа с документами Word, Outlook и Excel не очень удобна в Python, особенно для того, что вы пытаетесь сделать.