Может ли python-docx сохранить цвет и стили шрифта при импорте документов? - PullRequest
2 голосов
/ 26 апреля 2019

По сути, мне нужно написать программу, которая принимает множество файлов .docx и размещает их все в один, упорядоченным определенным образом. У меня есть импорт, работающий через:

import docx, os, glob
finaldocname = 'Midterm-All-Questions.docx'
finaldoc=docx.Document()
docstoworkon = glob.glob('*.docx')
if finaldocname in docstoworkon:
    docstoworkon.remove(finaldocname)   #dont process final doc if it exists

for f in docstoworkon:
    doc=docx.Document(f)

    fullText=[]
    for para in doc.paragraphs:
        fullText.append(para.text)  #generates a long text list

    # finaldoc.styles = doc.styles
    for l in fullText:
        # if l=='u\'\\n\'':
        if '#' in l:
            print('We got here!')
            if '#1 ' not in l:  #check last two characters to see if this is the first question
                finaldoc.add_section()  #only add a page break between questions
        finaldoc.add_paragraph(l)
        # finaldoc.add_page_break
        # finaldoc.add_page_break
finaldoc.save(finaldocname)

Но мне нужно сохранить стили текста, такие как цвета шрифта, размеры, курсив и т. Д., И они не используются в этом методе, поскольку он просто получает необработанный текст и выводит его. Я не могу найти в документации по python-docx ничего о сохранении текстовых стилей или импорте чего-либо, кроме необработанного текста. Кто-нибудь знает, как это сделать?

1 Ответ

1 голос
/ 03 мая 2019

С 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, особенно для того, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...