!

Dette materialet blir ikke lenger vedlikeholdt. Du vil finne oppdatert materiale på siden: http://borres.hiof.no/wep/

CSS
Prince
pdf
Børre Stenseth
CSS >Prince,CSS og PDF

Prince

Hva
Bruk av prince XML

Prince er et alternativ til å bruke XSL-FO og FOP, se modulen XSL-FO . Prince er vesentlig enklere å bruke og det er så vidt jeg kan forstå bedre.

Denne modulen tar for seg noen svært enkle eksempler på bruke av Prince. Du finner et annet Prince-eksempel på modulen: XML2PDF

Prince XML [1] er et program for å lage PDF fra XML/HTML. Prince er lisensiert, men du kan laste ned og teste den lokalt på din maskin.

Datagrunnlag

Vi tar utgangspunkt i to HTML-sider med litt tilfeldig tekst. lirumlarum.html og loremipsum.html.

Begge har koplet til et trivielt stilsett:

@media screen{
h1{color:black}
}
@media print{
h1{color:red}
}

Vi lager videre et stilsett som skal brukes av prince når det genereres PDF:

@page { size: A4;
        /*top, right, bottom and left*/
        margin: 100pt 40pt 40pt 90pt;
        @top-left {
            content:"demo";
        }
        @top-right {
            content:"Bare tull";
            font-size:24px;
        }
        @bottom-right {
          content: counter(page);
            font-style: italic;
            font-size:11px;
          border-top-style:solid;
          border-top-width:thin;
        }
        @bottom-left {
          content:"B. Stenseth";
            font-style: italic;
            font-size:11px;
          border-top-style:solid;
          border-top-width:thin;
        }
}

Begge disse stilsettene er i bruk når Prince genererer PDF.

Interaktivt

Prince har et grafisk brukergrensesnitt, og det er enkelt å kople til en eller begge HTML-filene og stilsettet pdfstyle.css. Vi kan stille noen konfigurasjoner og be Prince generere PDF. Det kan være lurt å kjøre interaktivt når vi arbeider med å justere stilsett og/eller HTML/XML kode.

Slå sammen filer

Før vi går videre slår vi sammen de to filene lirumlarum.html og loremipsum.html, og vi legger på noen elementer som skal bli en forside og noen elementer som skal bli en side med innholdsfortegnelse. Tilsammen blir det slik: altsammen.html.

Denne sammenslåingen av filer er åpenbart et tema for programmering. Vi kan lett tenke oss en situasjon der brukeren via en webside velger ut et antall sider som skal skrives ut "som en bok". Det viktige er at vi har merket det som skal hentes fra hver side på en enkel måte. I vårt tilfelle er alt det interessante(?) innholdet i lirumlarum og loremipsum pakket inn i et <div>-element med class="collect".

Vi utvider stilsettet slik at det tar høyde for innholdsfortegnelse og en spesiell forside:

@page { size: A4;
        /*top, right, bottom and left*/
        margin: 100pt 40pt 40pt 90pt;
        @top-left {
            content:"demo";
        }
        @top-right {
            content:"Bare tull";
            font-size:24px;
        }
        @bottom-right {
          content: counter(page);
            font-style: italic;
            font-size:11px;
          border-top-style:solid;
          border-top-width:thin;
        }
        @bottom-left {
          content:"B. Stenseth";
            font-style: italic;
            font-size:11px;
          border-top-style:solid;
          border-top-width:thin;
        }
}
@page:first {
        @top-left {
            content:url(http://www.ia.hiof.no/~borres/common/gfx/printlogo_txt.gif);
        }
        @top-right {content:" "}
        @bottom-left {content:"";border:none}
        @bottom-right {content:"";border:none}
}
.frontpage{margin-top:7cm;font-size:48px}
h1{page-break-before:always}
a{color:black;text-decoration:none}
.TOC a::after { content: leader(".") target-counter(attr(href), page); }
.TOC .level1{margin-left:1cm}

Fra kommandolinja

Prince lar seg kjøre direkte fra commandolinja, f.eks. kan vi lage en bat-fil slik under windows:

set PRINCEPAT=c:\fixed\prince\engine\bin\
set PROJECT=c:\projects\princing\
%PRINCEPAT%prince.exe %PROJECT%altsammen.html -o %PROJECT%altfrabat.pdf --log=%PROJECT%princelog.txt -s %PROJECT%pdfstyle.css

Fra Python

Vi kan kjøre Prince fra et python program, f.eks. slik:

"""
Make a PDF-file from a HTML file
with PrinceXML
"""
import subprocess
import sys

#--------------------
# fixed paths and logging
""" project catalog """
cat='c:\\projects\\princing\\'
""" prince path """
princepath='c:\\fixed\\prince\\engine\\bin\\prince.exe'
""" log file """
logfile=cat+'princelog.txt'
""" full report """
verbose=False

"""
Do one page to one page
"""
def doSinglePageJob(infile,outfile,stylesheet):
        params=[princepath,infile,'-o '+outfile,'--log='+logfile]
        if verbose:
            params.append('-v')
        params.append("-s "+stylesheet)
        subprocess.call(params)
#--------------------------------
if __name__=="__main__":   
    doSinglePageJob(cat+'altsammen.html',
                    cat+'altfrapython.pdf',
                    cat+'pdfstyle.css')

Fra Python på serveren

Vi kan kjøre Prince fra et python program på serveren, f.eks. slik:

#! /usr/bin/python
"""
Make a PDF-file from a HTML file
with PrinceXML, running on server
"""
import cgitb; cgitb.enable()
import cgi
import subprocess
import sys
#--------------------
# fixed paths and logging
""" project catalog """
cat='/home/borres/html/cgi-bin/princing/'
""" url to this catalog """
url='http://www.it.hiof.no/~borres/cgi-bin/princing/'
""" prince path """
princepath='/usr/local/bin/prince'
""" log file """
logfile=cat+'princelog.txt'
""" full report """
verbose=False

"""
Do one page to one page
"""
def doSinglePageJob(infile,outfile,stylesheet):
        params=[princepath,infile,'-o '+outfile,'--log='+logfile]
        if verbose:
            params.append('-v')
        params.append("-s "+stylesheet)
        try:
                retcode=subprocess.call(params)
                return str(retcode)
        except:
                res=sys.exc_info()
                return res[1]
#--------------------------------     
result=doSinglePageJob(cat+'altsammen.html',cat+'altfrapython.pdf',cat+'pdfstyle.css')
if result=='0':
        print 'Location: '+url+'altfrapython.pdf'+'\n'
else:
        print 'Content-type: text/html; charset=utf-8\n'
        print 'Error with code: '+ str(result)

Merk linja:

print 'Location: '+url+'altfrapython.pdf'+'\n'

Denne returnerer den PDF fila vi har produsert. Merk videre at vi ikke skriver den vanlige "Content-type ..." linja når vi styrer en fil direkte tilbake med "Location: "

Du kan teste her:

http://www.it.hiof.no/~borres/cgi-bin/princing/makepdfonserver.py http://www.it.hiof.no/~borres/cgi-bin/princing/makepdfonserver.py

Som du ser kjører dete skriptet uten parametere. Det skulle være en enkel sak å sende med parametere og pakke ut disse på tjenersiden.

Referanser
  1. Prince XML Prince www.princexml.com/ 14-03-2010
  1. FOP apache.org xml.apache.org/fop/ 14-03-2010
  1. Cascading Style Sheets W3C Schools www.w3schools.com/css/default.asp 14-03-2010
Et annet Prince-eksempel: XML2PDF
Vedlikehold
Børre Stenseth, oktober 2009
( Velkommen ) CSS >Prince,CSS og PDF ( Eksempler )