Python Gtk.PrintOperation打印PDF

3

迄今为止,我一直在使用这个代码的变体来打印由pisa创建的pdf。

这段话摘自pygtk faq:

import gtk
import gtkunixprint

def print_cb(printjob, data, errormsg):
    if errormsg:
        print('Error occurred while printing:\n%s' % errormsg)

filename = 'the_pdf_file_to_be_printed.pdf'
pud = gtkunixprint.PrintUnixDialog()
response = pud.run()
if response == gtk.RESPONSE_OK:
    printer = pud.get_selected_printer()
    settings = pud.get_settings()
    setup = pud.get_page_setup()
    printjob = gtkunixprint.PrintJob('Printing %s' % filename, printer, settings, setup)
    printjob.set_source_file(filename)
    printjob.send(print_cb)
pud.destroy()

我正在将代码移植到Gtk3 PyObject,但是遇到了问题。 我发现 Gtk.PrintOperation 是解决问题的方法,但是我不知道如何将 print Operation 与 printJob 相关联或者如何传递文件以进行打印。
谢谢。

1个回答

5

以下是一个例子,希望对您有所帮助。

#!/usr/bin/env python
import os
import sys
from gi.repository import GLib, Gtk, Poppler


class PrintingApp:
    def __init__(self, file_uri):
        self.operation = Gtk.PrintOperation()

        self.operation.connect('begin-print', self.begin_print, None)
        self.operation.connect('draw-page', self.draw_page, None)

        self.doc = Poppler.Document.new_from_file(file_uri)

    def begin_print(self, operation, print_ctx, print_data):
        operation.set_n_pages(self.doc.get_n_pages())

    def draw_page(self, operation, print_ctx, page_num, print_data):
        cr = print_ctx.get_cairo_context()
        page = self.doc.get_page(page_num)
        page.render(cr)

    def run(self, parent=None):
        result = self.operation.run(Gtk.PrintOperationAction.PRINT_DIALOG,
                                    parent)

        if result == Gtk.PrintOperationResult.ERROR:
            message = self.operation.get_error()

            dialog = Gtk.MessageDialog(parent,
                                       0,
                                       Gtk.MessageType.ERROR,
                                       Gtk.ButtonsType.CLOSE,
                                       message)

            dialog.run()
            dialog.destroy()

        Gtk.main_quit()


def main():
    if len(sys.argv) != 2:
        print "%s FILE" % sys.argv[0]
        sys.exit(1)

    file_uri = GLib.filename_to_uri(os.path.abspath(sys.argv[1]))

    main_window = Gtk.OffscreenWindow()
    app = PrintingApp(file_uri)
    GLib.idle_add(app.run, main_window)
    Gtk.main()

if __name__ == '__main__':
    main()

还有一个名为 render_for_printing() 的方法,根据文档,在打印时应该优先选择它而不是 render(),尽管在测试这两种方法时我看不出差别。 - zezollo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接