簡體   English   中英

如何顯示已在python中下載的pdf

[英]How to display a pdf that has been downloaded in 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或其他任何東西,如果這使它更容易。)

這一切都取決於您使用的操作系統。 這些通常有助於:

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

要么

os.startfile('path_to_pdf.pdf')

要么

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

如何使用臨時文件?

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)

試試這個並告訴我它是否有效:

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

如果你想使用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()

由於有一個名為pyPdf的庫,您應該能夠使用它加載PDF文件。 如果您還有其他問題,請發送電子郵件給我。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM