我がアプリに PDF 表示機能を追加するのは前回のとおり簡単だった。
問題はサムネイル、GtkDrawingArea を配列に入れればいいやと思っていた。
Matrix で表示させたら凄いメモリ食いなうえスクロールが遅過ぎで使えなかった。
GtkFlowBox を破棄したら突っ込んだ GtkDrawingArea も破棄されるのは当然だった。
結局は縮小 GdkPixbuf にするという何のヒネリもない実装になった。
cr.render は背景は何もしないのね、白で塗り潰す必要があった。
細かくは comipoli のソースを見てくれということで。
つまり PDF は結構簡単に画像にできるってことだ。
それなら変換アプリでも作ろうかなと思ったけど。
#!/usr/bin/env python3
'''
pdf2png.py
'''
import sys, gi, cairo
gi.require_version('Gdk', '3.0')
gi.require_version('Poppler', '0.18')
gi.require_version('GdkPixbuf', '2.0')
from gi.repository import Gio, Gdk, GdkPixbuf, Poppler
if len(sys.argv) < 2:
print('Usage: python3 {} PDFFILENAME'.format(sys.argv[0]))
sys.exit()
f = Gio.File.new_for_path(sys.argv[1])
pdf = Poppler.Document.new_from_gfile(f)
l = pdf.get_n_pages()
for i in range(l):
page = pdf.get_page(i)
w, h = page.get_size()
w = round(w)
h = round(h)
with cairo.ImageSurface(cairo.Format.ARGB32, w, h) as surface:
cr = cairo.Context(surface)
cr.set_source_rgb(1, 1, 1)
cr.rectangle(0, 0, w, h)
cr.fill()
page.render(cr)
pixbuf = Gdk.pixbuf_get_from_surface(surface, 0, 0, w, h)
pixbuf.savev('{0:03d}.png'.format(i + 1), 'png', ['compression'], ['9'])
おしまい。
たったこれだけだったのでヤメ!
GNOME ってスゲェなぁ、何故使う人少ないんだろう?