Progetto:Bot/Programmi in Python per i bot/bgRemove.py
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