【问题标题】:Convert EMF/WMF files to PNG/JPG将 EMF/WMF 文件转换为 PNG/JPG
【发布时间】:2012-12-15 17:57:32
【问题描述】:

我收到一份带有 Word docx 文档的表单上传。我成功完成了所有解析。然后我必须在网络上显示该 Word 文档。

我现在遇到的问题是我嵌入了 EMF 文件(PIL 库识别为 WMF 格式),我不知道如何将它们转换为可以在网络上显示的东西(任意选择PNG)。

代码有点简单:

im = PIL.Image.open(StringIO.StringIO(data))
fmt = im.format
如果(fmt == 'WMF'):
  fmt = 'PNG'
  输出 = StringIO.StringIO()
  im.save(输出,格式=fmt)
  数据 = 输出.getvalue()
  输出.close()
return ''''''.format(fmt, base64.encodestring(data))

我得到的错误是:

IOError: cannot find loader for this WMF file

这些 Word 文档来自普通用户,他们可能只是从网络上剪切和粘贴图像或从文件中插入。

在 linux 系统上是否有适合我的解决方案?

谢谢。

编辑:

为了我的辩护,我尝试将该文档上传到谷歌驱动器并且图像也没有显示。也许没有简单的解决方案?

【问题讨论】:

  • 也许libwmf + ImageMagick?

标签: python python-imaging-library


【解决方案1】:

点安装枕头

从 PIL 导入图片

Image.open("xxx.wmf").save("xxx.png")

【讨论】:

  • 这对我来说就像一个魅力。如果您有一个 .emz 文件,看起来您需要先使用 gzip 打开该文件。
【解决方案2】:

我发现使用 Wand 包进行这种转换更容易。我尝试了以前的建议但没有成功。所以这就是我所做的: (顺便说一句,我想将所有 '.wmf' 文件转换为 pdf)

import os

from wand.image import Image as wima

folder='C:/Users/PythonLover/Pictures/pics'

for oldfilename in os.listdir(folder):

    if oldfilename.endswith(".wmf"):

        with wima(filename=folder+'/'+oldfilename) as img:

            newfilename = oldfilename.split('.')[0]+'.pdf'

            newfilename = folder+'/'+newfilename

            img.format = 'pdf'

            img.save(filename=newfilename)

【讨论】:

  • 这个答案对我有用(+1),尽管使用 wand v0.4.4,结果还有很多不足之处。我们可以希望未来的版本会做得更好。
【解决方案3】:

您需要了解您正在处理的内容,才能了解为什么您尝试做的事情有问题。 WMF 文件(或更新的 EMF 和 EMF+ 格式)需要 Windows GDI 来呈现它所描述的图像。因此,当您在 Windows 之外转换此格式时,没有简单的解决方案,因为您需要复制 GDI API。

一种解决方案是使用unoconv 工具,该工具依赖于 OpenOffice/LibreOffice 的 UNO 绑定。第二种解决方案将使用pyemf 模块对输入进行解码,然后使用第二个工具(由您完成)对其进行渲染。

【讨论】:

  • 如果在我的 Linux 机器上使用 LibreOffice 打开,图像不会显示在 Word docx 文件中。
  • 太糟糕了,然后获得更好的 GDI 复制。
  • Libgdiplus (mono-project.com/Libgdiplus, github.com/mono/libgdiplus) 是您所追求的更好的 GDI 复制。
  • 我尝试了 pastebin.com/qcgH7usU 中的 libgdiplus,但它似乎有问题。它不能处理每个 GDI 调用(这是我所期望的),但随后尝试使用 gdip_save_bmp_image_to_file 保存为 bmp 会进入未定义行为的领域。我可能也遗漏了一些东西,但只需更改代码以加载 png 图像并另存为 bmp 即可。令人惊讶的是,zamzar.com 有一个在线服务可以将 EMF 转换为其他格式。鉴于这种情况,如果他们在 Windows 之外进行此转换,我会感到惊讶。
  • 感谢您的帮助...但我要做的是实际从 Word 文档中获取图像并将其转换为 PNG/JPEG。另外,感谢您的 pastebin 代码,但我正在研究 Python 解决方案。此时,我只是抛出“不支持的图像格式”。
【解决方案4】:

您可以使用libwmf 将图像转换为SVG,然后使用pyrsvg 转换为PNG (described in another question)

我还没有找到 libwmf 项目网站,但 Debian(和 Ubuntu)有包 libwmf-bin,其中包含 wmf2svg 实用程序。

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 2010-12-18
    • 2011-10-10
    • 2020-01-29
    • 2020-11-01
    • 2019-10-27
    • 2013-02-10
    • 2012-01-25
    相关资源
    最近更新 更多