2013-12-15 31 views
8

Kodlama özniteliğiyle utf-8'de bir xml dosyası var.xslt-fo utf-8'i desteklemiyor mu?

fop -xml xml.xml -xsl xsl.xsl -pdf pdf.pdf'u çalıştırdığımda, çıktı pdf'de utf-8 karakterleri bozuk. Önemli olan xsl dosyasındaki metin utf-8 karaktersizdir, xml metniyle aynıdır.

Utf-8 karakterleri # ile değiştirilmiştir.

Neyin yanlış olabilir?

Xsl dosyası:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java" version="1.0" xmlns="http://www.w3.org/1999/xhtml"> 
<xsl:output method="xml" version="1.0" indent="yes" encoding="UTF-8" /> 

<xsl:template match="/"> 
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 

     <fo:layout-master-set> 
      <fo:simple-page-master master-name="A4" margin="1cm"> 
      <fo:region-body margin="2cm" margin-left="1cm" margin-right="1cm"/> 
      <fo:region-before extent="3cm"/> 
      <fo:region-after extent="5mm"/> 
      </fo:simple-page-master> 
     </fo:layout-master-set> 

     <fo:page-sequence master-reference="A4"> 
      <fo:static-content flow-name="xsl-region-before"> 
       <fo:block font-size="24pt" font-family="Calibri">Filmoteka</fo:block> 
      </fo:static-content> 
      <fo:static-content flow-name="xsl-region-after"> 
       <fo:block font-size="10pt" font-family="Calibri">Wygenerowano: <xsl:call-template name="dataCzas" /></fo:block> 
      </fo:static-content> 

      <fo:flow flow-name="xsl-region-body"> 
       <fo:block font-size="12pt" font-family="Calibri" padding-after="1cm"> 
        <fo:table table-layout="fixed" width="100%" border="solid black 1px"> 
        <fo:table-column column-width="8mm"/> 
        <fo:table-column column-width="40mm"/> 
        <fo:table-column column-width="40mm"/> 
        <fo:table-column column-width="13mm"/> 
        <fo:table-column column-width="65mm"/> 
         <fo:table-header> 
          <fo:table-row> 
           <fo:table-cell border="solid black 2px"> 
            <fo:block font-weight="bold" background-color="#cccccc">Lp.</fo:block> 
           </fo:table-cell> 
           <fo:table-cell border="solid black 2px"> 
            <fo:block font-weight="bold" background-color="#cccccc">Tytuł PL</fo:block> 
           </fo:table-cell> 
           <fo:table-cell border="solid black 2px"> 
            <fo:block font-weight="bold" background-color="#cccccc">Reżyseria</fo:block> 
           </fo:table-cell> 
           <fo:table-cell border="solid black 2px"> 
            <fo:block font-weight="bold" background-color="#cccccc">Rok</fo:block> 
           </fo:table-cell> 
           <fo:table-cell border="solid black 2px"> 
            <fo:block font-weight="bold" background-color="#cccccc">Obsada</fo:block> 
           </fo:table-cell> 
          </fo:table-row> 
         </fo:table-header> 
         <fo:table-body> 
          <xsl:apply-templates /> 
         </fo:table-body> 
        </fo:table> 
       </fo:block> 
      </fo:flow> 



     </fo:page-sequence> 

    </fo:root> 
</xsl:template> 


<xsl:template match="film"> 
    <fo:table-row> 
     <fo:table-cell border="solid black 1px"> 
      <fo:block><xsl:number format="1"/></fo:block> 
     </fo:table-cell> 
     <fo:table-cell border="solid black 1px"> 
      <fo:block font-family="Calibri"><xsl:value-of select="tytul_pol"/></fo:block> 
     </fo:table-cell> 
     <fo:table-cell border="solid black 1px"> 
      <fo:block font-family="Calibri"><xsl:value-of select="rezyser"/></fo:block> 
     </fo:table-cell> 
     <fo:table-cell border="solid black 1px"> 
      <fo:block font-family="Calibri"><xsl:value-of select="rok"/></fo:block> 
     </fo:table-cell> 
     <fo:table-cell border="solid black 1px"> 
      <fo:block font-family="Calibri"><xsl:value-of select="obsada"/></fo:block> 
     </fo:table-cell> 
    </fo:table-row> 
</xsl:template> 

<xsl:template name="dataCzas"> 
    <xsl:value-of select="java:format(java:java.text.SimpleDateFormat.new('dd MMMM yyyy, HH:mm:ss'), java:java.util.Date.new())"/> 
</xsl:template> 

</xsl:stylesheet> 

xml dosyası:

http://pastebin.com/fr9fChtn

+0

Ayrıca örnek bir xml var mı? – rene

+0

Evet, sorumu değiştirdim – user3050705

cevap

6

FOP # olarak karakterleri çıktılar, seçilen yazı tipi onları temsil edecek bir glif içermez.

XML giriş dosyası gibi satırlar içerdiğinden bu muhtemelen geçerli: sorunlu karakteri burada ł olduğunu

<kraj>Francja, USA, Włochy</kraj> 

.

Sorunuzu yanıtlamak için: FOP UTF-8'i destekliyor, sadece yazı tipinin (sizin durumunuzda: font-family='Calibri') karakterleri temsil edecek bir yolu yoktur.

bu gerçekten durumda, FOP çıktılayacaktır de seçmiş olduğunuz yazı bulunmayan bu karakterlerin hesaba katmak amacıyla Şimdi

WARNING: Glyph for "ł" not available in font "DejaVuSans" 

çizgisinde bir uyarı, ya değişim olursa Çıktı yazı tipi tamamen veya geçici bir çözüm olarak bunları satır içi ile ayırın.

Örneğin, bu karakterin Σ (matematiksel operatör) için, sağ yazı seçili olduğundan emin olun nasıl: http://xmlgraphics.apache.org/fop/trunk/fonts.html:

<fo:block> 
    <fo:inline font-family='Symbol'>Σ</fo:inline> 
</fo:block> 

FOP ile fontlar hakkında daha fazla bilgi için bu sayfaya bakın.

0

Çözüm çok daha basit olabilir. Bizim durumumuzda biz tam yazı embedd için Calibri yazı tipi tanımına FOP yazı yapılandırma web sayfası ve yeni eklediğiniz

kodlama modu = "tek baytlık"

okumak, eksik gliflerle için uyarılar var. Bu bizim için sorunu çözdü (FOP 2.0 ile).