フォント置換のルールとデフォルトフォントの設定がうまくできない

Aspose.Slides / Words / Cells for Python via .NET それぞれで、 Excel / Word / PowerPoint を PDF に変換する処理を実装しようとしています。
そのなかで、特定のフォントについては別のフォントに置換し、それ以外のフォントについてはデフォルトのフォントに置換するよう設定したいです。
また OS にインストールされているフォントではなく、外部フォントを渡して、それを用いるようにしたいです。

その実装方法、用いるべきフォント名のルールなどご情報をいただけますでしょうか?
以下参考情報となります。

Word については以下の実装でフォントの置換に成功しました。

import aspose.words as aw

# 変換するドキュメント
doc = aw.Document("./files/sample_doc.doc")

# デフォルトのフォント設定
font_settings = aw.fonts.FontSettings()

# フォントの読み込み先の設定
font_settings.set_fonts_folder("./fonts/", True)

# フォント置換の設定
font_settings.substitution_settings.table_substitution.enabled = True
font_settings.substitution_settings.table_substitution.load("Table.xml")
font_settings.substitution_settings.default_font_substitution.enabled = True
font_settings.substitution_settings.default_font_substitution.default_font_name = "IPA Gothic"

# Set font settings
doc.font_settings = font_settings

# 変換・出力
doc.save("word_doc_to_pdf.pdf")
<TableSubstitutionSettings xmlns="Aspose.Words">
    <SubstitutesTable>
        <Item OriginalFont="Yu Gothic" SubstituteFonts="IPA Gothic" />
        <Item OriginalFont="MS Gothic" SubstituteFonts="IPA Gothic" />
        <Item OriginalFont="MS PGothic" SubstituteFonts="IPA Gothic" />
        <Item OriginalFont="Meiryo" SubstituteFonts="IPA Gothic" />
        <Item OriginalFont="Yu Mincho" SubstituteFonts="IPA P Mincho" />
        <Item OriginalFont="MS Mincho" SubstituteFonts="IPA P Mincho" />
        <Item OriginalFont="MS PMincho" SubstituteFonts="IPA P Mincho" />
        <Item OriginalFont="Arial" SubstituteFonts="Noto Sans" />
        <Item OriginalFont="Times New Roman" SubstituteFonts="Noto Serif" />
        <Item OriginalFont="Calibri" SubstituteFonts="Carlito" />
    </SubstitutesTable>
</TableSubstitutionSettings>

しかしながら SubstitutesTable に定義したルールにないフォントをデフォルトフォント IPA Gothic に置換したかったのですが、うまくいきませんでした。
OS にインストールされているフォントが優先されるなど、なにか優位なルールがあるのでしょうか?

続いて PowerPoint 向けに以下のように実装しましたが、フォントの置換は行われませんでした。

import aspose.slides as slides

# Load presentation
with slides.Presentation("./files/sample_pptx.pptx") as presentation:
    # Load source font to be replaced
    source_font = slides.FontData("Meiryo")

    with open("./fonts/IPAfont00303/ipamp.ttf", "rb") as fs:
        font_data = fs.read()

    # load font represented as byte array
    slides.FontsLoader.load_external_font(font_data)

    # Load the replacing font
    # dest_font = slides.FontData("LiberationSerif")
    dest_font = slides.FontData("IPA P Mincho")

    # Add font rule for font replacement
    font_subst_rule = slides.FontSubstRule(source_font, dest_font, slides.FontSubstCondition.ALWAYS)

    # Add rule to font substitute rules collection
    font_subst_rule_collection = slides.FontSubstRuleCollection()
    font_subst_rule_collection.add(font_subst_rule)

    # Add font rule collection to rule list
    presentation.fonts_manager.font_subst_rule_list = font_subst_rule_collection

    # Save the image to disk in JPEG format
    presentation.save("text_rule_based_font_replacement_out.pdf", slides.export.SaveFormat.PDF)

Excel についても同様に実装していく予定ですので、同時に情報をいただけますと幸いです。

よろしくお願いします。

@rmffr

フォント置換の設定について、特定のフォントを別のフォントに置換し、さらにデフォルトフォントを設定する方法について説明します。

Wordでのフォント置換

あなたが示した実装は、Word文書におけるフォント置換の基本的な設定を正しく行っています。特に、FontSettingsを使用してフォントの読み込み先を指定し、フォント置換のルールを設定しています。デフォルトフォントの設定も行われていますが、定義したルールにないフォントがデフォルトフォントに置換されない場合、以下の点を確認してください。

  1. 優先順位: OSにインストールされているフォントが優先されることがあります。これにより、指定したフォントが適用されない場合があります。外部フォントを使用する場合は、必ずそのフォントが正しく読み込まれていることを確認してください。

  2. デフォルトフォントの設定: デフォルトフォントの設定が正しく行われているか確認してください。DefaultFontSubstitutionを使用して、すべての未定義のフォントをデフォルトフォントに置換するように設定できます。

PowerPointでのフォント置換

PowerPointにおいても、フォント置換の設定は行われていますが、フォントが置換されない場合は以下の点を確認してください。

  1. フォントの読み込み: 外部フォントを正しく読み込んでいるか確認してください。FontsLoader.load_external_fontメソッドを使用して、フォントデータを正しく読み込む必要があります。

  2. フォント置換ルールの設定: フォント置換ルールを正しく設定しているか確認してください。FontSubstRuleを作成し、FontSubstRuleCollectionに追加することで、フォント置換のルールを適用します。

Excelでの実装

Excelに関しても同様のアプローチが可能です。Aspose.Cellsを使用して、フォントの置換設定を行うことができます。具体的な実装方法は、WordやPowerPointと同様に、フォント設定を行い、必要なフォントを読み込むことから始めます。

まとめ

  • Wordでは、FontSettingsを使用してフォントの置換とデフォルトフォントの設定を行います。
  • PowerPointでは、外部フォントを正しく読み込み、フォント置換ルールを設定する必要があります。
  • Excelでも同様のアプローチが可能です。

これらの設定を確認し、必要に応じて調整することで、フォント置換が正しく機能するはずです。もし問題が解決しない場合は、具体的なエラーメッセージや挙動を共有していただければ、さらに詳しいサポートが可能です。

@rmffr
Aspose.Cellsにカスタムフォントフォルダとフォント代替を設定する方法については、次のドキュメントを参照してください。

Word について

OS にインストールされているフォントが優先されることがあります。これにより、指定したフォントが適用されない場合があります。外部フォントを使用する場合は、必ずそのフォントが正しく読み込まれていることを確認してください。

とのことでしたが、フォントが正しく読み込まれていることはどのように確認したらいいでしょうか?
例えば Table.xml でいくつかのフォントについて SubstituteFonts="IPA Gothic" と設定しており、 IPA Gothic に置換したいフォントはすべて置換されました。

font_settings.substitution_settings.default_font_substitution.default_font_name = "IPA Gothic"
print(font_settings.substitution_settings.default_font_substitution.default_font_name)

このようにして、 IPA Gothic をデフォルトフォントに設定し、それを出力して確認もしましたが問題はなさそうでした。
OS にインストールされているフォントを優先させないためにはどうすればよいでしょうか?

@rmffr,
Aspose.Slides for Python 24.12を使用したところ、ご指摘の問題を再現することはできませんでした。以下の追加ファイルおよび情報をご提供いただけますでしょうか。

  • サンプルのPowerPointプレゼンテーションファイル
  • 使用されたipamp.ttfファイル
  • 出力されたPDFファイル
  • 変換を実行したオペレーティングシステムのバージョン
  • 使用されたAspose.Slidesのバージョン

@rmffr フォントを1つだけ使いたい場合は、そのフォントをフォルダに入れ、フォントの設定でパスを変更します。

font_settings = aw.fonts.FontSettings.default_instance
font_settings.set_fonts_folder(FONTS_DIR, False)
font_settings.substitution_settings.default_font_substitution.default_font_name = "IPA Gothic"

Aspose.Wordsには、必要なフォントや代用に最適なフォントを見つけるための手順がいくつか用意されています。詳しくはここをクリックしてくださいをご覧ください。

このように実装してみましたが、フォント置換ルールにないフォントは IPA Gothic に置換されませんでした。
./fonts/used/ に直接利用したいフォントの ttf ファイルを配置しています。

import aspose.words as aw

# 変換するドキュメント
doc = aw.Document("./files/sample_doc.doc")

# デフォルトのフォント設定
font_settings = aw.fonts.FontSettings()

font_settings.set_fonts_folder("./fonts/used/", False)
font_settings.substitution_settings.default_font_substitution.default_font_name = "IPA Gothic"

# フォント置換の設定
font_settings.substitution_settings.table_substitution.enabled = True
font_settings.substitution_settings.table_substitution.load("Table.xml")
font_settings.substitution_settings.default_font_substitution.enabled = True

# Set font settings
doc.font_settings = font_settings

# 変換・出力
doc.save("word_doc_to_pdf.pdf")

以下の通りです

  • files.zip (6.7 MB)

    • サンプルの PowerPoint プレゼンテーションファイル
    • 使用した ipamp.ttf ファイル
    • 出力された PDF ファイル
  • 変換を実行した OS バージョン

    • Windows 10 上に WSL: 2.3.26.0 を立てて、そのなかの Docker コンテナ内で実行
    • Docker ベースイメージ: ubuntu:22.04
  • Aspose.Slides のバージョン: 24.9.0

内容を共有したいので、お手数ですがこちらの投稿を public へ変更をお願いします

@rmffr,

このフォーラムのスレッドを公開しました。

Aspose.Slidesに関しては、提供されたフォントは「IPAPMincho」という名称であることにご留意ください。一方、サンプルコード内では「IPA P Mincho」として指定されています。正しいフォント名を指定してみてください。これで問題が解決することを願っています。

IPAPMincho としても解決しませんでした。
また、各ライブラリにおいて設定すべきフォント名にルールはありますでしょうか?

@rmffr default_font_substitution.default_font_nameにあるフォントは、他に最適なフォントがない場合にのみ使用されます。ですから、「IPAゴシック 」のみを使用する必要がある場合は、フォルダに 「IPAゴシック 」フォントを1つだけ入れ、他のフォントは入れないように設定する必要があります。これを達成する他の方法があるかどうか、私たちのチームと相談してみます。

@rmffr 残念なことに、この結果を得るには、フォントを1つだけ入れたフォルダを設定する以外に方法はありません。

@rmffr,
Aspose.Slidesに関しては、残念ながらご指摘の問題を再現することができませんでした。以下のDockerfileを使用しました。

FROM ubuntu:22.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y \
    python3 python3-pip python3-venv \
    libgdiplus \
    wget \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

RUN wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.23_amd64.deb
RUN dpkg -i libssl1.1_1.1.1f-1ubuntu2.23_amd64.deb

WORKDIR /app
COPY . .

RUN pip3 install -r requirements.txt

CMD ["python3", "main.py"]

これが原因を理解する上で、何らかのお役に立てれば幸いです。
私の結果:output.pdf (424.3 KB)

以下のように各フォントについて置換ルールを設定してみましたが、すべて IPAGothic に変換されてしまいました
substitution_rules にあるように、任意のフォントを別のフォントに置換するためにはどうすればよいでしょうか?
実行環境 (Docker イメージ ubuntu:22.04) には IPA Gothic フォントのみをインストールしています

import aspose.slides as slides

# License クラスをインスタンス化
license = slides.License()

# ライセンスファイルのパスを設定
license.set_license("hogehoge")

# デフォルトフォントを設定
loadOptions = slides.LoadOptions(slides.LoadFormat.AUTO)
loadOptions.default_regular_font = "IPAGothic"
loadOptions.default_asian_font = "IPAGothic"

# フォント置換対応リスト
substitution_rules = [
    {
        "source_font_name": "Yu Gothic",
        "dest_font_name": "IPAGothic",
        "dest_font_path": "./fonts/IPAfont00303/ipag.ttf",
    },
    {
        "source_font_name": "MS Gothic",
        "dest_font_name": "IPAGothic",
        "dest_font_path": "./fonts/IPAfont00303/ipag.ttf",
    },
    {
        "source_font_name": "MS PGothic",
        "dest_font_name": "IPAGothic",
        "dest_font_path": "./fonts/IPAfont00303/ipag.ttf",
    },
    {"source_font_name": "Meiryo", "dest_font_name": "IPAGothic", "dest_font_path": "./fonts/IPAfont00303/ipag.ttf"},
    {
        "source_font_name": "Yu Mincho",
        "dest_font_name": "IPAPMincho",
        "dest_font_path": "./fonts/IPAfont00303/ipamp.ttf",
    },
    {
        "source_font_name": "MS Mincho",
        "dest_font_name": "IPAPMincho",
        "dest_font_path": "./fonts/IPAfont00303/ipamp.ttf",
    },
    {
        "source_font_name": "MS PMincho",
        "dest_font_name": "IPAPMincho",
        "dest_font_path": "./fonts/IPAfont00303/ipamp.ttf",
    },
    {
        "source_font_name": "Arial",
        "dest_font_name": "Noto Sans",
        "dest_font_path": "./fonts/Noto_Sans/NotoSans-Regular.ttf",
    },
    {
        "source_font_name": "Times New Roman",
        "dest_font_name": "Noto Serif",
        "dest_font_path": "./fonts/Noto_Serif/NotoSerif-Regular.ttf",
    },
    {
        "source_font_name": "Calibri",
        "dest_font_name": "Carlito",
        "dest_font_path": "./fonts/Carlito/Carlito-Regular.ttf",
    },
]


# Load presentation
with slides.Presentation("./files/source/sample_pptx.pptx", loadOptions) as presentation:
    font_subst_rule_collection = slides.FontSubstRuleCollection()

    for rule in substitution_rules:
        source_font_name = rule.get("source_font_name")
        source_font = slides.FontData("source_font_name")

        dest_font_path = rule.get("dest_font_path")
        with open(dest_font_path, "rb") as fs:
            font_data = fs.read()
        slides.FontsLoader.load_external_font(font_data)

        dest_font_name = rule.get("dest_font_name")
        dest_font = slides.FontData(dest_font_name)

        font_subst_rule = slides.FontSubstRule(source_font, dest_font, slides.FontSubstCondition.ALWAYS)
        font_subst_rule_collection.add(font_subst_rule)

    # Add font rule collection to rule list
    presentation.fonts_manager.font_subst_rule_list = font_subst_rule_collection

    # Save the image to disk in PDF format
    presentation.save("./files/converted/pptx.pdf", slides.export.SaveFormat.PDF)

@rmffr,
次のコード行にご注目ください。

source_font = slides.FontData("source_font_name")

おそらく、ここは次のようにする必要があるようです。

source_font = slides.FontData(source_font_name)

これが皆様のお役に立てれば幸いです。

ありがとうございます
ケアレスミスでした、失礼いたしました

修正したところ一部成功しましたが、 IPA P Mincho への変換はできませんでした
フォント名の指定が間違えているのかもしれません

指定すべきフォント名はどのようにすればよいでしょうか?
また、それはどこを参照すればわかるものでしょうか?

@rmffr,
UbuntuでTTFファイルからフォント名を確認するには、以下のコマンドを使用できます。

fc-scan /path/to/font.ttf

このコマンドはフォントに関する詳細情報を表示します。「family:」で始まる行を探してください。これがフォント名です。

ありがとうございます
確認して修正しましたが、解決しませんでした

Yu Gothic, MS Gothic, MS PGothic, Meiryo, Yu Mincho, MS PMincho がすべて IPAGothic になってしまいます
loadOptions.default_regular_fontloadOptions.default_asian_font を IPAGothic としている部分がそのように効いているのかもしれません
これらを設定せずに実行すると、上記のフォントはすべて IPAPMincho になります

元の PowerPoint ファイルと変換後の PDF ファイルを添付します
files.zip (48.9 KB)

@rmffr,
日本語には、漢字、ひらがな、カタカナの表示に特化した「Noto Sans JP」や「Noto Serif JP」というフォントのサブセットが使用されていることにご注意ください。

Carlitoフォントは日本語をサポートしていません。Carlitoはラテン文字、ギリシャ文字、キリル文字のアルファベットを含むフォントですが、日本語に必要な漢字、ひらがな、カタカナの文字は含まれていません。