Progetto:Bot/Programmi in Python per i bot/djvu.py

# Name:        module1
# Purpose:
#
# Author:      alessandro.brollo
#
# Created:     14/10/2011
# Copyright:   (c) alessandro.brollo 2011
# Licence:     <your licence>
#-------------------------------------------------------------------------------
#!/usr/bin/env python

from scripts import *
import os
import re

# legge il numero di pagine di un file djvu
def npag(fdjvu):
    comando="djvused #filedjvu -e n > temp.txt"
    os.system(comando.replace("#filedjvu",fdjvu))
    npag=open("temp.txt").readline()
    return eval(npag.strip())

# legge il layer testo di una pagina di un file djvu via djvutxt.exe e la restituisce tal quale
# il testo è memorizzato nel file temp.txt
# può essere selezionato un "livello di dettaglio" della struttura del file: page, column, region, para, line (default line)
def leggiPag(pagina,fdjvu="rct.djvu", detail="line"):
    '''
    Legge una pagina di un file djvu con djvutxt'''
    
    comando=("djvutxt -detail=#detail -page=#pag "+fdjvu+" temp.txt")\
             .replace("#pag",str(pagina))\
             .replace("#detail",detail)
    os.system(comando)
    testo=open("temp.txt").read()
    return testo
# esegue la "trasformazione testo->schema+lista" (estrae tutti i testi dallo schema del file sostituendoli con riferimenti;
# i testi sono raccolti come elementi di una lista con modifiche a caratteri critici
def t2sl(testo):
    '''
    Trasforma testo in schema + lista'''
    schema=testo
    schema=schema.replace('\\"',""")
    lista=produci_lista(schema,'"','"',1)
    
    for i in range(len(lista)):
        schema=schema.replace(lista[i],"["+str(i)+"]")
    for i in range(len(lista)):
        lista[i]=lista[i].replace(""",'\"')[1:-1]
    
    return (schema,lista)

## Funzione inversa alla precedente; da schema e lista ricostruisce testo
def sl2t(schema, lista):
    testo=""
    for i in range(len(lista)):
        el='"'+lista[i].replace('"','\\"')+'"'
        schema=schema.replace("["+str(i)+"]",el)
    testo=schema
    return testo
## funzione inversa a leggiPag: inserisce un testo in una pagina di un file djvu. Il testo deve avere la struttura 
## appropriata (ad es. deve essere prodotto con la routine sl2t() )
def scriviPag(pagina,testo,fdjvu="rct.djvu"):
    '''
    scrive testo in pagina del file fdjvu'''
    open("temp.txt","w").write(testo)
    comando='djvused #filedjvu -e "select #pag; set-txt temp.txt; save"'\
             .replace("#filedjvu",fdjvu)\
             .replace("#pag",str(pagina))
    os.system(comando)
    return "Fatto"

def main():
    return

# sostituzione di caratteri critici 
def txtCode(testo):
    testo=testo.replace("\n","\\n").replace('"','\\"')
    return testo

# routine di prova. 
# Avendo un file djvu con layer testo da IA (RCT1936.djvu) e una sua copia (rct.djvu), e avendo la collezione 
# file da ocr FineReader in una cartella rct_OCR, a pagina singola, denominati Rct1936 - 0001.txt, Rct1936 - 0002.txt...
# lo script legge il layer test pagina per pagina del primo file djvu, ottiene schema + lista e sostituisce l'elemento lista
# con il file da OCR finereader; carica quindi la pagina sul secondo file djvu. 
def test(ini,fin):
    for p in range(ini,fin):
        testo=leggiPag(p,detail="page",fdjvu="RCT1936.djvu")
        s,l=t2sl(testo)
        tNew=open("rct_OCR/Rct1936 - #np.txt".replace("#np",str(p).zfill(4))).read()
        tNew=[txtCode(tNew)]
        testo=sl2t(s,tNew)
        print "salvo testo in pag.",p
        scriviPag(p,testo)  # scrive  di default il layer testo su rct.djvu
    return
        

if __name__ == '__main__':
    main()