【问题标题】:Does xslt-fo not support utf-8?xslt-不支持 utf-8 吗?
【发布时间】:2014-01-03 00:07:09
【问题描述】:

我有一个带有编码属性的 utf-8 xml 文件。

当我执行fop -xml xml.xml -xsl xsl.xsl -pdf pdf.pdf 时,我的输出 pdf 已损坏 utf-8 字符。重要的是,xsl 文件中的文本没有 utf-8 字符,与 xml 中的文本相同。

Utf-8 字符替换为 #

可能出了什么问题?

Xsl 文件:

    <?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 文件:

http://pastebin.com/fr9fChtn

【问题讨论】:

  • 您也有示例 xml 吗?
  • 是的,我替换了我的问题

标签: xslt encoding xsl-fo apache-fop


【解决方案1】:

解决方案可能要简单得多。在我们的例子中,我们收到了缺少字形的警告,请阅读 FOP 字体配置网页并添加

encoding-mode="单字节"

到 Calibri 字体定义以嵌入完整字体。这为我们解决了这个问题(使用 FOP 2.0)。

【讨论】:

    【解决方案2】:

    如果 FOP 将字符输出为 #,则所选字体不包含表示它们的字形。

    这可能是因为您的 XML 输入文件包含如下行:

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

    这里有问题的字符是ł

    所以,回答您的问题:FOP 确实支持 UTF-8,只是字体(在您的情况下:font-family='Calibri')无法表示字符。

    如果情况确实如此,FOP 应输出如下警告:

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

    现在,为了还考虑到您选择的任何字体中不存在的那些字符,要么一起更改输出字体,要么作为一种解决方法,使用内联将它们隔离。

    例如,这是确保为字符 Σ(数学运算符)选择正确字体的方法:

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

    有关 FOP 字体的更多信息,请参阅此页面:http://xmlgraphics.apache.org/fop/trunk/fonts.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 2018-08-21
      • 2010-10-05
      • 1970-01-01
      相关资源
      最近更新 更多