有没有人能够在 python 中使用 poppler new_from_data?
Has anyone been able to use poppler new_from_data in python?
使用 Python3 和 Poppler,我可以用 new_from_file 加载文件没有问题,但是 new_from_data 有问题。这是显然是一个简单测试的代码,因为从文件中读取然后使用 new_from_data 是没有意义的,因为 new_from_file 工作得很好,但我不能在这里 post生成pdf文件的完整代码。
from gi.repository import Poppler, Gtk
def draw(widget, cr):
# set background.
cr.set_source_rgb(0.7, 0.6, 0.5)
cr.paint()
# set page background
cr.set_source_rgb(1, 1, 1)
cr.rectangle(0,0,800,400)
cr.fill()
page.render(cr)
filepath = "d:/Mes Documents/A5.pdf"
f11 = open(filepath, "r", encoding = "cp850")
data1 = f11.read()
f11.close()
document = Poppler.Document.new_from_data(data1, len(data1), None)
page = document.get_page(0)
print (document.get_n_pages())
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()
可能会发生四种不同的情况:
- 使用非常简单的 pdf(Pdf 参考 13 中的 "Hello world" 示例)就可以了。
- 用普通文件,可能没有错误,但是get_n_pagesreturns0,而get_page(0)returnsNone
- 或者我可能会得到一个错误:GLib.Error: poppler-quark: PDF 文档已损坏 (4)
- 或者程序崩溃
不知道是不是编码参数的问题,想了各种方法都没有结果。
我尝试使用 "rb",然后使用 :
将字节数组转换为字符串
data1 = "".join(map(data1))
没有结果。
在 Google 上搜索从未返回有效示例
我运行遇到了同样的问题,用Gio.MemoryInputStream解决了。
不是很优雅,但它有效...
from gi.repository import Poppler, Gtk, Gio
def draw(widget, cr):
# set background.
cr.set_source_rgb(0.7, 0.6, 0.5)
cr.paint()
# set page background
cr.set_source_rgb(1, 1, 1)
cr.rectangle(0,0,800,400)
cr.fill()
page.render(cr)
filepath = "d:/Mes Documents/A5.pdf"
with open(filepath, "rb") as f11:
input_stream = Gio.MemoryInputStream.new_from_data(f11.read())
# Take care that you need to call .close() on the Gio.MemoryInputStream once you're done with your pdf document.
document = Poppler.Document.new_from_stream(input_stream, -1, None, None)
page = document.get_page(0)
print (document.get_n_pages())
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()
如果您以二进制 "rb"
且不编码的方式读取文件,它会起作用。我还需要删除数据长度以修复 TypeError: Poppler.Document.new_from_data() takes exactly 2 arguments (3 given)
(在 poppler 版本中可能有所不同)。
#!/bin/python3
from gi.repository import Poppler, Gtk
def draw(widget, cr):
# set background.
cr.set_source_rgb(0.7, 0.6, 0.5)
cr.paint()
# set page background
cr.set_source_rgb(1, 1, 1)
cr.rectangle(0,0,800,400)
cr.fill()
page.render(cr)
filepath = "/home/da/test.pdf"
f11 = open(filepath, "rb")
data1 = f11.read()
f11.close()
document = Poppler.Document.new_from_data(data1, None)
page = document.get_page(0)
print (document.get_n_pages())
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()
在 Fedora Linux.
上使用 poppler 0.84.0 和 Python 3.8.5 进行测试
使用 Python3 和 Poppler,我可以用 new_from_file 加载文件没有问题,但是 new_from_data 有问题。这是显然是一个简单测试的代码,因为从文件中读取然后使用 new_from_data 是没有意义的,因为 new_from_file 工作得很好,但我不能在这里 post生成pdf文件的完整代码。
from gi.repository import Poppler, Gtk
def draw(widget, cr):
# set background.
cr.set_source_rgb(0.7, 0.6, 0.5)
cr.paint()
# set page background
cr.set_source_rgb(1, 1, 1)
cr.rectangle(0,0,800,400)
cr.fill()
page.render(cr)
filepath = "d:/Mes Documents/A5.pdf"
f11 = open(filepath, "r", encoding = "cp850")
data1 = f11.read()
f11.close()
document = Poppler.Document.new_from_data(data1, len(data1), None)
page = document.get_page(0)
print (document.get_n_pages())
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()
可能会发生四种不同的情况:
- 使用非常简单的 pdf(Pdf 参考 13 中的 "Hello world" 示例)就可以了。
- 用普通文件,可能没有错误,但是get_n_pagesreturns0,而get_page(0)returnsNone
- 或者我可能会得到一个错误:GLib.Error: poppler-quark: PDF 文档已损坏 (4)
- 或者程序崩溃
不知道是不是编码参数的问题,想了各种方法都没有结果。 我尝试使用 "rb",然后使用 :
将字节数组转换为字符串data1 = "".join(map(data1))
没有结果。
在 Google 上搜索从未返回有效示例
我运行遇到了同样的问题,用Gio.MemoryInputStream解决了。 不是很优雅,但它有效...
from gi.repository import Poppler, Gtk, Gio
def draw(widget, cr):
# set background.
cr.set_source_rgb(0.7, 0.6, 0.5)
cr.paint()
# set page background
cr.set_source_rgb(1, 1, 1)
cr.rectangle(0,0,800,400)
cr.fill()
page.render(cr)
filepath = "d:/Mes Documents/A5.pdf"
with open(filepath, "rb") as f11:
input_stream = Gio.MemoryInputStream.new_from_data(f11.read())
# Take care that you need to call .close() on the Gio.MemoryInputStream once you're done with your pdf document.
document = Poppler.Document.new_from_stream(input_stream, -1, None, None)
page = document.get_page(0)
print (document.get_n_pages())
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()
如果您以二进制 "rb"
且不编码的方式读取文件,它会起作用。我还需要删除数据长度以修复 TypeError: Poppler.Document.new_from_data() takes exactly 2 arguments (3 given)
(在 poppler 版本中可能有所不同)。
#!/bin/python3
from gi.repository import Poppler, Gtk
def draw(widget, cr):
# set background.
cr.set_source_rgb(0.7, 0.6, 0.5)
cr.paint()
# set page background
cr.set_source_rgb(1, 1, 1)
cr.rectangle(0,0,800,400)
cr.fill()
page.render(cr)
filepath = "/home/da/test.pdf"
f11 = open(filepath, "rb")
data1 = f11.read()
f11.close()
document = Poppler.Document.new_from_data(data1, None)
page = document.get_page(0)
print (document.get_n_pages())
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()
在 Fedora Linux.
上使用 poppler 0.84.0 和 Python 3.8.5 进行测试