2014-02-10 21 views
7

ich ein pdf in Python heruntergeladen wurde aus dem Internet zum Beispiel unter VerwendungWie ein PDF anzuzeigen, die

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

Ich möchte diesen Code ändern, um es anzuzeigen

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() 

gepackt haben, wie ändere ich die document = Zeile, um die Variable pdf zu verwenden, die das pdf enthält?

(Ich habe nichts dagegen mit popplerqt4 oder irgendetwas anderes, wenn das macht es einfacher.)

+1

Sie verwenden sollten 'Poppler.Document.new_from_data', aber es ist ein Konvertierungsproblem zwischen' str' und 'char *' aufgrund der Art, wie "str" ​​Unicode-Daten erwartet, aber 'char *' erwartet rohe Binärdaten. Bis jetzt konnte ich es nicht funktionieren lassen. – Cilyan

+0

@Cilyan Gute Idee! Ich habe 'len (repr (content))' für length field und 'str (content)' für das Datenfeld verwendet. Es hat für mich funktioniert. –

Antwort

0

Wie wäre es eine temporäre Datei mit?

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

Dies ist meine aktuelle Problemumgehung. Es wäre großartig, wenn es jedoch vermieden werden könnte. – marshall

+0

Verwenden Sie Python-Poppler-Qt4, Pypoppler, oder welche Bibliothek ist die, die definiert, Dokument.Poppler? – logc

+0

Meine Importzeile stammt aus dem gi.repository Import Poppler, Gtk, der Poppler.Document definiert. Ich musste libpoppler-dev installieren, um es zur Arbeit zu bringen, denke ich. Ich bin glücklich, zu Python-Poppler-QT zu bewegen, wenn das eine gute Idee ist. – marshall

0

Dieses versuchen und mir sagen, ob es funktioniert:

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

Ich bekomme immer noch 'PDF-Dokument ist beschädigt' mit dieser Lösung mit Python3.3 und einer Segmentierung Fehler auf Python2.7. Aber vielleicht funktioniert es für OP ... – Cilyan

+0

Funktioniert es wirklich für Sie? – marshall

+0

Ich habe es in Ipython-Notebook versucht. Es tat es. aber da @Cilyan sagt, es hat nicht für ihn funktioniert. Sie sollten es selbst ausprobieren und mir sagen, ob es für Sie funktioniert. –

0

Wenn Sie PDF-Datei mit Acrobat Reader dann unter Code öffnen möchten

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

funktionieren sollte Da gibt es eine Bibliothek mit dem Namen ist pyPdf, Sie sollten in der Lage sein, eine PDF-Datei zu laden. Wenn Sie weitere Fragen haben, senden Sie mir Nachricht.

0

August 2015: Auf einem frischen intallation in Windows 7, das Problem ist immer noch das gleiche:

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

kehrt: Typ Fehler: müssen Strings nicht Bytes sein.

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

zurück: PDF-Dokument ist beschädigt (4).

Ich konnte diese Funktion nicht verwenden.

Ich habe versucht, eine NamedTemporayFile anstelle einer Datei auf der Festplatte zu verwenden, aber aus unbekannten Gründen gibt es einen unbekannten Fehler zurück.
So verwende ich eine temporäre Datei. Nicht der schönste Weg, aber es funktioniert. Hier

ist der Test-Code für Python 3.4, wenn jemand eine Idee hat:

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

Alles auf dem O hängt Ihre Verwendung. Diese könnten in der Regel helfen:

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

oder

os.startfile('path_to_pdf.pdf') 

oder

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

'import webbrowser' +1 –

+0

bearbeitet' os.startFile' zu ​​'os.startfile' – jcoppens