Utente:Divudi85/Python/fixOCR.py

#!/usr/bin/python
# -*- coding: utf-8  -*-




import re,sys,pickle   # importo i moduli re (regex), sys (necessario per l'eventuale passaggio parametri da riga di comando),
                       # pickle (permette di salvare su file qualsiasi variabile anche complessa)
from os import system  # da os (routine per interfaccia con il sistema operativo) importo system (che serve per lanciare un programma esterno
                       # come se si operasse dalla riga di comando: ci serve per lanciare routine djvuLibre su file djvu

# Questa funzione accetta il nome di un djvu, ne estrae il testo in formato "dsed", ossia in blocchi sempre più piccoli fino al livello word
# (singole parole), e permette di applicare a ogni singola parola una funzione di modifica repl().
# La seconda parte del programma usa il  file dsed modificato e lo rificca dentro il file djvu.


def dsedEdit(djvu):
    comando='djvused -u %s -e "select; output-txt" > input.dsed' % (djvu) # preparo la riga di comando da inviare al sistema operativo
    res=system(comando)   # la lancio; il comando estrae il testo e lo salva in input.dsed (file testo uft-8)
    if res != 0:          # verifica eventuale errore
        print "errore nella generazione input.dsed"
        return
    r=re.compile(r'(word \d+ \d+ \d+ \d+ ")(.+)("[)]+)$')   # preparo la regex per isolare dalle righe word il testo 
    l=unicode(open("input.dsed").read(),"utf-8").split("\n")  # apro input.dsed, lo leggo, lo trasformo in unicode, lo divido in una lista di righe
    for i in range(len(l)):              # scorro tutta la lista....
        if "(word " in l[i]:             # se la riga contiene (word ....
            x=r.findall(l[i])[0]         # scateno la regex; se tutto va bene mi restituisce una lista di tre elementi, quello centrale è il testo
                                         # della singola word (parola). 
            old="".join(x)               # memorizzo la vecchia stringa costituita dalla lista
            if len(x)==3:                # se tutto va bene...
                x1=repl(x[1])                          # lancio la funzione repl sull'elemento centrale x[1]
                l[i]=l[i].replace(old,x[0]+x1+x[2])    # e sostituisco, nella riga, la stringa "vecchia" con quella modificata
    open("output.dsed","w").write(("\n".join(l)).encode("utf-8"))     # salvo il tutto in output.desd
    comando='djvused %s -f output.dsed -s' % (djvu)                   # preparo il comando per ficcare il nuovo testo nel djvu
    res=system(comando)                                               # lo lancio....
    if res != 0:                                                      # verifico eventuali errori di sistema...
        print "errore nel montaggio di output.dsed"
        return
    return "fatto"                                                    # finito. 
                                  
	
# funzione di trasformazione : può essere qualsiasi, una serie di replace, una serie di regex.....
def repl(testo):                # riceve una parola...
    testo=testo.upper()         # la modifica ....
    return testo                # la restituisce  modificata

        
### pickle utilities 

def carica_pcl(nome_file, folder="dati/"):
    nome_file=folder+nome_file+".pcl"
    f=open(nome_file)
    contenuto=pickle.load(f)
    f.close()
    return contenuto

def salva_pcl(variabile,nome_file="dato",folder="dati/"):
    nome_file=folder+nome_file+".pcl"
    f=open(nome_file,"w")
    pickle.dump(variabile, f)
    f.close()
    print "Variabile salvata nel file "+nome_file
    return

### find_stringa() and produci_lista

def find_stringa(stringa,idi,idf,dc=0,x=None,side="left"):
    if side=="right":
        idip=stringa.rfind(idi)
    else:
        idip=stringa.find(idi)
    idfp=stringa.find(idf,idip+len(idi))+len(idf)
    if idip>-1 and idfp>0:
        if x!=None:
            while stringa[idip:idfp].count(x)>stringa[idip:idfp].count(idf):
                if stringa[idip:idfp].count(x)>stringa[idip:idfp].count(idf):
                    idfp=stringa.find(idf,idfp)+len(idf)
                
        if dc==0:
            vvalore=stringa[idip+len(idi):idfp-len(idf)]
        else:
            vvalore=stringa[idip:idfp]
    else:
        vvalore=""
    return vvalore

def produci_lista(testo,idi,idf,dc=1,inizio=None):
    t=testo[:]
    lista=[]
    while not find_stringa(t,idi,idf,1,inizio)=="":
        el=find_stringa(t,idi,idf,1,inizio)
        t=t.replace(el,"",1)
        if dc==0:
            el=find_stringa(el,idi,idf,0,inizio)
        lista.append(el)
    return lista


    
##
##def main(params):
##    leggi(params[1],params[2])
##    dsed()
##    return

##if __name__ == "__main__":
##
##    djvu=sys.argv
##    main(djvu)