This is my first topic, apologies in advance for any mistake.
This is one of my first scripts in Python (and also one of my first programming attempts ).
Investigating an issue in Windows with paths, I found another issue in Linux.
See the following sample:
#!/usr/bin/env python3
# coding: utf-8
from urllib import request
import os, sys, cairo, gi
gi.require_version("Gtk", "3.0")
gi.require_version("Gst", "1.0")
from gi.repository import Gtk, Gdk, GLib, GObject, Gst
gi.require_version('Poppler', '0.18')
from gi.repository import Poppler
# ~ Gst.init(sys.argv)
class weird:
def __init__(self):
print(os.path.abspath(sys.argv[1]))
# ~ self.uri = Gst.filename_to_uri(os.path.abspath(sys.argv[1]))
# ~ self.uri = GLib.filename_to_uri(os.path.abspath(sys.argv[1]))
self.uri = 'file:' + request.pathname2url(os.path.abspath(sys.argv[1]))
print(self.uri)
self.document = Poppler.Document.new_from_file(self.uri, None)
self.n_pages = self.document.get_n_pages()
self.page_selector = self.document.get_page(0)
self.win = Gtk.Window(Gtk.WindowType.TOPLEVEL) # deprecated
self.vbox = Gtk.VBox()
self.area = Gtk.DrawingArea()
self.vbox.override_background_color(Gtk.StateFlags.NORMAL, Gdk.RGBA(0, 0, 0, 1))
self.area.connect("draw", self.on_draw)
self.vbox.pack_start(self.area, True, True, 0)
self.win.add(self.vbox)
self.win.connect("destroy", Gtk.main_quit)
self.win.show_all()
self.win.connect('key-press-event', self.key_press_event)
self.width, self.height = self.win.get_size()
self.page_width, self.page_height= self.page_selector.get_size()
self.surface = cairo.ImageSurface(cairo.FORMAT_RGB24,
int(self.width),
int(self.height))
def key_press_event(self, widget, event):
if event.keyval == Gdk.keyval_from_name("q"):
Gtk.main_quit()
def on_draw(self, widget, event):
add_x = 0
add_y = 0
if (self.area.get_allocated_width()/self.page_width) < (self.area.get_allocated_height()/self.page_height):
self.scale = self.area.get_allocated_width()/self.page_width
add_y= (((self.area.get_allocated_height()-(self.page_height*self.scale))/2)/self.scale)
else:
self.scale = self.area.get_allocated_height()/self.page_height
add_x= (((self.area.get_allocated_width()-(self.page_width*self.scale))/2)/self.scale)
cr = Gdk.cairo_create(self.win.get_window()) # deprecated
cr.set_source_surface(self.surface)
cr.set_source_rgb(1, 1, 1)
if self.scale != 1:
cr.scale(self.scale, self.scale)
cr.translate(add_x, add_y)
cr.rectangle(0, 0, self.page_width, self.page_height)
cr.fill()
self.page_selector.render(cr)
def gtk_main_quit(self, widget, event):
Gtk.main_quit()
def main(self):
Gtk.main()
we = weird()
we.main()
No matter how self.uri
is defined (Gst
, GLib
or urllib.request
), the script only works if the script and the PDF document aren’t on the same directory (a symlink works around the issue).
But otherwise, I get the following error message:
TypeError: Couldn't find foreign struct converter for 'cairo.Context'
In that case, no key events work, not even the print()
commands work.
Sorry for my extremely basic question, but what am I missing here?
Many thanks for your help.