2013-06-25 67 views
1

我不確定這是否可行,但我試圖以自動方式從pdf生成許多縮略圖,然後將它們存儲在elasticsearch中。基本上我想將pdf轉換爲一系列jpgs(或pngs,或類似的東西),然後將它們作爲二進制文件索引。目前我生產這些jpgs是這樣的:在主腳本中捕獲子進程中產生的jpgs

import subprocess 
params = ['convert', 'pdf_file', 'thumb.jpg'] 
subprocess.check_call(params) 

它工作的很好,但它只是將jpgs寫入文件系統。我希望將這些文件作爲字符串,而不必將它們寫出到本地文件系統。我已經嘗試過使用子過程的stdout方法,但我對使用子過程相當陌生,所以我無法弄清楚這一點。

我正在使用imagemagick進行此轉換,但只要能實現此目標,我就可以切換到任何其他工具。 任何想法?

+0

如你在蟒蛇的工作,它會是一個好主意,使用Python和不是通過調用外部程序做,叉子往往是昂貴的。 – zmo

+0

@zmo分叉可能很昂貴,但我用很大的pdf做了幾次,所以我想通過python綁定獲得的收益是值得的。我也不相信這個子過程實際上是分叉的。 –

+0

@SlaterTyranus:''subprocess'絕對分叉(除非你在Windows上,在這種情況下它改爲'CreateProcess')。它還能如何工作? – abarnert

回答

2

你可以把它發送數據,而不是到stdout ...

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

哦,太棒了!正是我在找什麼。 –

2

你可以使用ImageMagick的python API,例如像:

import PythonMagick 

img = PythonMagick.Image("file.pdf") 
img.depth = 8 
img.magick = "RGB" 
data = img.data 

或使用wand

from wand.image import Image 

with Image(filename='file.pdf') as img: 
    data = img.make_blob('png') 
+0

非常感謝,我不知道這存在! –

+0

似乎PythonMagick不再處於活動狀態。 –

+0

@SlaterTyranus:對於傳統的ImageMagick,PythonMagick仍然有效。對於較新的更高級別的MagickWand API,請改用PythonMagickWand。或者使用Wand,它以較高級別的風格包裝較低級別的API。 (zmo的回答已經有一個''wand'與PythonMagic'一起的例子。)或者直接進入[APIs頁面](http://www.imagemagick.org/script/api.php)並查看當前的內容那裏。 (您可能還想檢查PyPI。) – abarnert

1

我想有這些文件作爲字符串,而無需編寫出來的本地文件系統。

執行此操作的方法是告訴命令將其數據寫入標準輸出而不是文件,然後從proc.stdout中讀取它。

不是每一個命令都有辦法告訴它這樣做,但在很多情況下,只是通過-作爲輸出文件名就可以了,ImageMagick的convert也是如此。當然你也需要給它一個格式,因爲它不能再從thumb.jpg的擴展中猜出它。最簡單的方法是在convert的前綴是-僞文件名。 (不要與比ImageMagick其他任何東西。)

所以:

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

然而,這將讓你一個巨大的字符串。如果您試圖獲得一堆單獨的圖像,則需要將一個巨大的字符串拆分爲單獨的圖像,這可能需要一些關於JPEG/JFIF格式的知識。

+0

拆分成?等待結論。 –

+0

@SlaterTyranus:哎呀,對不起。現在修復。 – abarnert

相關問題