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

Da Wikisource.
#!/usr/bin/python
# -*- coding: utf-8  -*-
# Richiede il modulo internetarchive.py per scaricare in locale i files _abbyy.gz e __jp2.zip. 
# Lo scaricamento può essere fatto da riga di comando con:
# ia download glob="*_abbyy.gz"
# ia download glob="*_jp2.zip"
# I due comandi scarcano i file in una cartella il cui nome corrisponde all'ID IA del libro.
# Eseguito ildownload, al momento l'esecuzione di iaPict.py prevede i due seguenti comandi (dopo avviato python 
# nella directory "madre" della directory dove sono contenuti i due file):
#     from iaPict import *
#     main("ID IA"])
# dove ID IA è il nome della sottocartella.
# Il programma decomprime il file gz e il file zip, esegue il parsing di _abbyy.xml cercando gli elementi 
# block blockType="Picture", ed estrae dai file jpg le aree interretate come "Picture", caricandole in due
# cartelle jpg e png. Al momento, inoltre, pywikibot non viene utilizzato. 


#import pywikibot as bot
#import re
#import pywikibot.pagegenerators as pagegenerators
#import pywikibot.proofreadpage as proofreadpage
from os import listdir,system,path,rename,mkdir
#import pickle
#from urllib import FancyURLopener
from bs4 import BeautifulSoup
from PIL import Image


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

#opener=MyOpener()
# mul=bot.Site("mul","wikisource")
# it=bot.Site("it","wikisource")
# bn=bot.Site("bn","wikisource")
# commons=bot.Site("commons","commons")

# decompressione file
def unzip(iaId):
    import zipfile
    l=listdir(iaId)
    nf=""
    for f in l:
        if "_jp2.zip" in f:
            
            zipfile.ZipFile(path.join(iaId,f)).extractall()
            folderName=f.replace(".zip","")
            rename(folderName,path.join(iaId,folderName))
                            
            print "estratto jp2 ("+f+") ..."
            nf=f
    return nf

def gunzip(iaId):
    import gzip
    l=listdir(iaId)
    nf=""
    for f in l:
        if "_abbyy.gz" in f:
            ff= gzip.open(path.join(iaId, f), 'rb')
            file_content = ff.read()
            ff.close()
            open(path.join(iaId, iaId+"_abbyy.gz").replace(".gz",".xml"),"w").write(file_content)
            print "estratto xml ("+iaId+"_abbyy.xml"+") ..."
    return

# dato il file ID_abbyy.xml contenuto nella cartella ID testituisce la lista p dell'xml delle pagine
def splitPagine(iaId):
    p=unicode(open(path.join(iaId,iaId+"_abbyy.xml")).read(),"utf-8").split("<page")
    header=p.pop(0)
    for i in range(len(p)):
        p[i]="<page"+p[i]
    return p

# data la lista p dell'xml di ciascuna pagina restituisce l'elenco dei numeri pagina contenenti
# blockType="Picture"
def selectPagesWithPictures(p):
    d={}
    for i in range(len(p)):
        if 'blockType="Picture"' in p[i]:
            d[str(i).zfill(4)]=p[i]
    return d

# dato un elemento bs4 block restituisce le coordinate del rettangolo contenente l'immagine
def extractRect(block): # blocco è elemento bs4 blockType="Picture"
    rect=(int(block["l"]),int(block["t"]),int(block["r"]),int(block["b"]))
    return rect

# dato un elemento bs4 page restituisce la lista degli elementi bs4 blockType="Picture"
def extractBlocks(page):  # page è elemento bs4 page
    blocks=page.find_all("block",{"blockType":"Picture"})
    return blocks

# dato il dizionario d (key: numero della pagina normalzzato; value: xml della pagina) estrae,
# pagina per pagina, le coordinate dei blocchi associato al numero pagina normalizzato
def cropData (d):
    data=[]
    for key in d:
        pageBs4=BeautifulSoup(d[key],"xml")
        blocchi=extractBlocks(pageBs4)
        for i in range(len(blocchi)):
            data.append([key,extractRect(blocchi[i])])
    return data

def main(iaId, dezip=True):
    if dezip:
        unzip(iaId)
        gunzip(iaId)
    p=splitPagine(iaId)
    print "eseguito split pagine"
    d=selectPagesWithPictures(p)
    print "eseguita selezione pagine"
    cropList=cropData(d)
    print "eseguito parsing blocchi"
    jp2Name=""
    for f in listdir(iaId):
        if f.endswith("_jp2"):
            jp2Name=f[:-4]
            break
    if jp2Name=="":
        print "Errore nome files: verificare"
        return
    if not "jpg" in listdir(iaId):
        mkdir(path.join(iaId,"jpg"))
    if not "png" in listdir(iaId):
        mkdir(path.join(iaId,"png"))
            
    for i in range(len(cropList)):
        imm=Image.open(path.join(iaId,jp2Name+"_jp2", jp2Name+"_"+cropList[i][0]+".jp2"))
        
        fjpg=path.join(iaId,"jpg",cropList[i][0])+".jpg"
                       
        n=1
        while True:
            if path.isfile(fjpg):
                fjpg=fjpg.replace(".jpg","_"+str(n)+".jpg")
                n+=1
            else:
                break
        fpng=fjpg.replace("jpg","png")
        imm.crop(cropList[i][1]).save(fjpg)
        imm.crop(cropList[i][1]).save(fpng)              
        print "   salvata immagine ",fjpg, fpng
    return