Promiňte, to řešení s českými fonty se mi do článku už nevešlo. Pokusím se to tedy napravit tady v diskusi. Problém je to poměrně složitý, například záleží i na tom, zda máte vstupní fonty ve formátu TrueType či PostScript. Vše prozatím funguje pro PDF, v případě PostScriptového výstupu má FOP ještě nějaké mušky - viz stránka http://xml.apache.org/fop/fonts.html.
Nejprve je zapotřebí vytvořit ke každému fontu, který se do výsledného PDF souboru vloží, takzvanou metriku, tj. rozměry jednotlivých znaků, kerningové páry atd. To se (například pro font Arial.ttf, který je v Unicode) provede pomocí příkazu:
java -cp build\fop.jar;lib\avalon-framework-cvs-20020806.jar;lib\xml-apis.jar;lib\xercesImpl-2.2.1.jar;lib\xalan-2.4.1.jar org.apache.fop.fonts.apps.TTFReader -fn arial arial.ttf arial.xml
(vše na jednom řádku, pro Unixy je samozřejmě zapotřebí upravit cesty). Výsledkem je soubor arial.xml, ve kterém je mimo jiné řečeno, že v dalším zpracování bude jméno tohoto fontu Arial (volba -fn arial).
Posléze je nutné upravit soubor "userconfig.xml" tak, aby toto jméno akceptoval. V tomto případě je to jednoduché, protože tam část s Arialem je, pouze se musí odkomentovat:
<font metrics-file="arial.xml" kerning="yes" embed-file="arial.ttf"> <font-triplet name="Arial" style="normal" weight="normal"> <font-triplet name="ArialMT" style="normal" weight="normal"> </font>
No a potom se už může jednoduše tvořit dokument, například známý Hello World s českými znaky (všimněte si způsobu výběru fontu):
<?xml version="1.0" encoding="iso-8859-2"> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="simpleA4"> <fo:flow flow-name="xsl-region-body"> <fo:block>Hello World!</fo:block> <fo:block font-size="12pt" font-family="Arial">ěąčřľýáíé</fo:block> </fo:flow> </fo:page-sequence> </fo:root>
Překlad se provede příkazem:
fop -c userconfig.xml helloworld.fo -pdf helloworld.pdf
tj. je nutné specifikovat upravený konfigurační soubor. Výsledné PDF trošku naroste a pokud se do něj podíváte, zjistíte, že jsou v něm vloženy všechny použité znaky (tj. nikoli celá znaková sada).
Toť vše, doufám, že toto řešení bude později funkční i pro PostScriptové soubory. (ale byla to práce, předělávat ukázky XML do diskuse, do které se musí psát v XHTML :-)
Dobry den, mam problem s generovanim metriky fontu. Po vyse uvedenem prikazu „java -cp build\fop.jar;lib\avalon-fr…“ dostanu nasledujici chybu: C:\Program Files\VertrigoServ\www\fop\fop-0.95\fonts>java -cp build\fop.jar;lib\ avalon-framework-4.2.0.jar;lib\xml-apis-1.3.04.jar;lib\xercesImpl-2.7.1.jar;lib\ xalan-2.7.0.jar org.apache.fop.fonts.apps.TTFReader Impact.ttf Impact.xml Exception in thread „main“ java.lang.NoClassDefFoundError: org/apache/fop/fonts/ apps/TTFReader Caused by: java.lang.ClassNotFoundException: org.apache.fop.fonts.apps.TTFReader
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source) Could not find the main class: org.apache.fop.fonts.apps.TTFReader. Program wil l exit.
Prikaz spoustim z windows a v jave se nevyznam. Nasla by se nejaka rada? Delam neco spatne? diky za odpoved
tak hloupou zakladni chybu jsem nasel, byl jsem ve spatnem adresari, problem ale pretrvava. C:\Program Files\VertrigoServ\www\fop\fop-0.95>java -cp build/fop.jar;lib/avalon -framework-4.2.0.jar;lib/commons-logging-1.0.4.jar;lib/commons-io-1.3.1.jar org. apache.fop.fonts.apps.TTFReader arial.ttf arial.xml TTF Reader for Apache FOP 0.95
Parsing font… Reading arial.ttf… Exception in thread „main“ java.lang.NoClassDefFoundError: org/apache/xmlgraphic s/fonts/Glyphs
at org.apache.fop.fonts.truetype.TTFFile.initAnsiWidths(TTFFile.java:444 )
at org.apache.fop.fonts.truetype.TTFFile.readFont(TTFFile.java:493)
at org.apache.fop.fonts.apps.TTFReader.loadTTF(TTFReader.java:209)
at org.apache.fop.fonts.apps.TTFReader.main(TTFReader.java:164) Caused by: java.lang.ClassNotFoundException: org.apache.xmlgraphics.fonts.Glyphs
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
… 4 more