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

Da Wikisource.

Utilizza le routine DjvuLibre che devono essere raggiungibili; elimina lo strato background delle pagine, che talora ne ostacola la leggibilità. Vedi un esempio nella cronologia di File:Verga - Vagabondaggio.djvu.

Funzionamento: copiare il file nomefile.djvu nella stessa cartella del file bgRemove.py e lanciare:

python bgRemove.py nomefile.djvu

Nella stessa cartella comparirà (dopo un tempo piuttosto lungo) il file result.djvu.


#!/usr/bin/python
# -*- coding: utf-8  -*-
# Versione 2 settembre 2018 (modifica sostanziale della funzione djvm con marcata accelerazione della fase di assemblaggio pagine)
import sys
import os
import shutil
import re

US=u'\x1f'  # unit separator
GS=u'\x1d' # group separator
VT=u'\x0b' # vertical tab
FF=u'\x0c'  # form feed

def main(djvu=None):
    if not djvu.endswith(".djvu"):
        djvu+=".djvu"
    print(djvu)
    l=os.listdir(os.getcwd())
    if not "djvu1" in l:
        os.mkdir("djvu1")
    if not "temp" in l:
        os.mkdir("temp")
    result=os.system("djvudump %s >" %(djvu) +os.path.join("temp","dump") )
    # dump è la lista di elementi dump, l'indice corrisponde al numero pagina
    dump=open(os.path.join("temp","dump")).read().split("FORM:DJVU")
    dumpdata={}
    empt("djvu1")
    for pagina in range(1,len(dump)):
        dmp=infoparse(dump[pagina])
        #print dmp
        
        #com="djvumake djvu1/pag%s.djvu INFO=%s,%s,%s " %(str(pagina),dmp["w"],dmp["h"],dmp["dpi"])
        com="djvumake "+os.path.join("djvu1","pag")+"%s.djvu " %("_"+str(pagina).zfill(4))
        if dmp["Sjbz"]:
            extract(djvu,pagina,"Sjbz")
            com+="Sjbz="+os.path.join("temp","Sjbz")+" "
        if dmp["FG44"]:
            extract(djvu,pagina,"FG44")
            com+="FG44="+os.path.join("temp","FG44")+" "
        if dmp["TXTz"]:
            extract(djvu,pagina,"TXTz")
            com+="TXTz="+os.path.join("temp","TXTz")+" "
        if dmp["Sjbz"] and dmp["FG44"]:
            os.system(com)
            #print(com)
            print("Pag. %s Sjbz" % (str(pagina)))
        else:
            com='djvused %s -e "select %s; ' % (djvu,str(pagina))+"save-page-with "+os.path.join("djvu1","pag")+"%s.djvu" % ("_"+str(pagina).zfill(4))+'"'
            os.system(com)
            print("Pag. pag%s as is" % ("_"+str(pagina).zfill(4)))
    print("chiamo djvm")
    djvm()
    return
                
def djvm():
    l=os.listdir("djvu1")
    l.sort()
##    os.system("copy "+os.path.join("djvu1","%s" % (l[0]))+" new.djvu" )
##    print "Copio djvu1\\%s  in new.djvu" % (l[0])
##        
##    for djvu in range(1,len(l)):
##        com="djvm -i %s %s " % ("new.djvu",os.path.join("djvu1",l[djvu]))
##        os.system(com)
##        print com
    for i in range(len(l)):
        l[i]="djvu1/"+l[i]

    n=0
    nx=0
    while n<len(l):
        pagine=" ".join(l[n:n+100])
        if nx==0:
            comando="djvm -c result.djvu %s" % (pagine)
            #print(comando)
            os.system(comando)
        else:
            comando="djvm -c temp/x%d.djvu %s" % (nx,pagine)
            #print(comando)
            os.system(comando)
            
            comando="djvm -i result.djvu temp/x%d.djvu" % (nx)
            #print(comando)
            os.system(comando)
        n+=100
        nx+=1
    return

def empt(path):
    for root, dirs, files in os.walk(path):
        for f in files:
            os.unlink(os.path.join(root, f))
        for d in dirs:
            shutil.rmtree(os.path.join(root, d))
    return
            
def infoparse(pagina):
    d={}
    r1=re.compile(r"DjVu (\d+)x(\d+)")
    r2=re.compile(r"(\d+) dpi")
    size=r1.findall(pagina)
    d["w"]=size[0][0]
    d["h"]=size[0][1]
    d["dpi"]=r2.findall(pagina)[0]
    d["TXTz"]= ("TXTz" in pagina)
    d["Sjbz"]= ("Sjbz" in pagina)
    d["FG44"]= ("FG44" in pagina)
    d["BG44"]= ("FG44" in pagina)
    
    return d
    
def extract(djvu,pagina,layer):
    comando="djvuextract -page=%d %s %s=temp/%s"
    os.system(comando % (pagina,djvu,layer,layer))
    return
           
    

if __name__ == "__main__":
    try:
        djvu=sys.argv[1]
        main(djvu)
    except:
        pass