Почему мое свойство font.name не влияет на шрифты в ppt, созданные с использованием Python-pptx? Я всегда получаю ариальный шрифт - PullRequest
0 голосов
/ 09 ноября 2019

Итак, я пытаюсь написать какую-нибудь программу для преобразования html в pptx с использованием Python. Я использую некоторый код для анализа файла, а затем форматирую текст на уровне выполнения.

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

Но независимо от того, что я делаю (Paragraph.font.name или run.font.name), я всегда получаю шрифт Arial во втором текстовом фрейме.

Iя пытался обновить имена шрифтов, циклически перебирая tf.paragraphs, а также циклически повторяя все прогоны (параграфы), кажется, ничего не работает.

Вот моя функция, которую я использую для установки шрифта

def setFont(font,tags,fontStyle,size):
    font.language_id = MSO_LANGUAGE_ID.HEBREW
    font.size = Pt(size)
    font.name = fontStyle
    for tag in tags:
        if tag == 'b':
            font.bold = True
        elif tag == 'i':
            font.italic = True
        elif tag == 'u':
            font.underline = True
    return font

и вот моя основная вызывающая функция (я удалил некоторые другие вызовы, которые не имеют прямого отношения к python-pptx)

def makeSlide(prs,title,body,fontStyle,titleSize,bodySize):

    #Add title Slide
    blank_slide_layout = prs.slide_layouts[6]
    slide = prs.slides.add_slide(blank_slide_layout)
    width = height = Inches(8)

    txBox = slide.shapes.add_textbox(Inches(1), Inches(0.5), Inches(8), Inches(1))
    tf = txBox.text_frame

    tf.text = title

    tf.paragraphs[0].font.size=Pt(titleSize)
    tf.paragraphs[0].font.bold = True
    tf.paragraphs[0].font.color.rgb = RGBColor(255,0,0)
    tf.paragraphs[0].font.name = fontStyle
    tf.paragraphs[0].alignment = PP_ALIGN.CENTER

    styles = MY_CUSTOM_HTML_BODY_PARSER() #Removed this part from here, its just a parser which gives output in a desired format



    #Start 2nd textbox for body
    txBox2 = slide.shapes.add_textbox(Inches(0.5), Inches(1.7), Inches(9), Inches(5.5))
    tf = txBox2.text_frame
    tf.clear()
    tf.word_wrap = True
    tf.paragraphs[0].text = ''
    tf.paragraphs[0].font.name = fontStyle
    paragraph = tf.add_paragraph()
    paragraph.alignment = alignment

    #Loop over styles (Tag info and render pptx accordingly)
    new_line = True
    level = 0
    number = 0
    for _ in styles:
     #Can ignore this part, I'm just checking to see if I have to go on a new line or not
        if _ == '\n':
            paragraph = tf.add_paragraph()
            paragraph.alignment = alignment
            new_line = True
        else:
            tags = _[1]
        #Can also ignore this, I'm checking to see if I have to be on next level in lists or not 
        #(I use custom bullet function, since python-pptx doesn't have a function for numbered bullets.
            if _[1].count('ul') > 1 or _[1].count('ol') > 1 or _[1].count('ul') + _[1].count('ol') > 1:
                level = 1
                if new_line:
                    paragraph.level = level
                    level = 0
                else:
                    paragraph = tf.add_paragraph()
                    paragraph.alignment = alignment
                    paragraph.level = level
                    level = 0
                    new_line = True
            if new_line:
                run = paragraph.add_run()
            #Custom bullet function as u can see I send in fontStyle here and apply style inside function
                run,number = addBullets(run,tags,bodySize-3,number,fontStyle)
                new_line = False

            run = paragraph.add_run()
            run.text = parser.words_styles[_[0]][0]
            font = run.font
            #SetFont function Defined above
            font = setFont(font,tags,fontStyle,bodySize)
            new_line = False

    for paragraph in tf.paragraphs:
        paragraph.font.name = fontStyle
        for run in paragraph.runs:
            if run.font.name != fontStyle:
                print(run.text)
    #return slide
    return slide

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

...