是否有人能够在Python中使用poppler new_from_data



使用python3和poppler,我可以无问题地加载文件,但new_from_data是有问题的。这是显然是一个简单的测试的代码,因为从文件中读取然后使用new_from_data是没有意义的,因为new_from_file可以很好地工作,但是我无法在此处发布生成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_pages返回0,get_page(0)返回无
  • 我可能会出现错误: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)(在流行版本中可能有所不同)。

#!/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()

用poppler 0.84.0和python测试了Fedora Linux的3.8.5。

相关内容

  • 没有找到相关文章