X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=wx%2Fdocument.py;fp=wx%2Fdocument.py;h=70cbb82987272c1236accf9d8c44b66354a263c8;hp=0000000000000000000000000000000000000000;hb=d51c9b672a2a23d9e9c7bc4c2d366ca8d66bda0e;hpb=c23e6dcc154017b49930e3807c84d3a6058f7963 diff --git a/wx/document.py b/wx/document.py new file mode 100644 index 0000000..70cbb82 --- /dev/null +++ b/wx/document.py @@ -0,0 +1,163 @@ +#!/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 +# +# 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 + +