Как отобразить PDF, который был загружен в Python
Я взял PDF из Интернета, используя, например,
import requests
pdf = requests.get("http://www.scala-lang.org/docu/files/ScalaByExample.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 или чего-то еще, если это облегчает задачу.)
6 ответов
Все зависит от используемой вами ОС. Обычно это может помочь:
import os
os.system('my_pdf.pdf')
или же
os.startfile('path_to_pdf.pdf')
или же
import webbrowser
webbrowser.open(r'file:///my_pdf.pdf')
Попробуйте это и скажите мне, если это работает:
document = Poppler.Document.new_from_data(str(pdf.content),len(repr(pdf.content)),None)
Если вы хотите открыть PDF с помощью Acrobat Reader, то ниже код должен работать
import subprocess
process = subprocess.Popen(['<here path to acrobat.exe>', '/A', 'page=1', '<here path to pdf>'], shell=False, stdout=subprocess.PIPE)
process.wait()
Как насчет использования временного файла?
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)
Август 2015 года. В новой версии 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
Поскольку есть библиотека с именем pyPdf, вы должны иметь возможность загружать PDF-файл, используя ее. Если у вас есть дополнительные вопросы, пришлите мне messege.