Utente:Alex brollo/estrattoreImmagini.py

Da Wikisource.
Jump to navigation Jump to search

Bozza di programma per estrarre dal file djvu una copia .png delle immagini ritagliate con il template Ritaglio.

Il programma richiede solo, come parametro, il nome base del file djvu.

I passi sono:

  1. scaricamento djvu da Commons
  2. ricerca pagine che usano Ritaglio, e scaricamento testo
  3. estrazione dal file djvu delle pagine trovate come tiff (nel folder tiff)
  4. pagina per pagina, ricerca e parsing del template Ritaglio
  5. con PIL apertura del file tiff e estrazione del ritaglio (nel folder png)


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

import os, shutil, sys, wikipedia,json
from PIL import Image
from urllib import FancyURLopener
from scripts import find_stringa, produci_lista, list_in_cat,parseTemplate

class MyOpener(FancyURLopener):
    version = 'User-Agent: Alex_brollo (+http://wikisource.org/wiki/User:Alex_brollo)'

opener=MyOpener()
graffe='{{}}'
def grab(base, forza=False):
    # scarica in locale un file djvu
    fileDjvu="File:"+base
    if not os.path.exists(base):
        sito=wikipedia.getSite("commons","commons")
        pagina=wikipedia.ImagePage(sito,fileDjvu)
        url= pagina.fileUrl()
        page=opener.open(url)
        content=page.read()
        open(base,"wb").write(content)
    l=list_in_cat("Pagine con immagini provvisorie")
    listaPagine={}
    
    print "Ricarca pagine con template Ritaglio"
    for i in l:
        if "Pagina:"+base+"/" in i:
            testo=wikipedia.Page("it",i).get()\
                   .replace("{{FreedImg/crop","{{Ritaglio")\
                   .replace("{{Crop\n","{{Ritaglio\n")\
                   .replace("{{freedImg/crop","{{Ritaglio")\
                   .replace("{{crop\n","{{Ritaglio\n")\
                   .replace("{{ritaglio","{{Ritaglio")
            listaPagine[i]=testo
            print i
           
    print "Trovate ",len(listaPagine), " pagine"
    
    # caricamento immagini tiff in /tiff
    # 1. ripulitura cartella tiff
    print "Controllo e ripulitura cartella tiff"
    if not os.path.exists("tiff"):
        os.mkdir("tiff")
    else:
        for i in os.listdir("tiff"):
            os.remove("tiff/"+i)

    print "Controllo e ripulitura cartella png"
    if not os.path.exists("png"):
        os.mkdir("png")
    else:
        for i in os.listdir("png"):
            os.remove("png/"+i)

    print "Controllo e ripulitura cartella jpg"
    if not os.path.exists("jpg"):
        os.mkdir("jpg")
    else:
        for i in os.listdir("jpg"):
            os.remove("jpg/"+i)
    
    
    print "Estrazione file tiff"
    # estrazione numeri pagina e chiamata a ddjvu
    for i in listaPagine:
        pagina=i.replace("Pagina:"+base+"/","")
        comando='ddjvu -format=tiff -page='+pagina+' "'+base+'" tiff/'+pagina+'.tif'
        print comando
        os.system(comando)
        
        listaTemplates=produci_lista(listaPagine[i],"{{Ritaglio","}}",1,"{{")
        
        for j in range(len(listaTemplates)):
            parametri=parseTemplate(listaTemplates[j],"Ritaglio")[0]
            estraiImmagine(pagina,j,parametri)
      
    return

def estraiImmagine(pagina,j,parametri):
    imm=Image.open("tiff/"+pagina+".tif")
    width    =float(parametri["width"].strip().replace("px",""))
    wtop     =float(parametri["wTop"].strip().replace("px",""))
    wleft    =float(parametri["wLeft"].strip().replace("px",""))
    wheight  =float(parametri["wHeight"].strip().replace("px",""))
    wwidth   =float(parametri["wWidth"].strip().replace("px",""))
    iWidth=imm.size[0]
    iHeight=imm.size[1]
    ratio=iWidth/width
    wtop     =int(float(parametri["wTop"].strip().replace("px",""))*ratio)
    wleft    =int(float(parametri["wLeft"].strip().replace("px",""))*ratio)
    wheight  =int(float(parametri["wHeight"].strip().replace("px",""))*ratio)
    wwidth   =int(float(parametri["wWidth"].strip().replace("px",""))*ratio)
    wbottom=wtop+wheight
    wright=wleft+wwidth
    print "Box:",wtop,wleft,wbottom,wright
    imm.crop((wleft, wtop,wright,wbottom)).save("png/"+pagina+"."+str(j)+".png")
    return

Questa versione invece non estrae le immagini dal fle djvu, ma direttamente dal file _jp2.zip di Internet Archive:

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

import os, shutil, sys, wikipedia,json
from PIL import Image
from urllib import FancyURLopener
from scripts import find_stringa, produci_lista, list_in_cat,parseTemplate

class MyOpener(FancyURLopener):
    version = 'User-Agent: Alex_brollo (+http://wikisource.org/wiki/User:Alex_brollo)'

#baseUrl="http://[server]/zipview.php?zip=[dir]/[base]_jp2.zip&file=[base]_jp2%2F[base]_[num].jp2&ext=jpg"

opener=MyOpener()
graffe='{{}}'
def grab(base, idIA=None,forza=False):
    # scarica in locale un file djvu
    fileDjvu="File:"+base
    
    sito=wikipedia.getSite("commons","commons")
    pagina=wikipedia.Page(sito,fileDjvu)
        #url= pagina.fileUrl()
        #page=opener.open(url)
        #content=page.read()
        #open(base,"wb").write(content)
    if idIA==None:
        idIA=find_stringa(pagina.get(),'{{IA|','}}',0)
    datiIA=json.loads(opener.open("http://archive.org/details/"+idIA+"?output=json").read())
    server=datiIA["server"]
    dirx=datiIA["dir"]
    baseJp2=''
    for i in datiIA["files"]:
        if i.endswith("_jp2.zip"):
            baseJp2=i.replace("_jp2.zip","")[1:]
            break
    
    baseUrl="http://[server]/zipview.php?zip=[dir]/[base]_jp2.zip&file=[base]_jp2%2F[base]_[num].jp2&ext=jpg"
    baseUrl=baseUrl.replace("[server]",server).replace("[dir]",dirx).replace("[id]",idIA).replace("[base]",baseJp2)
    
    #return baseUrl
    l=list_in_cat("Pagine con immagini provvisorie")
    listaPagine={}
    
    print "Ricarca pagine con template Ritaglio"
    for i in l:
        if "Pagina:"+base+"/" in i:
            testo=wikipedia.Page("it",i).get()\
                   .replace("{{FreedImg/crop","{{Ritaglio")\
                   .replace("{{Crop\n","{{Ritaglio\n")\
                   .replace("{{freedImg/crop","{{Ritaglio")\
                   .replace("{{crop\n","{{Ritaglio\n")\
                   .replace("{{ritaglio","{{Ritaglio")
            listaPagine[i]=testo
            print i
##            if len(listaPagine)>4:
##                break
           
    print "Trovate ",len(listaPagine), " pagine"
    
    # caricamento immagini tiff in /tiff
    # 1. ripulitura cartella tiff
    print "Controllo e ripulitura cartella tiff"
    if not os.path.exists("tiff"):
        os.mkdir("tiff")
    else:
        for i in os.listdir("tiff"):
            os.remove("tiff/"+i)

    print "Controllo e ripulitura cartella png"
    if not os.path.exists("png"):
        os.mkdir("png")
    else:
        for i in os.listdir("png"):
            os.remove("png/"+i)

    print "Controllo e ripulitura cartella jpg"
    if not os.path.exists("jpg"):
        os.mkdir("jpg")
    else:
        for i in os.listdir("jpg"):
            os.remove("jpg/"+i)

    print "Controllo e ripulitura cartella jp2"
    if not os.path.exists("jp2"):
        os.mkdir("jp2")
    else:
        for i in os.listdir("jp2"):
            os.remove("jp2/"+i)
    
    
    print "Caricamento file jpg da IA jp2"
    # estrazione numeri pagina e chiamata a ddjvu
    for i in listaPagine:
        pagina=i.replace("Pagina:"+base+"/","")
        url=baseUrl.replace("[num]",str(int(pagina)-1).zfill(4))
        print url
        im=opener.open(url)
        content=im.read()
        print len(content)
        open("jp2/pagina.jpg","wb").write(content)

                                  
        
        
        listaTemplates=produci_lista(listaPagine[i],"{{Ritaglio","}}",1,"{{")
        
        for j in range(len(listaTemplates)):
            parametri=parseTemplate(listaTemplates[j],"Ritaglio")[0]
            estraiImmagine(pagina,j,parametri)
      
    return

def estraiImmagine(pagina,j,parametri):
    imm=Image.open("jp2/pagina.jpg")
    width    =float(parametri["width"].strip().replace("px",""))
    wtop     =float(parametri["wTop"].strip().replace("px",""))
    wleft    =float(parametri["wLeft"].strip().replace("px",""))
    wheight  =float(parametri["wHeight"].strip().replace("px",""))
    wwidth   =float(parametri["wWidth"].strip().replace("px",""))
    iWidth=imm.size[0]
    iHeight=imm.size[1]
    ratio=iWidth/width
    wtop     =int(float(parametri["wTop"].strip().replace("px",""))*ratio)
    wleft    =int(float(parametri["wLeft"].strip().replace("px",""))*ratio)
    wheight  =int(float(parametri["wHeight"].strip().replace("px",""))*ratio)
    wwidth   =int(float(parametri["wWidth"].strip().replace("px",""))*ratio)
    wbottom=wtop+wheight
    wright=wleft+wwidth
    print "Box:",wtop,wleft,wbottom,wright
    imm.crop((wleft, wtop,wright,wbottom)).save("jpg/"+pagina+"."+str(j)+".jpg")
    return