Python 在主脚本中捕获子流程中生成的JPG

Python 在主脚本中捕获子流程中生成的JPG,python,image,pdf,thumbnails,stdout,Python,Image,Pdf,Thumbnails,Stdout,我不确定这是否可行,但我正在尝试以自动方式从PDF生成大量缩略图,然后将它们存储在elasticsearch中。基本上,我想将pdf转换成一系列JPG(或PNG,或任何类似的东西),然后将它们作为二进制文件索引。目前我正在制作这些JPG,如下所示: import subprocess params = ['convert', 'pdf_file', 'thumb.jpg'] subprocess.check_call(params) 它工作得很好,但它只是将JPG写入文件系统。我希望将这些文件

我不确定这是否可行,但我正在尝试以自动方式从PDF生成大量缩略图,然后将它们存储在elasticsearch中。基本上,我想将pdf转换成一系列JPG(或PNG,或任何类似的东西),然后将它们作为二进制文件索引。目前我正在制作这些JPG,如下所示:

import subprocess
params = ['convert', 'pdf_file', 'thumb.jpg']
subprocess.check_call(params)
它工作得很好,但它只是将JPG写入文件系统。我希望将这些文件作为字符串,而不将它们写入本地文件系统。我尝试过使用subprocess的stdout方法,但我对使用subprocess还相当陌生,所以我没能弄明白这一点

我正在使用imagemagick进行此转换,但只要我能够实现此目标,我愿意切换到任何其他工具。 有什么想法吗?

您可以使用imagemagick的,例如:

import PythonMagick

img = PythonMagick.Image("file.pdf")
img.depth = 8
img.magick = "RGB"
data = img.data
或使用:

您可以使用imagemagick,例如:

import PythonMagick

img = PythonMagick.Image("file.pdf")
img.depth = 8
img.magick = "RGB"
data = img.data
或使用:

我希望将这些文件作为字符串,而不将它们写入本地文件系统

方法是告诉命令将其数据写入stdout而不是文件,然后从
proc.stdout
读取数据

不是每个命令都有方法告诉它这样做,但在许多情况下,只需将
-
作为输出文件名传递即可,对于ImageMagick的
convert
,情况也是如此。当然,您还需要给它一个格式,因为它无法再从
thumb.jpg
的扩展中猜出它。最简单的方法是在
convert
中,将类型前缀为
-
伪文件名。(除了
ImageMagick
之外,不要尝试其他方法)

因此:

然而,这会给你一根巨大的绳子。如果您试图获得一组单独的图像,则需要将一个巨大的字符串拆分为单独的图像,这可能需要一些JPEG/JFIF格式的知识

我希望将这些文件作为字符串,而不将它们写入本地文件系统

方法是告诉命令将其数据写入stdout而不是文件,然后从
proc.stdout
读取数据

不是每个命令都有方法告诉它这样做,但在许多情况下,只需将
-
作为输出文件名传递即可,对于ImageMagick的
convert
,情况也是如此。当然,您还需要给它一个格式,因为它无法再从
thumb.jpg
的扩展中猜出它。最简单的方法是在
convert
中,将类型前缀为
-
伪文件名。(除了
ImageMagick
之外,不要尝试其他方法)

因此:


然而,这会给你一根巨大的绳子。如果您试图获取一组单独的图像,则需要将一个巨大的字符串拆分为单独的图像,这可能需要一些JPEG/JFIF格式的知识。

您可以让它将数据发送到stdout

import subprocess
params = ['convert', 'pdf_file', 'jpg:-']
image_data = subprocess.check_output(params)

您可以让它将数据发送到标准输出

import subprocess
params = ['convert', 'pdf_file', 'jpg:-']
image_data = subprocess.check_output(params)


当您使用python时,最好使用python而不是调用外部程序,因为forks可能很昂贵。@zmo forks可能很昂贵,但我使用相当大的PDF多次这样做,因此我认为不通过python绑定的好处是值得的。另外,我不相信子进程实际上是分叉的。@SlaterTyranus:
子进程
肯定是分叉的(除非您在Windows上,在这种情况下,它是
CreateProcess
es)。不然怎么行?@SlaterTyranus:PS,你在哪个平台上,叉子很贵?它们在linux上的速度非常快,在OS X和其他现代*BSD上几乎不重要。)通常exec和链接加载器等要比fork花费更长的时间(尽管仍然没有Windows的CreateProcess那么长)。在使用python时,使用python而不是调用外部程序是一个好主意,因为forks往往很昂贵。@zmo forks可能很昂贵,但我用相当大的PDF做了几次,所以我认为不通过python绑定的好处是值得的。另外,我不相信子进程实际上是分叉的。@SlaterTyranus:
子进程
肯定是分叉的(除非您在Windows上,在这种情况下,它是
CreateProcess
es)。不然怎么行?@SlaterTyranus:PS,你在哪个平台上,叉子很贵?它们在linux上的速度非常快,在OS X和其他现代*BSD上几乎不重要。)通常exec和链接加载器等要比fork花费更长的时间(尽管仍然没有Windows的CreateProcess那么长)。哦,太棒了!正是我想要的。哦,太棒了!正是我要找的。分成几组?等待结论。@SlaterTyranus:哦,对不起。现在修好了,分成几组?等待结论。@SlaterTyranus:哦,对不起。现已修复。PythonMagick似乎不再处于活动状态。@SlaterTyranus:对于传统的ImageMagick,PythonMagick仍然有效。对于更新、更高级的MagickWand API,请改用PythonMagickWand。或者使用Wand,它将较低级别的API包装成较高级别API的样式。(zmo的答案已经有了一个例子,
wand
PythonMagic
one)或者直接去看看现在有什么。(您可能还想检查PyPI。)PythonMagick似乎不再处于活动状态。@SlaterTyranus:对于传统的ImageMagick,PythonMagick仍然有效。对于更新、更高级的MagickWand API,请改用PythonMagickWand。或者使用Wand,它将较低级别的API包装成较高级别API的样式。(zmo的答案已经有了一个例子,
wand
PythonMagic
one)或者直接去看看现在有什么。(您可能还需要检查PyPI。)