pythongtk3pyobject

python Gtk.PrintOperation print a pdf


Until now i was using a variant of this code to print a pdf that i create with pisa.

That is taken from 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()

Now i am porting to Gtk3 PyObject and i can't solve the problem. I found that Gtk.PrintOperation is the way but i can't relate print Operation whith a printJob or how to pass the file to print.
thanks


Solution

  • Here's an example, I hope you find it useful

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