python - 使用 wand 将图像转换为 pdf 在几次成功后失败

标签 python pdf wand

我的应用程序运行了几次,然后在每个 pdf 上都出现错误。这是我收到的错误:

Exception TypeError: TypeError("object of type 'NoneType' has no len()",) in <bound method Image.__del__ of <wand.image.Image: (empty)>> ignored

这是我使用的功能:

def read_pdf(file):
    pre, ext = os.path.splitext(file)
    filename = pre + '.png'

    with Image(filename=file, resolution=200) as pdf:
        amount_of_pages = len(pdf.sequence)

        image = Image(
            width=pdf.width,
            height=pdf.height * amount_of_pages
        )

        for i in range(0, amount_of_pages):
            image.composite(
                pdf.sequence[i],
                top=pdf.height * i,
                left=0
            )

        image.compression_quality = 100
        image.save(filename=filename)
        logging.info('Opened and saved pdf to image: \'' + file + '\'.')
        return filename

此函数可以正确地将 pdf 转换为图像,但经过两三次后,每次都会崩溃并抛出该异常。如果我重新启动 python 脚本,它会再次运行几次。

最佳答案

该错误是由于系统资源不足引起的。 Wand 调用 ImageMagick 库;反过来,将解码工作传递给 Ghostscript 委托(delegate)。 Ghostscript 非常稳定,但确实使用了大量资源,并且并行运行时不太满意(我的观点)。

Any help?

  • 尝试构建一个允许在 PDF 转换之间干净关闭的解决方案。就像队列工作人员,或 脚本。即使是最小的资源泄漏也可能会迅速失控。
  • 避免调用 wand.image.Image.sequance。已报告一些已知的内存泄漏问题。尽管许多问题已得到修复,但 PDF 任务似乎仍然存在问题。

从发布的代码来看,您似乎只是用给定 PDF 的所有页面创建了一个高图像。我建议直接移植 MagickAppendImages

import ctypes
from wand.image import Image
from wand.api import library

# Map C-API to python
library.MagickAppendImages.argtypes = (ctypes.c_void_p, ctypes.c_bool)
library.MagickAppendImages.restype = ctypes.c_void_p

with Image(filename='source.pdf') as pdf:
    # Reset image stack
    library.MagickResetIterator(pdf.wand)
    # Append all pages into one new image
    new_ptr = library.MagickAppendImages(pdf.wand, True)
    library.MagickWriteImage(new_ptr, b'output.png')
    library.DestroyMagickWand(new_ptr)

关于python - 使用 wand 将图像转换为 pdf 在几次成功后失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48643134/

相关文章:

python - 在树莓派上用 C++ 嵌入 python

pdf - 同一个 PDF 文档的打印方式与在屏幕上查看的方式是否不同?

Python Wand 将 pdf 转换为黑色图像

python - 导入错误 : MagickWand shared library not found[windows]

python - Pygame 表面的 alpha 不影响透明度

python - 如何为 Pandas 时间序列制作动画?

python - 用 py2exe 制作的可执行文件不能在 windows xp 32 位上运行

java - 为 Java 应用程序创建 PDF

javascript - 动态 PDF 并打开新窗口而不是下载

python - ImageMagick - 在 Python 中使用 ICC 将图像 RGB 转换为 CMYK