有没有人能够在 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()

可能会发生四种不同的情况:

不知道是不是编码参数的问题,想了各种方法都没有结果。 我尝试使用 "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 进行测试