at_yasu's blog

ロード的なことを

webkitで表示したHTMLのスナップショットを取る

説明は後。とりあえずソースだけ。

class PyScreenShoterWebkit:
	def __init__(self, urllist = None, savedir="/tmp", shot_delegate_method=None):
		self.url = []
		self.parentdir = savedir
		self.now_loading_url = ''
		
		if isinstance(urllist, list):
			self.url = urllist
		else:
			self.url.append(urllist)
		
		if not __GTK_MOZEMBED__:
			return 
		
		self.parent = None
		self.widget = None

		self.width  = 512
		self.height = 510
		self.countdown = 3
		
		self.shot_delegate_method = shot_delegate_method
		self.main()
	
	def main (self):
		# Window set
		if not self.parent:
			self.parent = gtk.Window(gtk.WINDOW_TOPLEVEL)
			self.parent.set_border_width(10)
		
		if not self.widget:
			self.widget = webkit.WebView()
			self.widget.connect("load-finished", self.on_net_stop)
			self.widget.set_size_request(1024,1020)
			self.parent.add(self.widget)
		
		self.now_loading_url = self.url.pop()
		if not self.now_loading_url:
			self.widget.destroy()
			self.parent.destroy()
			return True
		
		self.countdown = 3
		self.widget.open(self.now_loading_url)
		self.widget.show_all()
		self.parent.show_all()
	
	def getName (self):
		if __VERBOSE__ > 0:
			print 'get name'
		return hashlib.md5(self.now_loading_url).hexdigest()
	
	def on_net_stop(self, name='', title='', url=''):
		if __VERBOSE__ > 0:
			print 'on net stop'
		gobject.timeout_add(3000, self.do_countdown, self)
	def do_countdown(self,data = None):
		if __VERBOSE__ > 0:
			print 'do countdown'
		self.countdown -= 1
		if self.countdown > 0:
			time.sleep(1.0)
			gobject.timeout_add(3000, self.do_countdown, self)
			return True
		else:
			self.countdown = 3
			self.screenshot()
			return False
	
	def screenshot(self,data = None):
		import cairo

		if __VERBOSE__ > 0:
			print 'screenshot'
		pixbuf = self.widget.get_snapshot()
		f = pixbuf.cairo_create()
		
		path = os.path.abspath(self.parentdir) + '/' + self.getName() + ".png"
		f.get_target().write_to_png(path)