图像未找到 - XSL-FO

时间:2014-10-16 10:18:19

标签: xml xsl-fo

虽然我已经为图像设置了正确的路径,但是XSL-Fo无法检索我的图像。

<fo:external-graphic src="../graphics/bullet.png" content-height="0.5cm" />

我在每次尝试通过Windows的命令提示符处理文件时收到此错误。

org.apache.fop.events.LoggingEventListener processEvent
SEVERE: Image not found. URI: bullet.png. (See position 26:80)
org.apache.fop.events.LoggingEventListener processEvent                                                       
SEVERE: Image not found. URI: bullet.png. (No context info available)
org.apache.fop.events.LoggingEventListener processEvent                                                                                

源路径是APACHE的FOP图像示例提供的确切格式。我甚至执行了他们的&#34; image.fo&#34;文件在渲染外部图形时,仍然遇到上面的错误(使用不同的图像文件)。

是否有其他解决方案?

3 个答案:

答案 0 :(得分:3)

相对URI相对于基URI(https://xmlgraphics.apache.org/fop/fo.html#external-resources)。

如果您没有在FOP配置中设置基本URI,则基本URI是当前目录(https://xmlgraphics.apache.org/fop/1.1/configuration.html)。

相对于运行FOP的目录的图像文件在哪里?


使用时是否有效:

<fo:external-graphic src="examples/fo/graphics/bullet.png" content-height="0.5cm" />

答案 1 :(得分:1)

我的外部图片标签如下所示:

<fo:external-graphic content-height="15.73mm" src="url('logo.png')"/>

我必须将logo.png文件放在与xsl文件相同的目录中。

也就是说,我的fop命令看起来像这样:

$TOOLS/fop-2.0/fop -d -x -xml xmlfiles/xmlfile.xml -xsl xslfiles/xslfile.xsl -pdf pdffiles/pdffile.pdf

我必须将.png文件放在xmlfiles目录中。

我提出这个问题是因为接受的答案说URI是“当前目录”。

答案 2 :(得分:0)

正如Micheal Potter在https://stackoverflow.com/a/36521536/12227050中指出的那样,该路径相对于xml文件的URI(如果没有其他基本路径配置)。如果不能确保xml文件和图形文件之间的关系,则必须使用技巧:

图像路径是相对于主要xml输入文件的。因此,诀窍是一方面在图像附近具有一个准空的虚拟xml文件作为主文件,另一方面从辅助文件访问所有数据。

示例:

convert.bat

请注意,data.xml相对于dummy.xml也已解析,因此它是../data.xml

call %dir%/fop -xml script/dummy.xml -xsl script/small.xsl -pdf small.pdf -param doc3node ../data.xml

data.xml

<?xml version="1.0" encoding="UTF-8"?>
<C attr="Attribute here.">
    <d>Hello!</d>
    <DDDD>Dadadadam</DDDD>
</C>

script / dummy.xml

此文件可能甚至更空了

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

script / logo.gif

[not shown here]

脚本/small.xsl

请注意,logo.gif相对于dummy.xml(均位于同一目录中)。主要技巧是基本上使用document('../data.xml')//element

访问辅助xml文件的数据。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:func="http://exslt.org/functions" extension-element-prefixes="func">
    <xsl:param name="doc3node" select="''"/>
    <xsl:variable name="d3" select="document($doc3node)" />

    <xsl:template match="/">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="DIN-A4" page-height="29.7cm" page-width="21cm">
                    <fo:region-body margin-top="1.5cm" margin-bottom="1.5cm" margin-left="2cm" margin-right="2cm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="DIN-A4">
                <fo:flow flow-name="xsl-region-body">
                    <xsl:variable name="doc2node" select="'../data.xml'" />
                    <xsl:for-each select="document($doc2node)//*">
                        <xsl:call-template name="ListThemAll" />
                    </xsl:for-each>
                    <fo:block><xsl:text>... again ...</xsl:text></fo:block>
                    <xsl:for-each select="$d3//*">
                        <xsl:call-template name="ListThemAll" />
                    </xsl:for-each>
                    <xsl:call-template name="End"/>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>

    <xsl:template name="ListThemAll" match="*">
        <fo:block><xsl:text>Element: </xsl:text><xsl:value-of select="name()"/></fo:block>
    </xsl:template>

    <xsl:template name="End">
        <fo:block text-align="center">
            <fo:external-graphic src="logo.gif" content-width="2.5cm"/>
        </fo:block>
    </xsl:template>
</xsl:stylesheet>

结果pdf文件输出

Element: C
Element: d
Element: DDDD
... again ...
Element: C
Element: d
Element: DDDD
                                        [Centered image]