Python aspose.words docx包含复杂表格和图表时转为pdf失败

在使用 aspose.words 转换docx为pdf文件格式时,使用python fastapi 框架启动多个工作进程时会直接导致进程异常退出
代码示例
import aspose.words as aw
words_license = aw.License()
words_license.set_license(‘./Aspose.TotalProductFamily.lic’)
try:
doc = aw.Document(“./123.docx”)
doc.save(“./123.pdf”, aw.SaveFormat.PDF)
except Exception as e:
print(f"转换失败: {e}")
框架启动命令
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2

@chenjiarong

在使用 Aspose.Words 将 DOCX 文件转换为 PDF 时,如果遇到进程异常退出的问题,可能是由于多进程环境下的资源竞争或内存管理问题。以下是一些建议来解决这个问题:

  1. 单进程测试:首先,尝试在单进程模式下运行代码,确认转换是否成功。这可以帮助排除多进程引起的问题。

  2. 资源管理:确保在转换过程中正确管理资源,特别是文件句柄和内存。可以在转换后显式释放文档对象。

  3. 异常处理:在代码中添加更详细的异常处理,以捕获可能的错误信息,帮助诊断问题。

  4. 更新库:确保使用的是 Aspose.Words 的最新版本,以修复已知的错误。

  5. 日志记录:在转换过程中添加日志记录,以便跟踪进程的状态和可能的错误。

以下是一个改进的代码示例,增加了异常处理和资源管理:

import aspose.words as aw

words_license = aw.License()
words_license.set_license('./Aspose.TotalProductFamily.lic')

try:
    doc = aw.Document("./123.docx")
    doc.save("./123.pdf", aw.SaveFormat.PDF)
except Exception as e:
    print(f"转换失败: {e}")
finally:
    # 确保文档对象被释放
    doc = None

如果问题仍然存在,建议在 Aspose 的支持论坛上寻求帮助,提供详细的错误信息和环境配置,以便获得更具体的支持。

目前你提供的这个方案是不能解决问题的,需要具体分析下是哪里的问题,怀疑是有兼容性差异

如果是1个工作进程的情况下,不会出现进程异常崩溃的情况,但是内容保存的并不完整,有很多的缺失

@chenjiarong Aspose.Words 是多线程安全的,只要同一时间只有一个线程处理一个文档。这是一个线程处理一个文档的典型情况。不同的线程可以同时安全地处理不同的文档。因此,请确保只有一个线程在一个特定的 Document 对象实例上工作。

也许您需要使用一个 Worker 和多个线程。

目前的代码情况就是一个工作线程处理一个文件 ,而且是当前任务只处理当前的转换工作 ,出现了异常终止的情况

@chenjiarong 我会检查一下,然后给你答复。

另外如果工作进程调整为1 则可以正常生成 ,但是有差异的
启动命令为
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 1 则正常生成
另外 docx文件中 为


保存为pdf后则变成了

@chenjiarong 您遇到的错误与在 Aspose.Words 中使用多个 Worker(“–worker 2”)有关。出现这种情况的原因是

  1. 在模块加载时,Aspose.Words 许可证初始化会发生;
  2. 多个 Worker 会创建单独的进程,每个进程都会尝试初始化许可证;
  3. 进程分叉会导致 Aspose 许可证和文件操作出现问题。

您可以尝试在代码内部操作多个线程,而不是在 uvicorn 端。

我创建了一个简单的应用程序

main.py.zip (1.6 KB)

和使用

pip install hypercorn
hypercorn main:app --bind 0.0.0.0:8000 --workers 2

一切运行正常。这个问题与 Aspose.Words 无关,需要对程序进行额外配置,或者使用不同的工具。

我没有发现文档中的表格有任何问题:

您可能会遇到这样的问题,因为文档中使用的字体在文档转换环境中不可用。要创建准确的文档布局,需要使用字体。如果 Aspose.Words 找不到文档中使用的字体,就会使用字体替代。这可能会因字体度量的不同而导致布局差异。您可以实现IWarningCallback,以便在执行字体替换时获得通知。
以下文章可能对您有用:
https://docs.aspose.com/words/python-net/specifying-truetype-fonts-location/
https://docs.aspose.com/words/python-net/installing-truetype-fonts-on-linux/

表格错乱的问题我们在仔细对比下看看哪里的差异性
请教下, 有计划让你们的核心库支持多个 Worker工作吗 ?这样实用性能进一步加强

@chenjiarong Python 版本是作为 .NET 版本特殊构建的包装而生成的。遗憾的是,目前还没有这方面的估算。