Archive for the ‘Python’ Category
Skeniranje knjige “Gramatika arapskog jezika”
Trenutno su kod mene (pozajmljena) oba dijela knjige “Gramatika arapskog jezika”, iz 1936/1937 godine. Knjige su prilično stare, ali se i dan danas koriste, u novijim izdanjima, za izučavanje arapskog jezika.
Kao što se iz gornjih linkova vidi, knjige su skenirane i postavljene na web archive-i za download. Ovaj tekst je tu da me podsjeti šta sam koristio/radio prilikom skeniranja.
Za skeniranje sam koristio MFP Samsung SCX-4200. Kao operativni sistem uglavnom koristim Ubuntu, ali SCX4200 ima problematične ne-slobodne driver-e za štampač, tako da sam samo skeniranje radio na WXP-u. Program (SmarThru) sam podesio da skenira 24-bitno, 300dpi, a slike sam sačuvavao kao JPEG, i to sa maksimalnim ponuđenim kvalitetom.
Nakon skeniranja koristio sam sljedeću (fixpages.py) Python skriptu (koja koristi PIL) za “kidanje” stranica:
import os
from PIL import Image as Im
import datetime
now = datetime.datetime.now
SRC_DIR = './raw'
DEST_DIR = './single'
if not os.path.exists(DEST_DIR):
os.mkdir(DEST_DIR)
d_left = 50
d_right = 200
d_up = 20
d_down = 210
t1 = now()
for fname in sorted(os.listdir(SRC_DIR)):
im = Im.open(os.path.join(SRC_DIR, fname))
im = im.crop((d_left,d_up,im.size[0] - d_right,im.size[1] - d_down))
bare, ext = fname.rsplit('.',1)
pagenum = int(bare)
if pagenum % 2:
# odd page
im = im.rotate(180)
im.save(os.path.join(DEST_DIR, fname), quality=100)
t2 = now()
print t2 - t1
Naravno, podešavanja će biti drugačija za knjigu drugih dimenzija. Nakon što su stranice dotjerane koristio sam sljedeću skriptu za generisanje DjVu fajlova u boji:
import os
import sys
import subprocess
import datetime
now = datetime.datetime.now
DJVUFILES = []
PROCESSEDFILES = []
# A flag to indicate that no conversion from .jpg (etc.) to .djvu files
# should not be done
SKIPCONVERSION = None
# Remove old single .djvu files
REMOVEOLD = None
def removeold(indir):
"""Remove old .djvu files recursively."""
for basename in sorted(os.listdir(indir)):
fname = os.path.join(indir, basename)
if os.path.isfile(fname):
ext = os.path.splitext(fname)[1].lower()
if ext == ".djvu":
os.remove(fname)
def dir_iter(indir, outfile):
"""Convert all JPEG, PPM and PBM images in a directory to
(separate) DjVu files.
"""
for basename in sorted(os.listdir(indir)):
fname_src = os.path.join(indir, basename)
fname_dst = os.path.join(indir, basename + ".djvu")
if os.path.isfile(fname_src):
convert_one_img(fname_src, fname_dst)
# firstfile = DJVUFILES.pop(0)
# shutil.copy(firstfile, outfile)
# for djvufile in DJVUFILES:
# pass
DJVUFILES.insert(0, outfile)
DJVUFILES.insert(0, '-c')
DJVUFILES.insert(0, 'djvm')
t12 = now()
print t12-t1
subprocess.call(DJVUFILES)
def convert_one_img(fname_src, fname_dst):
ext = os.path.splitext(fname_src)[1].lower()
if ext == ".djvu":
# This covers the case of existing .djvu files.
# They should be added to the document
basename_src = os.path.splitext(fname_src)[0]
if basename_src in PROCESSEDFILES:
return
elif SKIPCONVERSION:
DJVUFILES.append(fname_src)
return
if SKIPCONVERSION:
return
if os.path.exists(fname_dst):
DJVUFILES.append(fname_dst)
PROCESSEDFILES.append(fname_src)
return
args = [fname_src, fname_dst]
if ext in (".jpg", ".jpeg", ".ppm"):
args = "c44 -slice 74,89".split() + args
elif ext == ".pbm":
args.insert(0,"cjb2")
else:
return
print args
subprocess.call(args)
DJVUFILES.append(fname_dst)
PROCESSEDFILES.append(fname_src)
if __name__ == '__main__':
import optparse
parser = optparse.OptionParser(
usage='%prog [-c] <indir> <outfile>'
)
parser.add_option("-s", "--skipconversion",
action="store_true", dest="skipconversion", default=False,
help="Skip conversion of images to (single) .djvu files")
parser.add_option("-r", "--removeold",
action="store_true", dest="removeold", default=False,
help="Remove old (single) .djvu files")
options, args = parser.parse_args()
SKIPCONVERSION = options.skipconversion
REMOVEOLD = options.removeold
try:
indir = args[0]
outfile = args[1]
except IndexError:
print parser.usage
t1 = now()
if REMOVEOLD:
removeold(indir)
dir_iter(indir, outfile)
t2 = now()
print t2 - t1
Kao što se vidi, koristio sam isključivo Open Source programe za generisanje/manipulisanje DjVu fajlovima.
Za prebacivanje u PDF format sam koristio program djview, tj. djview4. Ovaj program može da odradi i konverziju u bitonalni format, ali je konverzija korica bila nezadovoljavajuća, jer korica biva praktično kompletna “ocrnjena”.
Da bih generisao bitonalni (crno-bijeli) DjVu (fajlovi su manji nego DjVu fajlovi u boji) prihvatljivih karakteristika morao sam slike imati u PBM formatu, koji koristi koristi program cjb2. Za JPEG/PBM konverziju sam koristio sljedeću bash comandu:
anytopnm jpegs/image.jpg |ppmtopgm |pgmtopbm -threshold -value 0.15>image.pbm
“-threshold” opcija odrađuje bitonalizaciju po starom dobrom threshold principu. 0.15 je prag (threshold) koji je bio zadovoljavajući. Ima malo više crnih tačaka ali neka.
Još da napomenem da sam kod generisanja DjVu-a u boji koristio i opciju:
c44 -slice 74,89,99
ali ona daje duplo veći fajl.
To je sve čega mogu da se sjetim.
Ne zaboravite me u dovama!
Export podataka sa openstreetmap.org
Napisao sam malu skriptu u Python-u koja parse-uje XML export fajl koji se dobije kada na sajtu http://openstreetmap.org/ zumirate Podgoricu (možda bi bilo bolje Crnu Goru?), pritisnete na tab export, a onda i na dugme export. Slikovitije:

OSM export za Podgoricu
Kod za Python scriptu:
http://pastie.org/303858
Sačuvajte gore navedeni kod u neki fajl (npr osm_me.py) i pozovite ga pomoću:
python osm_me.py /path/to/map.xml