fo:flow

Transcrição

fo:flow
XSL-FO
XSL-Formatting Objects
http://www.w3.org/TR/xsl11/
Das Umfeld
XSL-FO
... bildet zusammen mit XSLT und XPath die XSL
(eXtensible Stylesheet Language)
... ist eine XML Applikation
... definiert das visuelle Layout-Modell
... wird mit Hilfe von einem Transformations-Tool
(FOP, XEP, ...) nach PDF, PostScript, ...
transformiert
Daten
Formatierte Ausgabe
Die XML Daten werden mit Hilfe eines Stylesheets nach
XSL-FO übersetzt, und dann mit Hilfe eines FOTransformations-Tools nach Postscript, PDF, ...
XML
Daten
Display
saxon
XSL
Style
Sheet
XSL-FO Fop, XEP, ...
Print
Ein einfaches FO-Beispiel
1)
<?xml version="1.0"?>
2)
<fo:root
xmlns:fo="http://www.w3.org/1999/XSL/Format">
3)
<fo:layout-master-set>
<fo:simple-page-master master-name="only"
page-width="5.5cm" margin-left="1cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
4)
<fo:page-sequence master-reference="only">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="18pt">
5)
A small
<fo:external-graphic src="file:fo.jpg"/>
example
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
Die PDF-Ausgabe von FOP
Die wichtigsten XSL-FO
Elemente
XSL-FO Elemente
Es gibt 56 XSL-FO Elemente
fo:block, fo:block-container, fo:character, fo:externalgraphic, fo:flow, fo:footnote, fo:inline, fo:layoutmaster-set, fo:leader, fo:list-block, fo:list-item,
fo:list-item-body, fo:list-item-label, fo:page-number,
fo:page-sequence, fo:region-after, fo:region-before,
fo:region-body, fo:root, fo:simple-page-master,
fo:table-and-caption, fo:table, fo:table-body,
fo:table-caption, fo:table-cell, fo:table-column,
fo:table-footer, fo:table-header, fo:table-row, . . .
fo:root
Das Root-Element eines XSL-FO Dokumentes heisst
fo:root. Im Root-Knoten muss der fo Namespace
deklariert werden.
Jedes XSL-FO Dokument beginnt also mit den Zeilen:
<?xml version="1.0"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
...
Die Seiten Aufteilung, Layout
Eine Seite ist aufgeteilt in die fünf Bereiche regionbefore, region-after, region-start, region-end und
region-body. Diese sehen in der üblichen Lesart (von
links nach rechts, von oben nach unten) wie folgt aus:
margin
body
end
start
before
after
margin
fo:layout-master-set
<fo:layout-master-set>
<fo:simple-page-master
master-name="first"
page-height="297mm" page-width="210mm"
margin-top="15mm" margin-bottom="15mm"
margin-left="20mm" margin-right ="15mm">
<fo:region-before extent="15mm" region-name="fBefore"/>
<fo:region-body margin-top="20mm"/>
</fo:simple-page-master>
...
</fo:layout-master-set>
fo:simple-page-master
Mit dem simple-page-master Knoten werden die
Seitenränder (margin) und ev. die Papiergrösse
festgelegt.
Weiter wird definiert, in wieviele Bereiche (regions)
die Seite aufgeteilt werden soll (region-body,
region-before, region-after, ...)
Pro Seitentyp (Titelseite, Index-Seite, Inhaltsverzeichnis, ...) wird je eine separate Seiten-Vorlage
definiert.
Verteilung des Inhalts
fo:page-sequence
Mit dem fo:page-sequence Knoten wird der Text
(Inhalt) den verschiedenen Bereichen zugeordnet.
<fo:page-sequence master-reference="first">
<fo:static-content flow-name="fBefore">
<fo:block> Das ist die Kopf-Zeile </fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body" >
<fo:block text-align="justify" font-size="16pt">
Hier ist der Text der ersten Seite.
</fo:block>
</fo:flow>
</fo:page-sequence>
10 cm
2 cm
1 cm
1.5 cm
Die Platz-Verteilung für die Regionen
1 cm
1.5 cm
1 cm
1.5 cm
1 cm
9 cm
Beispiel Seite 6
Definieren von verschiedenen Seiten
<fo:layout-master-set>
<fo:simple-page-master master-top ="1.5cm"
page-height="10cm" . . . master-name="erste">
<fo:region-before extent="1cm"
region-name="first-before"/>
<fo:region-body margin-top="2cm"
margin-bottom="1.5cm"/>
<fo:region-after extent="1cm"
region-name="first-after"/>
</fo:simple-page-master>
<fo:simple-page-master ... master-name="restliche">
<fo:region-before extent="2.5cm"
region-name="rest-before"/>
<fo:region-body margin-top="2.5cm" . . . />
</fo:simple-page-master>
...
Welcher Seitentyp wird wann verwendet
<fo:page-sequence-master master-name="global">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference
master-reference="erste" page-position="first"/>
<fo:conditional-page-master-reference
master-reference="restliche" page-position="rest"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
</fo:layout-master-set>
Beispiel Seite 7
fo:flow
fo:flow enthält eine beliebige Anzahl von Blöcken mit
Text, Tabellen, Listen und Bildern. Mit Hilfe des flow
Elementes wird der Dokument-Inhalt (Fliesstext)
begrenzt.
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="16pt">
This is the document content. This is the
<fo:external-graphic src="cup.gif"/>
document content. This is the...
</fo:block>
</fo:flow>
fo:static-content
In den Randbereichen befindet sich normalerweise
wiederkehrende Information (Überschriften,
Fussnoten, Seitenzahlen, ...)
<fo:static-content flow-name="region-after">
<fo:block text-align="end" font-size="10pt">
Seite <fo:page-number/>
</fo:block>
</fo:static-content>
Seite 1
fo:block
fo:block erzeugt einen (Text-)Bereich, welcher eine
Zeile, aber auch mehrere Zeilen oder Seiten lang sein
kann.
Typischerweise wird fo:block benutzt, um zusammengehörende Ausgabe-Elemente (ein Textabschnitt,
eine Titelzeile, eine Tabelle, ...) zu gruppieren.
<fo:block font-size="36pt">
Chapter 1: Introduction
</fo:block>
fo:block-container
Ein fo:block-container Element kann an beliebiger
Stelle auf des Seite (absolut) positioniert werden:
<fo:block-container border-color="black"
border-style="solid" border-width="1pt"
height="1cm" width="4cm" padding="5pt"
top="9.5cm" left="12cm" position="absolute" >
<fo:block text-align="start" line-height="10pt"
font-family="sans-serif" font-size="10pt">
Hier ist ein Text
</fo:block>
</fo:block-container>
Hier ist ein Text
fo:inline
Das Element fo:inline dient zum Formattieren eines
Textabschnitts, ohne dass eine neue Zeile begonnen
wird.
<fo:block font-family="Times Roman">
Hier ist
<fo:inline font-style="italic"> ein </fo:inline>
Abschnitt
<fo:inline font-weight="bold"> mit </fo:inline>
verschiedenen
<fo:inline color="blue"> Formaten. </fo:inline>
</fo:block>
fo:external-graphic
Mit Hilfe von fo:external-graphic wird ein Bild in ein
Dokument eingebettet.
Mögliche Bildformate sind GIF und JPEG, allerdings ist
nicht festgelegt, welche Bildformate unterstützt
werden (müssen).
<fo:block>
Look at this!
<fo:external-graphic src="cup.jpg"/>
</fo:block>
fo:list-block, fo:list-item
Das Element fo:list-block dient zum Erzeugen einer
Liste. Es erwartet als Kinder (beliebig viele) fo:listitem Knoten.
<fo:list-block>
<fo:list-item>
<fo:list-item-label><fo:block> a) </fo:block> </fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>Dies ist das erste Listenelement.</fo:block>
</fo:list-item-body>
</fo:list-item>
...
</fo:list-block>
Tabellen
Zum Erzeugen von Tabellen gibt es die Elemente:
fo:table, fo:table-body, fo:table-cell, fo:tablecolumn, fo:table-footer, fo:table-header, fo:table-row
fo:table enhält (optional) einen table-header und/oder
table-footer sowie einen table-body.
Der table-body besteht dann aus table-row Elementen,
welche wiederum aus table-cell Knoten zusammengesetzt sind.
Erzeugen von Tabellen
<fo:table border="1pt solid black" background-color="#EEEEEE">
<fo:table-column column-width="20mm"/>
<fo:table-column/>
<fo:table-header font-weight="bold" background-color="#CCCCCC">
<fo:table-row>
<fo:table-cell border="1pt solid black" padding="3pt">
<fo:block> HTML </fo:block>
</fo:table-cell>
...
</fo:table-row>
</fo:table-header>
<fo:table-body>
...
</fo:table-body>
</fo:table>
This page is ...
Die wichtigsten Attribute
Properties
Attribute sind Properties
• Die Attribute der FO-Elemente sind FormatierungAnweisungen. Sie bestimmen (letztlich) das
Aussehen des darzustellenden Inhalts.
• Es gibt mehr als 200 Format Properties (Attribute),
welche oft in verschiedensten Elementen angegeben
werden können.
• Properties werden von aussen nach innen
abgearbeitet. Bei sich widersprechenden Angaben,
überschreibt die lokale Angabe die globale.
• Eine Property, welche an verschiedenen Orten
benutzt werden kann, hat immer dieselbe Bedeutung.
Character Properties
Alle XSL-FO Elemente, welche Text enthalten können
(fo:block, fo:inline, ...), erlauben Attribute für das
Setzen von Character Properties(color, font-size,
font-family, text-decoration, ...).
<fo:block font-family="Helvetica" font-size="12pt">
Hier ist ein
<fo:inline text-decoration="underline">
wichtiger </fo:inline>
<fo:inline color="red" font-weight="900">
Text </fo:inline>
</fo:block>
Character Property: Farbe
Die color-Property setzt die Schriftfarbe:
<fo:inline color="green"> Text </fo:inline>
Wie in CSS gibt es 16 vordefinierte Farben:
white
Weitere Farben können als hexadezimale rgb-Trippel
definiert werden: #RRGGBB.
Character Property: Font
Die Property font-family definiert den zu benutzenden
Font:
<fo:inline font-family="Times Roman" >
Times Roman
</fo:inline>
Mögliche Fonts sind Helvetica, Times Roman, Courier,
Symbol, ZapfDingbats, ...
Character Property: Schriftgrösse
Die Property font-size definiert die zu benutzende
Schriftgrösse:
<fo:inline font-family="Helvetica"
font-size="24pt">
ein Text in 24 Punkt Schrift
</fo:inline>
Character Property: Style
Der Style des Fonts wird definiert durch die Property
font-style
<fo:block font-family="Times Roman"
font-style="italic">
Times Roman italic
</fo:block>
Es gibt die Styles
italic, normal, oblique, reverse-normal und reverseoblique
Character Property: Schrift-Dicke
Die Dicke der Schrift wird definiert durch die Property
font-weight:
<fo:block
font-family="Times Roman" font-weight="bold">
Hier ist ein bold Text
</fo:block>
<fo:block
font-family="Times Roman" font-weight="normal">
Hier ist ein normaler Text
</fo:block>
Character Property: Dekorationen
text-decoration="underline"
text-decoration="overline"
text-decoration="line-through"
text-shadow="gray"
text-transform="capitalize"
text-transform="uppercase"
text-transform="lowercase"
unterstrichen
überstrichen
durchgestrichen
Schattenschrift
Alle Ersten Buchstaben
GROSSSCHRIFT
kleinschrift
Sentence Properties
Sentence Properties bestimmen den Platz zwischen den
einzelnen Buchstaben (letter-spacing), zwischen
einzelnen Wörtern im Text (word-spacing) und
zwischen den einzelnen Linien im Text (line-height,
text-depth, text-altitude, ...), die Ausrichtung des
Texts (text-align), ...
Sentence Property: Zeilenabstand
Der Zeilenabstand im Text kann kontrolliert werden
durch die Properties line-height, text-depth und
text-altitude.
<fo:block font-size="10pt" line-height="16pt" ...>
Hier ist ein Text, ...
</fo:block>
Sentence Property: Text Ausrichtung
Ob der Text linksbündig, rechtsbündig, zentriert oder
im Blocksatz gesetzt werden soll, wird durch die
Property text-align gesetzt.
Diese kann die folgenden Werte annehmen:
–
–
–
–
start oder left
linksbündig
center
zentriert
end oder right
rechtsbündig
justify
Blocksatz
Definieren von Attribut-Listen
Definieren verschiedener Styles für verschiedene
Textblöcke:
<xsl:attribute-set name="text-style">
<xsl:attribute name="font-family">Serif</xsl:attribute>
<xsl:attribute name="font-size">12pt</xsl:attribute>
<xsl:attribute name="font-weight">normal</xsl:attribute>
...
</xsl:attribute-set>
Verwenden mit:
<fo:block xsl:use-attribute-sets="text-style">
Übung