Béton brut

imgtopdf

2008-09-20

Każda wymówka jest dobra. Postanowiłem kuknąć w Pythona żeby zobaczyć, co tam się zmieniło od 2005, kiedy to ostatni raz miałem okazję napisać sobie małego toola do monitorowania połączeń między routerami. Miałem już rozwiązanie, szukałem problemu.

Męczę się z seriami obrazków. Mam kilka ładnych komiksów, które cholernie ciężko się przegląda i przegrywa (na przykład na N800), postanowiłem więc zagonić Pythona do generowania jednego, grubego PDF-a, który pozwoli mi robić zakładki i wygodnie czytać na dowolnym urządzeniu.

Spędziłem pół godziny przełączając się między Safari i Vimem. Ostatecznie wyszło coś takiego.

import dircache
import Image
import ImageFilter
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.pagesizes import A3
from reportlab.lib.pagesizes import A4
import os, sys
from stat import *

class PDFStack:
        def __init__(self,filename):
                self.filename = filename
                self.pdf = Canvas(filename, pagesize = A4)
                # debug
                print filename
        def addToStack(self,file):
                #debug
                mode = os.stat(file)[ST_MODE]
                if S_ISDIR(mode):
                        print "I haz directory"
                        tree = ITree(file,self)
                print "Adding...",file
                try:
                        im = Image.open(file)
                        #im.filter(ImageFilter.BLUR)
                        #im.resize([2338,1654]) #A3 pi*drzwi
                        #im.resize([595,841]) #A4 pi*drzwi
                        #im.resize([200,300]);
                        #im.save('/tmp/'+file, "PNG")
                        self.pdf.drawImage(file,0,0,570,841) #hardoking, fuck yeah
                        self.pdf.showPage()
                except IOError:
                        print "Meh, ", file, " is not an image file"

class ITree:
        def __init__(self, dirname, stack):
                dirlist = dircache.listdir(dirname)
                for item in dirlist:
                        stack.addToStack(dirname +"/"+ item)

stack = PDFStack('/tmp/output.pdf')
tree = ITree('.',stack)
stack.pdf.save()

Wymagania to chyba Python 2.5 (działa ten dostarczony z OS X), Python Imaging Library 1.1.6 i ReportLab 2.2. Oczywiście, zero parametrów, więc jak komuś się chce, to może sobie dopisać obsługę argv. ;-) Mi już się nie chce, uzyskałem swojego PDF-a i mogę się uwalić, poczytać.

Cały kod potencjalnie ssie: choćby rekurencja, którą dopisałem jak przypomniałem sobie o podziale i rozmiary obrazków zakodowane na stałe. Ważne, że weekendowy projekt mam zaliczony i dopisuję sobie dwa i pół nerdpunkta do dzienniczka.