2014-02-10 68 views
7

被下載我一直在使用例如如何顯示已在蟒蛇

import requests 
pdf = requests.get("http://www.scala-lang.org/docu/files/ScalaByExample.pdf") 

一把抓起網的PDF PDF文件我想修改這個代碼,以顯示它

from gi.repository import Poppler, Gtk 

def draw(widget, surface): 
    page.render(surface) 

document = Poppler.Document.new_from_file("file:///home/me/some.pdf", None) 
page = document.get_page(0) 

window = Gtk.Window(title="Hello World") 
window.connect("delete-event", Gtk.main_quit) 
window.connect("draw", draw) 
window.set_app_paintable(True) 

window.show_all() 
Gtk.main() 

如何我是否修改document =行以使用包含pdf的變量pdf?

(我不介意使用popplerqt4或其他任何東西,如果這使得它更容易。)

+1

您應該使用'Poppler.Document.new_from_data',但有str''之間轉換的問題, 'char *'由於'str'預期會攜帶Unicode數據,'char *'需要原始二進制數據。到現在爲止,我無法完成工作。 – Cilyan

+0

@Cilyan好主意!我使用'len(repr(content))'作爲長度字段,'str(content)'作爲數據字段。它爲我工作。 –

回答

0

如何使用臨時文件?如果你想使用Acrobat Reader打開PDF,然後下面的代碼應該工作

import subprocess 
process = subprocess.Popen(['<here path to acrobat.exe>', '/A', 'page=1', '<here path to pdf>'], shell=False, stdout=subprocess.PIPE) 
process.wait() 
+0

這是我當前的解決方法。但如果可以避免的話,那將是很棒的。 – marshall

+0

您使用的是python-poppler-qt4,pypoppler,或者哪個庫是定義'Document的庫。波普勒? – logc

+0

我的導入行來自gi.repository import Poppler,Gtk,它定義了Poppler.Document。我需要安裝libpoppler-dev才能讓它工作。不過,如果這是一個好主意,我很樂意轉移到python-poppler-qt。 – marshall

0

試試這個,告訴我,如果它的工作原理pyPdf,你應該可以使用它加載PDF文件。 如果您還有其他問題,請發送郵件給我。

+0

我仍然使用python3.3這個解決方案'PDF文檔已損壞',並且分割python2.7錯誤。但也許它會爲OP工作... – Cilyan

+0

它真的爲你工作? – marshall

+0

我在ipython筆記本上試了一下。它做了。但自@Cilyan表示它不適合他。你應該親自嘗試一下,告訴我它是否適合你。 –

0

因爲有一個名爲庫:

import tempfile 
import urllib 
import urlparse 

import requests 

from gi.repository import Poppler, Gtk 

pdf = requests.get("http://www.scala-lang.org/docu/files/ScalaByExample.pdf") 

with tempfile.NamedTemporaryFile() as pdf_contents: 
    pdf_contents.file.write(pdf) 
    file_url = urlparse.urljoin(
     'file:', urllib.pathname2url(pdf_contents.name)) 
    document = Poppler.Document.new_from_file(file_url, None) 
0

document = Poppler.Document.new_from_data(str(pdf.content),len(repr(pdf.content)),None) 
0

2015年8月:在Windows 7新的安裝紙,問題還是一樣:

Poppler.Document.new_from_data(data, len(data), None) 

回報:類型錯誤:必須是字符串而不是字節。

Poppler.Document.new_from_data(str(data), len(data), None) 

回報:PDF文件損壞(4)。

我一直無法使用此功能。

我試圖使用NamedTemporayFile而不是磁盤上的文件,但由於未知原因,它返回一個未知錯誤。
所以我正在使用一個臨時文件。不是最漂亮的方式,但它的工作原理。

這裏是Python的3.4測試代碼,如果任何人有一個想法:

from gi.repository import Poppler 
import tempfile, urllib 
from urllib.parse import urlparse 
from urllib.request import urljoin 

testfile = "d:/Mes Documents/en cours/PdfBooklet3/tempfiles/preview.pdf" 
document = Poppler.Document.new_from_file("file:///" + testfile, None)   # Works fine 
page = document.get_page(0) 
print(page)   # OK 

f1 = open(testfile, "rb") 
data1 = f1.read() 
f1.close() 

data2 = "".join(map(chr, data1)) # converts bytes to string 
print(len(data1)) 
document = Poppler.Document.new_from_data(data2, len(data2), None) 
page = document.get_page(0)              # returns None 
print(page) 

pdftempfile = tempfile.NamedTemporaryFile() 
pdftempfile.write(data1) 

file_url = urllib.parse.urljoin('file:', urllib.request.pathname2url(pdftempfile.name)) 
print(file_url) 
pdftempfile.seek(0) 
document = Poppler.Document.new_from_file(file_url, None)      # unknown error 
2

它所有的使用取決於操作系統。這些通常可以幫助:

import os 
os.system('my_pdf.pdf') 

os.startfile('path_to_pdf.pdf') 

import webbrowser 
webbrowser.open(r'file:///my_pdf.pdf') 
+0

'import webbrowser' +1 –

+0

編輯'os.startFile'到'os.startfile' – jcoppens