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

以下の通りです

  • 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はラテン文字、ギリシャ文字、キリル文字のアルファベットを含むフォントですが、日本語に必要な漢字、ひらがな、カタカナの文字は含まれていません。

Arial を Noto Sans に、 Times New Roman を Noto Serif に、 Calibri を Carlito に変換することはできているように見えます
それぞれ “Arial”, “Times New Roman”, “Calibri” という文字列が当該フォントに変換されていると思います
特にこれらはアルファベットのみなので、期待通りの動作です

一方、 “游ゴシック”, “MS ゴシック”, “MS Pゴシック”, “メイリオ” という文字列は IPA Gothic に、 “游明朝”, “MS 明朝”, MS P明朝" という文字列は IPA P Mincho に変換されてほしいのです
IPA Gothic と IPA P Mincho はそれぞれ感じ、ひらがな、カタカナをサポートしており、それぞれのフォントに置換されることを期待しています

しかしながら、添付した画像の部分については、すべてが IPA Gothic に変換されてしまっているように見えます
“游明朝”, “MS 明朝”, MS P明朝" という文字列は IPA P Mincho に変換されてほしいところでしたが、期待結果が得られませんでした

また、その他の部分に含まれる日本語(例えば “に置換” など)が、 IPA Gothic になることは期待通りです

Noto Sans, Noto Serif, Carlito が日本語をサポートしてないことは問題ありません
また、 Noto Sans JP, Noto Serif JP は利用しない方針です

よろしくお願いします
image.png (7.5 KB)

@rmffr,
私はインターネットから、あなたが使用しているすべてのフォントをダウンロードし、上記で提供いただいた(修正済みの)サンプルコードを実行しました。
問題の理解を深めるために、このサンプルのPowerPointプレゼンテーション(sample.zip)を使用しました。
フォントの置き換えは期待通りに正しく行われました(compare.png)。
このプレゼンテーションを使用して、あなたの結果を再度ご確認ください。もし問題が続く場合は、フォントへのパス指定が正しいかをお確かめください。

いただいたサンプルの PowerPoint ファイルでは同じ期待結果が得られました
そのためパス指定には誤りはなさそうです

こちらから共有させていただいたファイルについて、 “游明朝”, “MS 明朝”, MS P明朝" という文字列は変わらず IPA P Mincho に変換されません
お渡ししたファイルでも動作を確認していただけると助かります
また、ファイルによって変換結果が変わる可能性はありますでしょうか?

よろしくお願いします

@rmffr,
現時点では、何が問題なのか理解できていません。上でお示ししたスクリーンショットでは、Yu Gothic、MS Gothic、MS PGothic、MeiryoのフォントがIPAGothicに、Yu Mincho、MS Mincho、MS PMinchoのフォントがIPAPMinchoに、ArialフォントがNoto Sansに、Times New RomanフォントがNoto Serifに、CalibriフォントがCarlitoに置き換わっていることが確認できます。どの点が問題でしょうか?スクリーンショットをご提供のうえ、問題箇所を示していただけますか? 私の誤解についてお詫びいたします。

添付しました画像の赤枠で囲った部分が IPA P Mincho に変換されて欲しい部分になります
コメント 2024-12-19 140818.png (36.9 KB)

また、変換元と変換後のファイルを共有します
files.zip (48.9 KB)

@rmffr,
詳細な説明をありがとうございます。ご指摘のフォント置換問題を再現いたしました。ご不便をおかけして申し訳ございません。

内部の問題追跡システムに以下の新しいチケットを作成しました。修正はFree Support Policiesに記載された条件に従って提供いたします。
Issue ID(s): SLIDESPYNET-243

優先的なサポートが必要な場合は、Paid Support Servicesをご利用いただけます。また、有料サポート管理チームへの直接アクセスも含まれています。

@rmffr,
開発者がこの件を調査した結果、プレゼンテーションファイル内でのフォント名の表現方法が原因で、フォントの置換が失敗していることがわかりました。プレゼンテーション内では、ファイルに保存されている通りフォント名が日本語で記載されており、次のようになっています。

  • 「游明朝」は「Yu Mincho」
  • 「MS 明朝」は「MS Mincho」
  • 「MS P明朝」は「MS PMincho」

これらのローカライズされたフォント名は、フォント置換ルールで使用しているラテン文字表記の名前と一致しないため、Aspose.Slides はフォント名が正確に一致しない限り置換を適用できません。

さらに、元のフォント(游明朝やMS明朝など)がシステムにインストールされていない場合、Aspose.Slides はその内部構造、言語、エンコードを検出できません。その結果、指定されているラテン文字表記の名前に自動的にマッピングすることができません。

この問題を解決するには、プレゼンテーション内に記載されている正確な日本語のフォント名を使用するように置換ルールを更新してください。

    {
        "source_font_name": "游明朝",
        "dest_font_name": "IPAPMincho",
        "dest_font_path": "fonts/ipamp.ttf",
    },
    {
        "source_font_name": "MS 明朝",
        "dest_font_name": "IPAPMincho",
        "dest_font_path": "fonts/ipamp.ttf",
    },
    {
        "source_font_name": "MS P明朝",
        "dest_font_name": "IPAPMincho",
        "dest_font_path": "fonts/ipamp.ttf",
    },

プレゼンテーション内でシステム上に存在せず、置換されたフォントをプログラム上で検出するには、FontsManager.get_substitutions() メソッドを使用できます。

for font_substitution in pres.fonts_manager.get_substitutions():
    print(font_substitution.original_font_name, "->", font_substitution.substituted_font_name)

これにより、意図した置換が適用されているか、あるいは (例: IPAGothic のような) フォールバックフォントが使用されているかを確認できます。