96499


[Python-pptx](https://python-pptx.readthedocs.io/en/latest/)
で既存のテキストフレームに対して日本語テキストを挿入し、そのフォントとサイズを変更したいです。  
しかし、挿入するテキストが英語の場合フォントが反映されますが、挿入するテキストが日本語の場合フォントの反映がされません。解決法を教えてください。

また、下記のコードはWSL上で実行していますが、以下の記事を参考にWSL上でWindowsのフォントを指定できるようにしています。

[WSLでWindows10のフォントを使用する](https://qiita.com/query1000/items/6ea7665529b022eb5f45)

以下該当コードです。  
※該当処理部分のみを記載しています。

[code]

    ～～～ファイル読み込み等省略～～～
    for sp in slide.shapes:
        if not sp.has_text_frame:
            continue
        # 編集したいテキストフレームを絞り込み
        if str(sp.shape_type) == 'TEXT_BOT(17)':
            textFrame = sp.text_frame
            if str(textFrame.text) != '':
                pg = sp.text_frame.paragraphs[0]
                rn = pg.runs[0]
                rn.font.name = 'Meiryo UI'
                rn.font.size = Pt(10)
    ～～～ファイル保存等省略～～～
    
[/code]


CC BY-SA 4.0
2023-10-14T09:05:10.717
96490
2023-10-16T02:35:04.027
2023-10-15T04:49:03.170
3060
59461
question
python wsl font
Python-pptxで日本語フォントを書式設定できない


手元の環境で`a:ea`タグの`typeface`属性を直接書き込むことでフォント名を反映できました。  
下記はWindows11、Python 3.11.0、python-pptx 0.6.22上で動作を確認したサンプルコードです。  
WSLでは動作確認していません。

**サンプルコード**

[code]

    from pptx import Presentation
    from pptx.util import Pt
    from pptx.enum.shapes import MSO_SHAPE_TYPE
    from pptx.oxml.ns import qn
    from lxml import etree
    
    prs = Presentation("hoge.pptx")
    slide = prs.slides[0]
    for sp in slide.shapes:
        if not sp.has_text_frame:
            continue
        # 編集したいテキストフレームを絞り込み
        # if str(sp.shape_type) == 'TEXT_BOT(17)': # 'TEXT_BOX (17)'の間違い？
        if sp.shape_type == MSO_SHAPE_TYPE.TEXT_BOX:
            textFrame = sp.text_frame
            if str(textFrame.text) != '':
                pg = sp.text_frame.paragraphs[0]
                rn = pg.runs[0]
                rn.font.size = Pt(10)
                #`a:ea`タグの`typeface`属性を直接書き込む
                rpr = rn._r.get_or_add_rPr()
                ea = etree.SubElement(rpr, qn('a:ea'))
                ea.set('typeface',"Meiryo UI")
                #ea.set('typeface',"UD デジタル 教科書体 N-B") # 日本語フォント名もOK
    prs.save('fuga.pptx')
    
[/code]

**参考資料**

  * [Adding highlighting to a run in python-pptx](https://stackoverflow.com/q/61922353)
  * [Change font name not working for asian characters. #768](https://github.com/scanny/python-pptx/issues/768)
    * からの中国語リンク [已解决：Python-pptx中文字体](https://zhuanlan.zhihu.com/p/548039429)
  * [XML specimens](https://python-pptx.readthedocs.io/en/latest/dev/analysis/txt-font-typeface.html#xml-specimens)  
コメントにあるリンク

**補足**

`a:ea`タグがない状態で`rn.font.name`や`rn.font.NameFarEast`を追記しても左記のタグは追加されませんでした。  
QAサイトではタグを直接書き換える方法を多く見かけるので、`python-pptx`はまだアジアのフォントに対応できていないのかもしれません。


CC BY-SA 4.0
2023-10-16T02:35:04.027
96499
2023-10-16T02:35:04.027
9820
96490
answer