Hlavní navigace

Názory k článku Formátované dokumenty a tiskové sestavy v Javě (2)

Článek je starý, nové názory již nelze přidávat.

  • 7. 6. 2005 10:16

    Jozef Chocholáček (neregistrovaný)
    Ďalším negatívom FOP-u je to, že XSL-FO neimplementuje kompletne (hlavne atribúty), ale len veľmi pomaly sa rozrastajúcu podmnožinu. Napriek tomu je to dobrý soft a používame ho i v komerčných riešeniach.
  • 7. 6. 2005 12:24

    Pavel Tišnovský
    Ano, s chybějící podporou pro některé atributy XSL-FO jsem se setkal. Na druhou stranu tento systém ovšem většinou převede dokumenty i s neznámými značkami. Samozřejmě, že převod nemusí být korektní, ale pro rychlý náhled na získaná data to většinou dostačuje.
  • 7. 6. 2005 14:23

    anonymní
    Většina "firemních" programátorů jsou jinak nevzdělaný burani který čekaj až je majkrosoft za ručičku dovede ke stolu, řekne jim co maj dělat a nacpe jim ty svoje "šity" do krku. Ať žijou samostatně myslící vývojáři open source kteří mají klasický programátorský vzdělaní, díky za ně.
  • 7. 6. 2005 15:35

    Pavel Tišnovský
    Otevřená řešení se opravdu ve firmách začínají prosazovat - vidím to všude kolem sebe. Je to samozřejmě pomalá změna, protože některá firemní infrastruktura je dost složitá a špatně se předělává (a samozřejmě při konkrétním řešení "nejsou lidi"). To je taky jeden z důvodů, proč v dalším pokračování tohoto seriálu budu popisovat systém POI, kterým se programově manipuluje s Excelovskými tabulkami - pro firemní aplikace je to jedna z často požadovaných operací.
  • 12. 6. 2005 21:15

    David Král (neregistrovaný)
    Čekal jsem náznak řešení problému s českými fonty- bez toho je ten článek, alespoň pro mně, neúlný.
  • 13. 6. 2005 9:23

    Pavel Tišnovský

    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 :-)

  • 13. 6. 2005 10:26

    Jirka Kosek (neregistrovaný)
    Není to tak jednoduché. FOP sice české fonty umí vložit, ale bohužel u nich nevloží korektní kódovací vektor. To znamená, že se neví, na jaké Unicode znaky se jednotlivé znaky ve fontu mapují. Praktický důsledek je v tom, že v takových PDF nefunguje vyhledávání a kopírování textu.

    Pro český text je pak ještě potřeba nakonfigurovat české vzory dělení slov. Bohužel, poslední verze FOPu to má vyřešeno tak nešťastně, že se kvůli tomu musí FOP rekompilovat, nebo si musíte někde sehnat zkompilované české vzory (třeba: http://www.kosek.cz/sw/fop/).
  • 13. 6. 2005 10:49

    Pavel Tišnovský
    Ano, FOP při práci s vloženými fonty opravdu nevytvoří správný kódovací vektor. Na zobrazení to nemá vliv, protože na pozicích znaků jsou "natvrdo" uvedeny jejich interní kódy, ale při dalším zpracování to nefunguje správně. Také bývají problémy se záložkami, ale zde si nejsem jistý, jestli to je chyba FOPu nebo Acrobat Readeru (po novu Adobe Readeru), protože se stejná chyba projevovala i například v souvislosti s pdfTeXem.

    Za ty CS vzory dělení moc děkuji, určitě se budou hodit (v současnosti se u nás sice výstup do PDF bude používat pro tiskové sestavy ve formě tabulek, ale není vyloučeno, že později půjde i o delší texty - i když na ně bych asi popohnal pdfTeX :-).
  • 30. 8. 2009 19:36

    Petr (neregistrovaný) ---.tkom.cz

    Dobry den, mam problem s generovanim metriky fontu. Po vyse uvedenem prikazu „java -cp build\fop.jar;lib\a­valon-fr…“ dostanu nasledujici chybu: C:\Program Files\Vertrigo­Serv\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\xer­cesImpl-2.7.1.jar;lib\ xalan-2.7.0.jar org.apache.fop­.fonts.apps.TTFRe­ader Impact.ttf Impact.xml Exception in thread „main“ java.lang.NoClas­sDefFoundError: org/apache/fop/fon­ts/ apps/TTFReader Caused by: java.lang.Clas­sNotFoundExcep­tion: org.apache.fop­.fonts.apps.TTFRe­ader

    at java.net.URLClas­sLoader$1.run(Un­known Source)
    at java.security­.AccessContro­ller.doPrivile­ged(Native Method)
    at java.net.URLClas­sLoader.findClas­s(Unknown Source)
    at java.lang.Clas­sLoader.loadClas­s(Unknown Source)
    at sun.misc.Launcher$Ap­pClassLoader.lo­adClass(Unknown Source)
    at java.lang.Clas­sLoader.loadClas­s(Unknown Source)
    at java.lang.Clas­sLoader.loadClas­sInternal(Unknown Source) Could not find the main class: org.apache.fop­.fonts.apps.TTFRe­ader. Program wil l exit.

    Prikaz spoustim z windows a v jave se nevyznam. Nasla by se nejaka rada? Delam neco spatne? diky za odpoved

  • 30. 8. 2009 21:59

    Petr (neregistrovaný) ---.tkom.cz

    tak hloupou zakladni chybu jsem nasel, byl jsem ve spatnem adresari, problem ale pretrvava. C:\Program Files\Vertrigo­Serv\www\fop\fop-0.95>java -cp build/fop.jar;lib/a­valon -framework-4.2.0.jar;lib/com­mons-logging-1.0.4.jar;lib/com­mons-io-1.3.1.jar org. apache.fop.fon­ts.apps.TTFRe­ader arial.ttf arial.xml TTF Reader for Apache FOP 0.95

    Parsing font… Reading arial.ttf… Exception in thread „main“ java.lang.NoClas­sDefFoundError: org/apache/xmlgrap­hic s/fonts/Glyphs
    at org.apache.fop­.fonts.truety­pe.TTFFile.ini­tAnsiWidths(TTFFi­le.java:444 )
    at org.apache.fop­.fonts.truety­pe.TTFFile.re­adFont(TTFFile­.java:493)
    at org.apache.fop­.fonts.apps.TTFRe­ader.loadTTF(TTFRe­ader.java:209)
    at org.apache.fop­.fonts.apps.TTFRe­ader.main(TTFRe­ader.java:164) Caused by: java.lang.Clas­sNotFoundExcep­tion: org.apache.xmlgrap­hics.fonts.Glyp­hs

    at java.net.URLClas­sLoader$1.run(Un­known Source)
    at java.security­.AccessContro­ller.doPrivile­ged(Native Method)
    at java.net.URLClas­sLoader.findClas­s(Unknown Source)
    at java.lang.Clas­sLoader.loadClas­s(Unknown Source)
    at sun.misc.Launcher$Ap­pClassLoader.lo­adClass(Unknown Source)
    at java.lang.Clas­sLoader.loadClas­s(Unknown Source)
    at java.lang.Clas­sLoader.loadClas­sInternal(Unknown Source)
    … 4 more