--- /dev/null
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+#
+# gpdf2swf.py
+# graphical user interface for pdf2swf
+#
+# Part of the swftools package.
+#
+# Copyright (c) 2008,2009 Matthias Kramm <kramm@quiss.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+from __future__ import division
+import os
+import time
+import thread
+import gfx
+import wx
+from wx.lib.pubsub import Publisher
+from subprocess import Popen, PIPE
+
+class _SaveSWFThread:
+ def __init__(self, filename, doc, pages, options):
+ self.__doc = doc
+ self.__filename = filename
+ self.__pages = pages or range(1, doc.pages+1)
+ self.__options = options
+
+ def Start(self):
+ self.__keep_running = self.__running = True
+ thread.start_new_thread(self.Run, ())
+ #self.Run()
+
+ def Stop(self):
+ self.__keep_running = False
+
+ def IsRunning(self):
+ return self.__running
+
+ def Run(self):
+ pages = len(self.__pages)
+ wx.CallAfter(Publisher.sendMessage, "SWF_BEGIN_SAVE",
+ {'pages': pages,})
+
+ time.sleep(0.05)
+
+ swf = gfx.SWF()
+ self.set_swf_parameters(swf)
+
+ plugin = self.__options.viewers.init(swf, self.__filename)
+
+ plugin.before_render()
+ for i, pagenr in enumerate(self.__pages):
+ page = self.__doc.getPage(pagenr)
+ swf.startpage(page.width, page.height)
+ page.render(swf)
+ swf.endpage()
+ wx.CallAfter(Publisher.sendMessage, "SWF_PAGE_SAVED",
+ {'pagenr': i+1,
+ 'pages': pages,})
+ time.sleep(0.05)
+ if not self.__keep_running:
+ break
+ else:
+ # This will not run if we break the for loop
+ plugin.before_save(page)
+ swf.save(self.__filename)
+ plugin.after_save(page)
+
+ # No need. But to be sure that it's clean up
+ # as soon as possible
+ del swf
+
+ wx.CallAfter(Publisher.sendMessage, "SWF_FILE_SAVED")
+ time.sleep(0.05)
+
+ self.__running = False
+
+ def set_swf_parameters(self, swf):
+ for opt in self.__options.quality:
+ if type(opt.name) in (tuple, list):
+ for name, value in (
+ # Example to better understand the list comprehension:
+ # opt.name = ['a', 'b', 'c']
+ # opt.value = [1, 2, 3]
+ # zip them = [('a',1), ('b', 2), ('c', 3)]
+ # pair will be in this example ('a', 1) due to
+ # the if pair[1] condition
+ pair for pair in zip(opt.name, opt.value) if pair[1] == 1
+ ):
+ #print "1.swf.setparameter(%s, %s)" % (name, value)
+ swf.setparameter(str(name), str(value))
+ else:
+ #print "2.swf.setparameter(%s, %s)" % (opt.name, str(opt.value))
+ swf.setparameter(opt.name, str(opt.value))
+
+
+class Document:
+ def __init__(self):
+ self.__page = None
+ self.__zoom = 1
+ self.__lastsavefile = "output.swf"
+
+ def __get_lastsavefile(self):
+ return self.__lastsavefile
+ def __set_lastsavefile(self, lastsavefile):
+ self.__lastsavefile = lastsavefile
+ lastsavefile = property(__get_lastsavefile, __set_lastsavefile)
+
+ def __SwapExtension(self, filename, newext):
+ basename, ext = os.path.splitext(filename)
+ return "%s.%s" % (basename, newext)
+
+ def __Reload(self):
+ Publisher.sendMessage("PAGE_CHANGED",
+ {'page': self.__page,
+ 'width': int(self.__page.width * self.__zoom),
+ 'height': int(self.__page.height * self.__zoom)})
+
+ def Load(self, filename):
+ self.__lastsavefile = self.__SwapExtension(filename, "swf")
+ #self.__htmlfilename = self.__SwapExtension(filename, "html")
+ self.__pdf = gfx.open("pdf", filename)
+ Publisher.sendMessage("FILE_LOADED", {'pages': self.__pdf.pages})
+
+ def ChangePage(self, pagenr=1, size=None):
+ self.__page = page = self.__pdf.getPage(pagenr)
+ self.__Reload()
+
+ def Fit(self, size):
+ w = size[0] / self.__page.width
+ h = size[1] / self.__page.height
+ self.__zoom = min(w, h)
+ self.__Reload()
+
+ def Zoom(self, zoom):
+ self.__zoom = 1 if zoom == 1 else self.__zoom + zoom
+ self.__Reload()
+
+ def GetThumbnails(self):
+ for pagenr in range(1, self.__pdf.pages + 1):
+ page = self.__pdf.getPage(pagenr)
+ yield page
+
+ def SaveSWF(self, filename, pages, options):
+ self.__lastsavefile = filename
+ t = _SaveSWFThread(filename, self.__pdf, pages, options)
+ t.Start()
+ return t
+
+