import wxPython import wx from wxPython import xrc import os import shutil import subprocess import random import re PDF_LIB_DIR = os.path.join("D:\\","study","paper") PDF_TO_TXT_COMMAND = "D:\\freeware\\d2txt128\\xdoc2txt.exe " HIGHLIGHT_TEXT_COLOUR = "#ffff78" DEFAULT_TEXT_COLOUR = "#ffffff" PDF_LINE_MAX = 200 #======================================== Main App Class class MyApp(wx.App): def OnInit(self): #... init value self.pdf_line_max = PDF_LINE_MAX self.src_pdf = None self.update_text = None self.first_time = True #... read xrc file self.res = xrc.wxXmlResource("pdflib.xrc") self.frame = self.res.LoadFrame(None, "MainFrame") self.panel = xrc.XRCCTRL(self.frame, "MainPanel") self.pdfpath = xrc.XRCCTRL(self.panel, "PdfPath") self.author = xrc.XRCCTRL(self.panel, "Author") self.title = xrc.XRCCTRL(self.panel, "Title") self.message = xrc.XRCCTRL(self.panel, "Message") self.text = xrc.XRCCTRL(self.panel, "Text") self.addpdf = xrc.XRCCTRL(self.panel, "addpdf") #... bind self.frame.Bind(wx.EVT_BUTTON, self.OnAddPdf, self.addpdf) self.pdfpath.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus_pdfpath) self.author.Bind( wx.EVT_SET_FOCUS, self.OnSetFocus_author) self.title.Bind( wx.EVT_SET_FOCUS, self.OnSetFocus_title) self.text.Bind( wx.EVT_LEFT_UP , self.OnLeftUp) self.panel.SetDropTarget( FileDropTarget(self.frame, self.OnDrop) ) #... show self.frame.Show() self.OnSetFocus_pdfpath("dummy") return True #--- binding methods def OnDrop(self,filelist): u""" Make temporary directory, read text from PDF file, set text to text area """ # if pdf adding havent completed yet, delete temp dir if self.src_pdf is not None: shutil.rmtree(self.temp_dir) self.src_pdf = filelist[0] if self.src_pdf[-3:].lower() != "pdf": self.src_pdf = None return False self.pdfpath.SetValue(self.src_pdf) # mkdir and copy pdf file self.temp_dir = mkdir_temp(PDF_LIB_DIR) self.temp_pdf = os.path.join(self.temp_dir,"temp.pdf") shutil.copy(self.src_pdf,self.temp_pdf) # write text in text area # write to text file f = file(os.path.join(self.temp_dir,"paper.txt"),u"w") self.text.SetValue( read_pdf(self.temp_pdf,self.pdf_line_max,f) ) # next step is choosing author from text area self.OnSetFocus_title("dummy") return True def OnSetFocus_pdfpath(self,event): if not self.src_pdf: self.pdfpath.SetValue("Drag and drop PDF file!") self.unset_colour((self.title, self.author)) self.pdfpath.SetBackgroundColour(HIGHLIGHT_TEXT_COLOUR) self.pdfpath.Refresh() def OnSetFocus_title(self,event): if self.src_pdf: self.unset_colour((self.author, self.pdfpath)) self.title.SetBackgroundColour(HIGHLIGHT_TEXT_COLOUR) self.title.Refresh() self.update_text = self.title self.next_text = self.OnSetFocus_author def OnSetFocus_author(self,event): if self.src_pdf: self.unset_colour((self.title, self.pdfpath)) self.author.SetBackgroundColour(HIGHLIGHT_TEXT_COLOUR) self.author.Refresh() self.update_text = self.author self.next_text = self.OnSetFocus_title def OnLeftUp(self,event): if self.update_text: text = self.text.GetStringSelection() # strip string text = text.replace(u"\n",u" ") text = re.sub( u" +" , u" ", text) text = re.sub( u"^ +", u"" , text) text = re.sub( u" +$", u"" , text) text = str_strip_for_path(text) self.update_text.SetValue(text) if self.first_time: self.next_text("dummy") self.first_time = False event.Skip() def OnAddPdf(self,event): # rename pdf and dir author = str_strip_for_path( self.author.GetValue() ) title = str_strip_for_path( self.title.GetValue() ) rename_dir = os.path.join( os.path.split(self.temp_dir)[0], author + u"; " + title ) rename_pdf = os.path.join( rename_dir, title + u".pdf") temp_pdf = os.path.join( rename_dir, os.path.split(self.temp_pdf)[1]) if os.path.exists(rename_dir): error_dlg = wx.MessageDialog(self.frame, "Existing directory:\n" + rename_dir, 'Existing PDF name', wx.OK | wx.ICON_ERROR) error_dlg.ShowModal() error_dlg.Destroy() return False os.rename(self.temp_dir, rename_dir) os.rename( temp_pdf, rename_pdf) # clear os.remove(self.src_pdf) self.clear() self.src_pdf = None self.OnSetFocus_pdfpath("dummy") #--- unset colour def unset_colour(self,obj): for o in obj: o.SetBackgroundColour(DEFAULT_TEXT_COLOUR) o.Refresh() def clear(self): self.author.SetValue("") self.title.SetValue("") self.text.SetValue("") #======================================== Sub classes #--- File Drop class class FileDropTarget(wxPython.wx.wxFileDropTarget): def __init__(self, window, OnDrop): wxPython.wx.wxFileDropTarget.__init__(self) self.OnDrop = OnDrop def OnDropFiles(self, x, y, filenames): self.OnDrop(filenames) #======================================== functions #--- make temp dir def mkdir_temp(root_path,temp="temp"): path = os.path.join(root_path, temp) while True: if not os.path.exists(path): break path += str(random.randint(0,9)) os.mkdir(path) return path #--- read pdf file def read_pdf(pdf_file_path,line_max=-1,f=None): cmd = PDF_TO_TXT_COMMAND + u'\"' + pdf_file_path + u'\"' p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) all = [] lines = "" i=0 while True: ln = p.stdout.readline() if not ln: break all.append(ln) if line_max<0 or i",u"|"]): for l in list: string = string.replace(l,u"") return string #======================================== if main if __name__ == '__main__': app = MyApp() # use MyApp(0) if you don't want to redirect stdout/stderr app.MainLoop() app.frame = app.res.LoadFrame(None, "MainFrame") app.panel = xrc.XRCCTRL(app.frame, "MainPanel") app.text = xrc.XRCCTRL(app.panel, "Text")