Web で配布されているコミックは PDF であることもある。
我がアプリで PDF も読み込みできるといいんだけど。
こんなライブラリがあることを知った。
Fedora デフォルトには普通に Gir で入っていたりするし。
そりゃ Evince が使っているし。
Poppler 0.18 (0.69.0) – Poppler 0.18
ドキュメントもある。
関数名も解りやすいし適当に書いてみよう。
#!/usr/bin/env python3
import gi, cairo
gi.require_version('Gtk', '3.0')
gi.require_version('Poppler', '0.18')
from gi.repository import Gtk, Gio, Poppler
PDFFILE = 'りんごの色.pdf'
class PdfWin(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.connect('delete-event', Gtk.main_quit)
# PDF file
f = Gio.File.new_for_path(PDFFILE)
self.pdf = Poppler.Document.new_from_gfile(f)
self.max_page = self.pdf.get_n_pages()
self.num = 0
# button
button = Gtk.Button.new_with_label('Next Page')
button.connect('clicked', self.on_button_clicked)
# DrawingArea
self.canvas = Gtk.DrawingArea()
self.canvas.connect('draw', self.on_draw)
vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
vbox.pack_start(button, False, False, 0)
vbox.pack_end(self.canvas, True, True, 0)
self.add(vbox)
self.resize(400, 400)
self.show_all()
def on_button_clicked(self, widget):
if self.num < self.max_page-1:
self.canvas.queue_draw()
self.num += 1
def on_draw(self, widget, cr):
aw = widget.get_allocated_width()
ah = widget.get_allocated_height()
page = self.pdf.get_page(self.num)
w, h = page.get_size()
if aw * h > ah * w:
n = ah/h
matrix = cairo.Matrix(n, 0, 0, n, aw/2-w*n/2, 0)
cr.transform(matrix)
else:
n = aw/w
matrix = cairo.Matrix(n, 0, 0, n, n, ah/2-h*n/2)
cr.transform(matrix)
page.render(cr)
PdfWin()
Gtk.main()
で
こんなにアッサリ。。。
何もインストールしないでも表示するだけならマジでこれだけ。
cairo のドキュメントを見ると PDFSurface なんてサーフェスがあるね。
こんなに面白かったのか cairo って。






