Python 在主脚本中捕获子流程中生成的JPG
我不确定这是否可行,但我正在尝试以自动方式从PDF生成大量缩略图,然后将它们存储在elasticsearch中。基本上,我想将pdf转换成一系列JPG(或PNG,或任何类似的东西),然后将它们作为二进制文件索引。目前我正在制作这些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写入文件系统。我希望将这些文件
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。)