#!/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