Springe zum Hauptinhalt

Thumbnails wie ein Stapel verschobener Blätter

Für ei­ne Prä­sen­ta­ti­on be­nö­tig­te ich als vi­su­el­les Ele­ment ein "Vor­schau" der ver­wen­de­ten Do­ku­men­te. Es soll­te aus­se­hen wie auf dem Bild: ein Sta­pel ver­scho­be­ner Blät­ter. Da ich über 40 Do­ku­men­te hat­te mit über 120 Sei­ten, wä­re das ma­nu­ell ein ziem­li­cher Auf­wand ge­wor­den. Aber es geht auch au­to­ma­ti­sier­t.

/images/2011/Remote_Access.png

Die Ur­sprungs­do­ku­men­te wa­ren MS­-­Word­-­Da­tei­en (.­doc). Dar­aus ein Bild pro Sei­te zu ma­chen, war ei­ne leich­te Übung: ope­n­of­fi­ce­-­py­thon (das üb­ri­gens von mir selbst stamm­t) ent­hält ein Skript odt2pd­f.­py , um aus Of­fi­ce­-­Do­ku­men­ten PDFs zu er­stel­len. Die ein­zi­ge Vor­aus­set­zung da­für ist, dass Ope­n­Of­fice bzw. Li­bre­Of­fice das Do­ku­ment brauch­bar le­sen kann. Das war hier der Fall.

Aus den PDFs Bil­der zu er­zeu­gen, war auch mei­ne Schwie­rig­keit: Das Pro­gramm "con­ver­t", das zum Image­Ma­gick-Pa­ket ge­hör­t, er­le­digt das. Hier das Kom­man­do, um nach PDFs zu su­chen und sie zu kon­ver­tie­ren:

find . -type f -iname \*.pdf -print0 | xargs -0 -n 1 convert '"{}"' '"{}"'.png

Dann wur­de es kom­pli­zier­t! Wie wer­den aus den Bil­dern die Sta­pel?

Mei­ne Ver­su­che, es mit der Py­thon Image Li­bra­ry (PIL) hin­zu­be­kom­men, schei­ter­ten.

Auf der Mai­ling­lis­te der Li­nux User Group Darm­stadt er­hielt ich einen ent­schei­den­den Tipp: Guck dir die Op­ti­on -com­po­se an. Das war zwar dann nicht die Lö­sung, aber et­was un­ter­halb auf der glei­chen Sei­te war -mo­sa­ic be­schrei­ben. Dum­mer­wei­se muss man trotz­dem noch die Po­si­ti­on für je­des Bild selbst be­rech­nen :-( Das ist zwar auf­wän­dig, aber nicht wei­ter schwie­rig.

So geht´s al­so: List der Bil­der le­sen, um­ge­kehrt sor­tie­ren, da­mit das letz­te Blatt das un­ters­te wird, off­sets be­rech­nen und ei­ne Schlei­fe über al­le Bil­der. Der wich­ti­ge Teil des Skripts sieht dann so aus:

def process(outfilename, images):
    imagenames = images
    imagenames.sort()
    imagenames.reverse()

    # Bildbreite mit Python Image Library ermitteln
    im = Image.open(imagenames[-1])
    width, height = im.size
    offset = int(math.ceil(width*0.3 + BORDERWIDTH))

    cmd = ['convert']
    paste_offset = offset*(len(imagenames)-1) + BORDERWIDTH
    for inname in imagenames:
        cmd.extend([
            '-page', '+%i+0' % paste_offset,
            '(', '-border', '1%', '-bordercolor', 'black', inname, ')'])
        paste_offset -= offset
    cmd.extend(['-mosaic', outfilename])
    subprocess.call(cmd)

Im End­ef­fekt wird ein Kom­man­do wie fol­gen­des aus­ge­führ­t:

convert \
  -page +40+0 '(' -border 1% -bordercolor black seite3.png ')' \
  -page +20+0 '(' -border 1% -bordercolor black seite2.png ')' \
  -page +00+0 '(' -border 1% -bordercolor black seite1.png ')' \
  -mosaic zusammengesetzt.png

Das Er­geb­nis zeigt das Bild.

Portrait von Hartmut Goebel

Hartmut Goebel

Diplom-Informatiker, CISSP, CSSLP, ISO 27001 Lead Implementer

Haben Sie noch Fragen?
Anruf oder Mail genügt:
  +49 871 6606-318
  +49 175 29 78 072
  h.goebel@goebel-consult.de