2013-06-21 34 views
0

我正在尋找一個很好的PDF 2圖像轉換器很長一段時間。我需要將PDF轉換爲圖像以便使用Qt進行打印。我使用Python/Pyside進行編程,因此如果我可以使用子進程將PDF轉換爲一系列(PNG)圖像,則可以毫無問題地打印它們。PDF到PNG Python與pdf2cairo

我通過調用Imagemagick中的convert.exe來實現此目的。它工作的很好,但它依賴於GhostScript,這是一個很大的包,我想避免它,因爲它更復雜的集成。

我也試過從GhostScript muPDF,但這似乎沒有標準輸入和標準輸出選項。這是一個遺憾,因爲它首先保存我的文件。用muPDF打開它,轉換並保存它,然後在我的Python應用程序中重新加載它。沒有所有這些步驟應該是可能的!

今天我開始試驗Poppler的pdf2cairo。我認爲它能以這種方式將我的(多頁面)PDF轉換爲一系列圖像並將其傳輸到標準輸出。不幸的是,它沒有,我遇到兩個問題:

  • 它抱怨說,它只能導出到標準輸出,當你也使用-singlepage參數。我如何將所有頁面導出到標準輸出?
  • 當我出口到stdout我得到的錯誤:'Error opening output file fd://0.png\r\n

從標準到圖像文件轉換爲PDF是沒有問題的這一切。

這是我的代碼,也觸發有關打開輸出文件中的錯誤:

import subprocess 

pdf = open('test.pdf') 
p = subprocess.Popen(['pop/pdftocairo.exe', '-singlefile', '-png', '-', '-'],stdin = pdf, stdout = subprocess.PIPE, stderr = subprocess.PIPE) 
print(p.stderr.read()) 
print(p.stdout.read()) 

我已經下載PDF2Cairo從預編譯:http://blog.alivate.com.au/poppler-windows/ 的pdf2cairo的命令行選項的文檔可以發現這裏:http://manpages.ubuntu.com/manpages/precise/man1/pdftocairo.1.html

希望你能幫助我做出這項工作!

更新 正如你可以看到下面的pdftocairo是越野車,當你想使用標準輸出工作不正常的答案。 pdftoppm不起作用,它返回的是你的PDF文件的字節對象:

pdf = open('test.pdf') 
p = subprocess.Popen(['pop/pdftoppm.exe', '-png'],stdin = pdf, stdout = subprocess.PIPE, stderr = subprocess.PIPE) 
data, error = p.communicate() 

我唯一需要做的就是將字節對象分成多個文件。

回答

2

這是pdftocairo中的一個錯誤。

輸出文件名首先傳遞到getOutputFilename,其中returns the special string fd://0作爲佔位符爲stdout

但後來該字符串傳遞給getImageFilename無條件地adds an extension到文件名,以便以後的comparision失敗,程序輪胎打開文本文件fd://0.png而不是使用stdout的。不幸的是,你唯一能做的就是file a bug report

至於導出一個多頁文檔到stdout,根本不支持它,它不會與png或jpeg等文件類型一起工作,因爲這些格式不支持多頁文檔。它爲svgpdfepsps輸出文件的工作,因爲這些格式都支持多頁文檔(以及這些做正確的文件名的處理。)

+0

非常感謝您的回答。這很清楚。 我剛剛發現,PDF格式爲ppm支持標準輸入和標準輸出,如果你只是離開文件的引用:''pop/pdftoppm.exe','-png'就足以得到一個字節對象與所有的PNG文件。我正在努力分裂這個對象在單獨的文件。但這是另一個問題! – Ecno92

+0

是的,它似乎返回所有單頁作爲pngs流。分割魔法''\ x89PNG''應該不會那麼困難:)奇怪的是,以ppm命名的實用程序也會產生其他格式。 – mata

+0

通過閱讀將我的SSH和GPG密鑰附加到一個錯誤並決定只寫入一個tmp文件,讀取它並將其寫入到所需的流中,我讀到了一半。男人,我喜歡github + pull請求。似乎這已經過去了幾年沒有得到提交/處理。這太糟糕了。 :( – Ricky

0

我以爲它會更容易只使用使用os.system並傳遞整個命令字符串。 這裏假設有「pdfs」和「imgs」文件夾;相應地改變。

import os 
import glob 

for pdf_file in glob.glob("pdfs\*.pdf"): 
    cmd_str = "pdftocairo.exe -jpeg \"%s\" \"%s\"" % (pdf_file, os.path.join("imgs", os.path.splitext(os.path.split(pdf_file)[1])[0])) 
    print cmd_str 
    os.system(cmd_str) 
+0

正如你所看到的,我想使用stdin和stdout,這樣你就不會這麼做了,我使用pdftoppm解決了這個問題,所以非常感謝你的努力。文件,但我更喜歡使用子進程。 – Ecno92