Potřebujete pomoci s XSL-FO?
Nabízím školení, konzultace, vývoj tiskových šablon na zakázku. Nevájte a kontaktujte mne.

Podpořte provoz stránek
Platba probíhá pomocí služby PayPal a je možné platit kartou nebo převodem z vašeho PayPal účtu.

Kapitola 3. Formátovací objekty

3.1. Blokové formátovací objekty
3.1.1. Bloky textu – fo:block
3.1.2. Skupina bloků – fo:block-container
3.1.3. Seznamy – fo:list-block, fo:list-item, fo:list-item-label, fo:list-item-body
3.1.4. Tabulky – fo:table-…
3.2. Inline formátovací objekty
3.2.1. Změna formátování – fo:inline
3.2.2. Změna formátování – fo:inline-container
3.2.3. Obrázky – fo:external-graphic
3.2.4. Výplně – fo:leader
3.2.5. Cizí objekty – fo:instream-foreign-object
3.2.6. Formátování první řádky – fo:initial-property-set
3.2.7. Aktuální číslo strany – fo:page-number
3.2.8. Číslo strany výskytu určitého objektu – fo:page-number-citation
3.2.9. Číslo poslední strany oblasti vygenerované pro určitý objekt – fo:page-number-citation-last
3.3. Out-of-line formátovací objekty
3.3.1. Poznámky pod čarou – fo:footnote, fo:footnote-body
3.3.2. Plovoucí objekty – fo:float
3.4. Dynamické a další objekty
3.4.1. Odkazy – fo:basic-link
3.4.2. Živá záhlaví – fo:marker, fo:retrieve-marker
3.4.3. Živá záhlaví v tabulkách – fo:retrieve-table-marker
3.4.4. Obálka – fo:wrapper
3.4.5. Záložky – fo:bookmark-tree
3.4.6. Vyznačování změn – fo:change-bar-begin a fo:change-bar-end
3.4.7. Rejstříky
3.5. Proprietární rozšíření formátovacích objektů

Následující text stručně popisuje nejpoužívanější formátovací objekty. Jejich úplný přehled najdete ve standardu [1].

Běžné formátovací objekty můžeme rozdělit do několika skupin. První skupinu tvoří blokové objekty. Ty se do stránky skládají jeden za druhým ve směru postupu blokových objektů – obvykle od shora dolů. Druhou skupinu tvoří inline elementy, které lze použít uvnitř blokových elementů, a skládají se do nich postupně ve směru definovaném pro inline objekty – typicky zleva doprava. Pro vkládání plovoucích objektů a poznámek pod čarou existuje další skupina pro tzv. out-of-line formátovací objekty. Poslední skupinou jsou různé speciální objekty, které nepatří do předchozích kategorií.

3.1 Blokové formátovací objekty

3.1.1 Bloky textu – fo:block

Vytváří samostatný blok textu. Používá se proto pro odstavce, nadpisy a podobné druhy objektů.

Nejpoužívanější vlastnosti

text-align

Zarovnání odstavce.

text-align-last

Zarovnání poslední řádky odstavce

text-indent

Velikost odstavcové zarážky.

space-before

Mezera před odstavcem.

space-after

Mezera za odstavcem.

start-indent

Odsazení celého odstavce zleva.

end-indent

Odsazení celého odstavce zprava.

keep-together

Zakázání stránkového zlomu odstavce.

keep-with-next

Zakázání zlomu mezi odstavcem a následujícím blokem.

3.1.2 Skupina bloků – fo:block-container

Formátovací objekt umožňuje sdružit několik blokových formátovacích objektů a změnit některé vlastnosti – typicky tok směru textu nebo orientaci.

Nejpoužívanější vlastnosti

reference-orientation

Otočení orientace bloku oproti nadřazenému bloku. Přípustné hodnoty: 0, 90, 180, 270, -90, -180 a -270.

absolute-position

Hodnota absolute umožní blok umístit na souřadnice vztažené k začátku stránky, formátování ostatních objektů není ovlivněno.

Příklad 3.1. Ukázka otočení textu o 90°

<fo:block>
  ...
</fo:block>
<fo:block-container reference-orientation="90" width="8cm">
  <fo:block>
    ... otočený odstavec ...
  </fo:block>
</fo:block-container>
<fo:block>
  ...
</fo:block>

3.1.3 Seznamy – fo:list-block, fo:list-item, fo:list-item-label, fo:list-item-body

Pro vytváření seznamů existuje sada formátovacích objektů. Celý seznam je uložen v fo:list-block. Každá položka seznamu je ohraničena pomocí fo:list-item. Položka seznamu pak má své návěstí (jako je odrážka, číslo, text) fo:list-item-label a tělo fo:list-item-body. Obsahem těla i návěstí musí být fo:block.

Obrázek 3.1. Formátovací model seznamů

Formátovací model seznamů

Nejpoužívanější vlastnosti

provisional-distance-between-starts

Místo vyhrazené pro odrážku. Musí být nastaveno u fo:list-block.

start-indent

Odsazení návěstí i těla. Zase by mělo být nastaveno všude. Tělo položky seznamu by mělo používat hodnotu body-start().

end-indent

Odsazení návěstí zprava. Typicky se používá hodnota label-end().

Příklad 3.2. Ukázka seznamu s odrážkami

<fo:list-block provisional-distance-between-starts="1em">
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>&#x2022;</fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>První položka seznamu</fo:block>
    </fo:list-item-body>
  </fo:list-item>
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>&#x2022;</fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>Druhá položka seznamu</fo:block>
    </fo:list-item-body>
  </fo:list-item>
</fo:list-block>

Příklad 3.3. Ukázka paralelního překladu

<fo:list-block provisional-distance-between-starts="52%" provisional-label-separation="4%" 
               font-size="9pt" text-align="justify">
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>My, občané České republiky v Čechách, na Moravě 
	a ve Slezsku, ...</fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()" language="en">
      <fo:block>We, the citizens of the Czech Republic in Bohemia, 
	Moravia, and Silesia, ...</fo:block>
    </fo:list-item-body>
  </fo:list-item>
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>Česká republika je ...</fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()" language="en">
      <fo:block>The Czech Republic is ...</fo:block>
    </fo:list-item-body>
  </fo:list-item>
</fo:list-block>

3.1.4 Tabulky – fo:table-…

Model tabulek ve FO je podobný jako v HTML – tabulka (fo:table, fo:table-and-caption) se skládá z buněk (fo:table-cell), které jsou součástí řádky (fo:table-row) a řádka je součástí nějaké skupiny v tabulce (fo:table-body, fo:table-footer, fo:table-header). Pomocí vlastností pak můžeme nastavovat takové věci jako slučování buněk, rámečky okolo buněk a celé tabulky, barvy, pozadí, zarovnání obsahu buněk apod.

Příklad 3.4. Ukázka jednoduché tabulky

<fo:table>
  <fo:table-body>
    <fo:table-row>
      <fo:table-cell>
        <fo:block>A</fo:block>
      </fo:table-cell>
      <fo:table-cell>
        <fo:block>B</fo:block>
      </fo:table-cell>
   </fo:table-row>
    <fo:table-row>
      <fo:table-cell>
        <fo:block>C</fo:block>
      </fo:table-cell>
      <fo:table-cell>
        <fo:block>D</fo:block>
      </fo:table-cell>
   </fo:table-row>
 </fo:table-body>
</fo:table>

Nejpoužívanější vlastnosti table:

table-layout

Použitý algoritmus pro formátování tabulky (fixed/auto). Při fixním layoutu je potřeba určit šířku sloupců pomocí fo:table-column.

width

Šířka tabulky.

Nejpoužívanější vlastnosti table-column:

column-width

Šířka sloupce.

Nejpoužívanější vlastnosti table-cell:

number-columns-spanned

Počet sloučených buněk.

number-rows-spanned

Počet buněk sloučených vertikálně.

padding, padding-…

Vzdálenost obsahu buňky od mřížky tabulky.

Vlastnosti pro tvorbu rámečků:

border-…-style

Druh rámečku.

border-…-width

Šířka rámečku.

border-…-color

Barva rámečku.

border-collapse

Hodnota collapse způsobí, že rámečky se v místech setkání sloučí, nebudou se zdvojovat.

border-…-width.conditionality

Hodnota retain způsobí, že se při rozdělení tabulky přes hranici stránky vykreslí v místě rozdělení rámeček

3.2 Inline formátovací objekty

3.2.1 Změna formátování – fo:inline

Formátovací objekt se používá pro změnu formátování části textu uvnitř odstavce a dalších formátovacích objektů.

3.2.2 Změna formátování – fo:inline-container

Formátovací objekt se používá pro sdružení více blokových objektů do jednoho inline, obvykle z důvodu rozdílného směru sázení textu v jednotlivých blocích.

3.2.3 Obrázky – fo:external-graphic

Při vkládání obrázků je potřeba mít obrázek ve formátu podporovaném použitým procesorem FO. Většina procesorů podporuje bitmapové formáty PNG a JPEG. Podporované vektorové formáty se liší procesor od procesoru. Dobrou zprávou je, že většina procesorů si dnes poradí s SVG.

Nejpoužívanější vlastnosti

src

URL adresa obrázku. Musí být ve tvaru url(URL).

width, height

Velikost plochy vyhrazené pro obrázek.

content-width, content-height

Skutečná šířka a výška obrázku

text-align

Způsob horizontálního umístění obrázku uvnitř vyhrazené plochy.

display-align

Způsob vertikálního umístění obrázku uvnitř vyhrazené plochy.

scaling

Způsob zvětšování obrázku (uniform/non-uniform).

Příklad 3.5. Ukázka vloženého obrázku

<fo:external-graphic src="url(foto.jpg)" 
                     content-width="5cm" 
                     width="40%" 
                     text-align="center"
                     display-align="center"/>

3.2.4 Výplně – fo:leader

Formátovací objekt umožňuje dané místo vyplnit libovolným znakem. Pokud chceme nějaký prostor vyplnit celý, musí být zarovnání do bloku. Pro poslední řádku odstavce proto použijeme nastavení text-align-last="justify".

Nejpoužívanější vlastnosti:

leader-pattern

Druh výplně (dots, space, rule, use-content).

leader-length

Délka výplně.

rule-style

Druh výplně, pokud se používá čára (dotted, dashed, solid, double, groove, ridge).

rule-thickness

Síla čáry.

Příklad 3.6. Ukázka výplně

<fo:block text-align-last="justify">
  Úvod
  <fo:leader leader-pattern="dots"/>
  1
</fo:block>

3.2.5 Cizí objekty – fo:instream-foreign-object

Stále větší počet druhů dat lze reprezentovat nějakým XML formátem. Formátovací objekt fo:instream-foreign-object umožňuje přímo mezi FO zařadit fragment dat v jiném formátu – nejčastěji MathML nebo SVG. Záleží pak samozřejmě na schopnostech procesoru FO, zda daný druh dat podporuje.

Příklad 3.7. Vložení obrázku SVG přímo mezi formátovací objekty

<fo:instream-foreign-object content-width="16cm">
  <svg viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
    <desc>This is a blue circle with a red outline</desc>
    <g>
      <circle style="fill: blue; stroke: red" cx="200" cy="200" r="100"/>
      <text x="150" y="160" stroke="yellow" fill="white" 
	    font-weight="bold" font-size="20">Hello World</text>
    </g>
  </svg>
</fo:instream-foreign-object>

3.2.6 Formátování první řádky – fo:initial-property-set

Používá se uvnitř fo:block a umožňuje určit odlišné formátovací vlastnosti pro první řádek odstavce.

Příklad 3.8. Formátování první řádky

<fo:block>
  <fo:initial-property-set font-weight="bold"/>
  Text odstavce, jehož první řádka bude zobrazena
  tučným písmem...
</fo:block>

3.2.7 Aktuální číslo strany – fo:page-number

Aktuální číslo strany lze do dokumentu vložit pomocí fo:page-number. Způsob číslování se přitom nastavuje na sekvenci stránek (fo:page-sequence) pomocí vlastností initial-page-number a format.

3.2.8 Číslo strany výskytu určitého objektu – fo:page-number-citation

Každý FO může mít přiřazen jedinečný identifikátor ve vlastnosti id. Objekt fo:page-number-citation pak vrací stránku s výskytem objektu, jehož identifikátor zadáme ve vlastnosti ref-id.

3.2.9 Číslo poslední strany oblasti vygenerované pro určitý objekt – fo:page-number-citation-last

Každý FO může mít přiřazen jedinečný identifikátor ve vlastnosti id. Objekt fo:page-number-citation-last pak poslední stránku oblasti, na které se vykreslil objekt, jehož identifikátor zadáme ve vlastnosti ref-id.

Formátovací objekt je v XSL-FO od verze 1.1.

3.3 Out-of-line formátovací objekty

Obsah těchto objektů se obvykle zobrazuje na jiném místě, než je uveden.

3.3.1 Poznámky pod čarou – fo:footnote, fo:footnote-body

Poznámky pod čarou se vytvářejí pomocí objektů fo:footnote a fo:footnote-body. Poznámky pod čarou nejsou standardně odděleny čarou, ta se musí vygenerovat pomocí statického obsahu pro oblast xsl-footnote-separator.

Příklad 3.9. Ukázka poznámky pod čarou

<fo:footnote>
  <fo:inline font-size="70%" baseline-shift="super">1</fo:inline>
  <fo:footnote-body>
    <fo:block>
      <fo:inline font-size="70%" baseline-shift="super">1</fo:inline>
      Text poznámky
    </fo:block>
  </fo:footnote-body>
</fo:footnote>

Pokud symbol poznámky rozbije řádkování, je možné použít na rodičovském objektu vlastnost line-stacking-strategy s hodnotou font-height.

3.3.2 Plovoucí objekty – fo:float

Plovoucí objekty (fo:float) umožňují obtékání obrázků, případně umístění nějakého většího objektu na první volné místo.

Příklad 3.10. Ukázka plovoucího objektu

<fo:float float="end">
  <fo:block>
    ...plovoucí obsah...
  </fo:block>
</fo:float>

Nejpoužívanější vlastnosti:

float

Druh plovoucího objektu (end, start, before). Některé implementace podporují i hodnoty inside a outside pro vnitřní a vnější okraj u oboustranného svázaného tisku. Tyto hodnoty jsou standardní součástí XSL-FO 1.1.

3.4 Dynamické a další objekty

3.4.1 Odkazy – fo:basic-link

Odkazy se vytvářejí pomocí objektu fo:basic-link. Ten může ukazovat buď na jiné místo dokumentu určené pomocí internal-destination, nebo na externí dokument pomocí external-destination.

3.4.2 Živá záhlaví – fo:marker, fo:retrieve-marker

V mnoha dokumentech chceme mít v záhlaví/zápatí kromě čísla strany např. název kapitoly nebo podkapitoly. K dosažení tohoto efektu můžeme použít objekty fo:marker a fo:retrieve-marker. První umožňuje do dokumentu vložit značku a druhý zjistit aktuální značku.

Můžeme mít přitom libovolný počet kategorií značek a u každé zjišťovat první či poslední výskyt značky apod.

Příklad 3.11. Ukázka značek

<!-- Vytvoření značky -->
<fo:marker marker-class-name="kapitola">Úvod</fo:marker>

<!-- Zjištění aktuální značky -->
<fo:retrieve-marker retrieve-class-name="kapitola" 
   retrieve-position="first-including-carryover"/>

<fo:retrieve-marker retrieve-class-name="kapitola" 
   retrieve-position="last-starting-within-page"/>

Význam jednotlivých hodnot u retrieve-position:

first-starting-within-page

Vrátí první značku, jejíž objekt na dané stránce začíná.

first-including-carryover

Vrátí značku odpovídající prvnímu objektu na stránce (může to tedy být značka objektu, který začal na předchozí straně).

last-starting-within-page

Vrátí značku odpovídající poslednímu objektu, který začíná na stránce.

last-ending-within-page

Vrátí značku odpovídající poslednímu objektu, který se ještě celý vejde na danou stránku.

3.4.3 Živá záhlaví v tabulkách – fo:retrieve-table-marker

Umožňuje implementovat v tabulkách odlišný obsah fo:table-header a fo:table-footer na každé stránce.

Formátovací objekt je v XSL-FO od verze 1.1.

3.4.4 Obálka – fo:wrapper

Objekt slouží k seskupení několika formátovacích objektů a k nastavení společných vlastností.

3.4.5 Záložky – fo:bookmark-tree

Formátovací objekt fo:bookmark-tree společně s objekty fo:bookmark a fo:bookmark-title umožňuje do výstupních formátů, kde to má smysl, vygenerovat záložky.

Formátovací objekt je v XSL-FO od verze 1.1.

3.4.6 Vyznačování změn – fo:change-bar-begin a fo:change-bar-end

Objekty fo:change-bar-begin a fo:change-bar-end umožňují vyznačit místa začátku a konce změny v dokumentu. Lze pak určit, kde a jakým stylem se má na okraji textu zobrazot vertikální čára vyznačující změnu.

Formátovací objekt je v XSL-FO od verze 1.1.

3.4.7 Rejstříky

V XSL-FO 1.1 bylo přidáno několik objektů a vlastností, které umožňují snazší generování rejstříků.

Skoro na každém formátovacím objektu lze nyní použít atribut index-key, do kterého lze uložit název rejstříkového hesla.

Při generování samotného rejstříku pak můžeme snadno získat seznam všech stránek, kde se dané rejstříkové heslo vyskytuje pomocí formátovacích objektů fo:index-page-citation-list a fo:index-key-reference.

Příklad 3.12. Ukázka definice rejstříkového hesla a odkazu na něj z rejstříku

<fo:block index-key="opalování">Jak se správně opalovat</fo:block><fo:index-page-citation-list>
  <fo:index-key-reference ref-index-key="opalování"/>
</fo:index-page-citation-list>

Rejstříkové heslo může být vyznačeno přímo na formátovacím objektu pomocí atributu index-key. Pokud rejstříkové heslo přesahuje nějaký delší úsek dokumentu, je možné vyznačit začátek a konec platnosti rejstříkového hesla pomocí objektů fo:index-range-begin a fo:index-range-end.

Formátovací objekt fo:index-page-citation-list může pomocí vlastnosti merge-sequential-page-numbers automaticky zajistit převod souvislé posloupnosti čísel stránek na rozsah. Uvnitř objektu se může vyskytovat více objektů fo:index-key-reference s různým nastavením formátovacích vlastností. Formátovač pak správně seřadí čísla stran a zachová formátovací vlastnosti.

Formátovací objekty jsou v XSL-FO od verze 1.1.

3.5 Proprietární rozšíření formátovacích objektů

Různé formátovače se samozřejmě liší tím, jaké formátovací objekty a vlastnosti podporují. Navíc mnohdy obsahují rozšíření jdoucí nad rámec standardu. Tato rozšíření jsou dostupná buď jako elementy nebo atributy ve speciálním jmenném prostoru, případně jako instrukce pro zpracování.

Např. formátovač XEP má rozšiřující objekty definovány ve jmenném prostoru http://www.renderx.com/XSL/Extensions. Podporovaná rozšíření bývají popsána v dokumentaci každého formátovače.

Příklad 3.13. Použití rozšíření v souboru FO

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
         xmlns:rx="http://www.renderx.com/XSL/Extensions">
  <?xep-pdf-crop-mark-width 0.5pt?>
  <?xep-pdf-crop-offset 24pt?>
  <?xep-pdf-bleed 6pt?>
  <?xep-pdf-initial-zoom fit-width?>
  <rx:meta-info>
    <rx:meta-field name="author" value="Jiří Kosek"/>
    <rx:meta-field name="title" value="EU chce použít XML při rozvoji e-businessu"/>
  </rx:meta-info></fo:root>

Nesmíme zapomenout, že instrukce pro zpracování se v jazyce XSLT generují pomocí speciální instrukce.

Příklad 3.14. Generování rozšíření pomocí XSLT

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:rx="http://www.renderx.com/XSL/Extensions">

<xsl:template match="/">
  <fo:root>
    <xsl:processing-instruction name="xep-pdf-crop-mark-width">0.5pt</xsl:processing-instruction>
    <xsl:processing-instruction name="xep-pdf-crop-offset">24pt</xsl:processing-instruction><rx:meta-info>
      <rx:meta-field name="author" value="Jiří Kosek"/>
      <rx:meta-field name="title" value="EU chce použít XML při rozvoji e-businessu"/>
    </rx:meta-info></fo:root>
</xsl:template>

</xsl:stylesheet>

© Jiří Kosek 2014

Tento dokument je určen výhradně pro osobní potřebu seznámení se s technologií XSL-FO. Jakékoliv jiné použití, včetně dalšího šíření, pořizování kopií, použití při školeních a výuce apod. je výslovně zakázáno a bude považováno za porušení autorských práv.

Dokument je zkrácenou verzí školicích materiálů používaných během školení XSL-FO.


Copyright © 2002-2015 Jiří Kosek