使用aspose.slides时将ppt逐页转换为图像时产生乱码

之前成功设置导入了外部字体将word转换为图像,现在希望将ppt转为图像时依然遇到了输出图片中中文乱码的问题,代码如下:

import os
import aspose.slides as slides

输入PPT文件路径

input_path = "/home/code/test.pptx"
output_dir = "/home/code/output_images"
font_folder = "/home/code/Fonts/"
os.makedirs(output_dir, exist_ok=True)

加载PPT文件

presentation = slides.Presentation(input_path)
slides.FontsLoader.load_external_fonts([font_folder])

for i, slide in enumerate(presentation.slides):
    output_path = os.path.join(output_dir, f"slide_{i+1}.jpeg")
    slide_image = slide.get_image(1, 1)
    slide_image.save(output_path, slides.ImageFormat.JPEG)

    print(f"PPT {i+1} 已保存为图像:{output_path}")

slides.FontsLoader.clear_cache()

这样会在这一句 slide_image = slide.get_image(1, 1)报出RuntimeError: Proxy error(ArgumentException): Font ‘?’ cannot be found.的错误
在官方网站搜索过了没有找到合理的解决办法,请问如何解决?

@byp0322

在使用Aspose.Slides将PPT逐页转换为图像时,如果遇到中文乱码的问题,通常是由于缺少相应的字体导致的。您提到已经成功导入了外部字体用于Word转换,但在处理PPT时仍然出现了字体找不到的错误。

为了解决这个问题,请确保以下几点:

  1. 字体路径:确认您提供的字体文件夹路径是正确的,并且该文件夹中包含了所需的中文字体文件。

  2. 加载字体:在加载PPT文件后,确保调用FontsLoader.load_external_fonts([font_folder])来加载外部字体。您已经在代码中做到了这一点。

  3. 检查字体:在转换每一页之前,确保所需的字体已经被正确加载。您可以在转换之前打印出当前使用的字体,以确认它们是否存在。

  4. 异常处理:在调用slide.get_image(1, 1)时,如果仍然出现RuntimeError: Proxy error(ArgumentException): Font '?' cannot be found.的错误,您可以考虑使用try-catch语句来捕获异常,并打印出更详细的错误信息,以便进行调试。

以下是您代码的一个改进版本,添加了异常处理:

import os
import aspose.slides as slides

# 输入PPT文件路径
input_path = "/home/code/test.pptx"
output_dir = "/home/code/output_images"
font_folder = "/home/code/Fonts/"
os.makedirs(output_dir, exist_ok=True)

# 加载PPT文件
presentation = slides.Presentation(input_path)
slides.FontsLoader.load_external_fonts([font_folder])

for i, slide in enumerate(presentation.slides):
    output_path = os.path.join(output_dir, f"slide_{i+1}.jpeg")
    try:
        slide_image = slide.get_image(1, 1)
        slide_image.save(output_path, slides.ImageFormat.JPEG)
        print(f"PPT {i+1} 已保存为图像:{output_path}")
    except Exception as e:
        print(f"转换第 {i+1} 页时出错: {str(e)}")

slides.FontsLoader.clear_cache()

通过这种方式,您可以更好地捕获和理解错误的原因,并进行相应的调整。

如果问题仍然存在,建议检查Aspose的官方文档或支持论坛,可能会有其他用户遇到类似的问题并分享了解决方案。

我应当如何检查字体是否被加载?
ppt本身内容文字是使用等线字体,我的Fonts文件夹中包含Fonts/DENG.TTF我理解应该是等线字体
加入try exception逻辑后依然是错误为Proxy error(ArgumentException): Font ‘?’ cannot be found.
在之前使用word转换图象是按照如下方法进行了设定:
切换到Fonts文件夹下然后执行以下三个命令

sudo mkfontscale
sudo mkfontdir
fc-cache -fv /home/code/Fonts/

@byp0322,
感谢您联系免费支持。请注意,应在加载演示文稿之前加载外部字体。

slides.FontsLoader.load_external_fonts([font_folder])
presentation = slides.Presentation(input_path)

Customize PowerPoint Fonts in Python|Aspose.Slides for Python Documentation

希望这能帮助到您。

按照您提供的修改方法修改了

import os
import aspose.slides as slides

输入PPT文件路径

input_path = "/home/code/test.pptx"
output_dir = "/home/code/output_images"
font_folder = "/home/code/Fonts/"
os.makedirs(output_dir, exist_ok=True)
slides.FontsLoader.load_external_fonts([font_folder])
presentation = slides.Presentation(input_path)

for i, slide in enumerate(presentation.slides):
    output_path = os.path.join(output_dir, f"slide_{i+1}.jpeg")
    try:
        slide_image = slide.get_image(1, 1)
        slide_image.save(output_path, slides.ImageFormat.JPEG)
        print(f"PPT {i+1} 已保存为图像:{output_path}")
    except Exception as e:
        print(f"转换第 {i+1} 页时出错: {str(e)}")

slides.FontsLoader.clear_cache()

依然出现报错

转换第 1 页时出错: Proxy error(ArgumentException): Font ‘?’ cannot be found.
转换第 2 页时出错: Proxy error(ArgumentException): Font ‘?’ cannot be found.
转换第 3 页时出错: Proxy error(ArgumentException): Font ‘?’ cannot be found.
转换第 4 页时出错: Proxy error(ArgumentException): Font ‘?’ cannot be found.
转换第 5 页时出错: Proxy error(ArgumentException): Font ‘?’ cannot be found.

我的Fonts文件夹结构如下
image.png (10.5 KB)

@byp0322,
很抱歉您遇到此问题。请提供以下附加文件和信息:

  • PowerPoint 演示文稿示例文件
  • 执行代码时所用操作系统版本
  • 您正在使用的 Python 版本
  • 您正在使用的 Aspose.Slides 版本

貌似不支持上传pptx格式的文件,我先上传pdf,麻烦您下载转换一下格式,
6.5组会.pdf (634.2 KB)

操作系统版本Description: Ubuntu 24.04.2 LTS,python版本Python 3.11.13,slides版本25.5.0,

@byp0322,
感谢您提供的额外信息。

请把 PPTX 文件压缩成 ZIP 并上传该压缩包可以吗?

6.5组会.zip (600.8 KB)

@byp0322,
您发送了已压缩的 PDF 文件。能否请您压缩并分享原始的 PPTX 文件?

zuhui.zip (806.6 KB)

非常抱歉,给您提供了pptx文件,希望您能尽快解决

@byp0322,
我需要一些时间来检查此问题。我会尽快回复您。

@byp0322,

感谢您的耐心等待。我仍无法重现您描述的错误。能否请您将 “Fonts” 文件夹中的字体压缩并分享?

好的,我使用

sudo mkfontscale
sudo mkfontdir
fc-cache -fv /home/code/Fonts/

以下命令导入的Fonts文件夹太大,我试试分批提供
但是aspose的函数还会不会同时访问系统中的默认字体,默认字体库是这个:
dejavu.zip (4.9 MB)

您那边无法复现错误是指可以正确转换吗

我Fonts文件夹里的字体文件无法上传,显示文件太大,可能是中文字体?它显示的上限为48M,但我的单个zip在我的电脑上看也就只有20M,如何解决,能否提供其他上传途径?

或者您能否提供一份样例代码并且提供一下导入的方法呢

@byp0322,

目前我了解到的问题在于,您提供的代码引发了以下错误:

转换第 1 页时出错: Proxy error(ArgumentException): Font ‘?’ cannot be found.
转换第 2 页时出错: Proxy error(ArgumentException): Font ‘?’ cannot be found.
转换第 3 页时出错: Proxy error(ArgumentException): Font ‘?’ cannot be found.
转换第 4 页时出错: Proxy error(ArgumentException): Font ‘?’ cannot be found.
转换第 5 页时出错: Proxy error(ArgumentException): Font ‘?’ cannot be found.

您能确认这一点吗? 您能否也将问题隔离,并提供精确的逐步说明以复现该问题?

您可以将包含文件的归档上传到文件存储服务(例如 Google Drive 或 Dropbox),然后分享链接。

我的执行步骤就是首先安装了aspose.sildes库,然后由于缺少依赖安装了sudo apt-get install -y libgdiplus,首先先不导入字体解析,不产生报错但解析效果如下,其中一张转换图片,中文字符全是乱码:
slide_1.jpeg (50.0 KB)
然后加入设置字体的部分后产生上述报错
这个是字体库的googledrive连接,看是否能打开

@byp0322,
感谢您提供的问题详情。我需要一些时间来检查此问题。我会尽快回复您。