<fo:外部图形 src=... >抛出错误



我使用 fop 2.1,我需要加载具有绝对路径的外部图形。我试过这个:

<fo:root xsl:use-attribute-sets="text-attributes">
<fo:layout-master-set>
...
<fo:page-sequence master-reference="master">
<xsl:call-template name="pageHeader"/>
<xsl:call-template name="pageFooter"/>
<fo:flow flow-name="xsl-region-body">
...
</fo:flow>
</fo:page-sequence>
...
<xsl:template name="pageHeader">
<fo:static-content flow-name="region-before-first">
<fo:block>
<fo:external-graphic src="url({concat('file:/',$logo-image)})" height="15mm" content-height="15mm"/>  
</fo:block>
</fo:static-content>
</xsl:template>

$logo图像包含绝对路径,如 C:/users/.../application/logo.gif

我收到以下错误:

PM org.apache.fop.events.LoggingEventListener processEvent
SEVERE: Invalid property value encountered in src="url(file:/C:/users/.../application/logo.gif)"  .... Invalid URI specified

知道吗?

我还尝试在"url('file:/C:/users/.../application/logo.gif'("等地方放置"没有成功... :-(


与其他一些样式表一样,我确实有外部图形,我尝试的功能也将标题带入正常流程( => 不是静态的(。不是真正的标题方法,而是尝试...

<fo:root xsl:use-attribute-sets="text-attributes">
<fo:layout-master-set>
...
<fo:page-sequence master-reference="master">
<!--<xsl:call-template name="pageHeader"/>-->
<xsl:call-template name="pageFooter"/>
<fo:flow flow-name="xsl-region-body">
<xsl:call-template name="pageHeader"/>
...
</fo:flow>
</fo:page-sequence>
...
<xsl:template name="pageHeader">
<fo:block-container position="absolute" top="10mm" left="10mm">
<fo:block>
<fo:external-graphic src="url({concat('file:/',$logo-image)})" height="15mm" content-height="15mm"/>  
</fo:block>
</fo:block-container>
</xsl:template>

但是:如果我把

<fo:external-graphic src="url({concat('file:/',$logo-image)})" height="15mm" content-height="15mm"/> 

<fo:external-graphic src="url({concat('file:///',$logo-image)})" height="15mm" content-height="15mm"/> 

我得到同样的愚蠢错误:

.... Invalid URI specified

首先,通过使其作为独立于 XSLT 的静态 FO 文件来简化问题。 一旦静态目标 FO 文件正常工作,就可以双倍返回 XSLT。

请注意,正如@rene所评论的那样,您必须使用完整的 URI 语法,这实际上可能需要另一个/才能进行本地访问。 (想想protocol://host/path协议是"file",而主机在这里是空的,连续产生三个斜杠(:

file:///c:/users

如果您仍然对此有疑问,请执行浏览器在目录树中向上移动,以确保文件及其祖先目录都存在。

最后,请注意,...无效,以防这是..的拼写错误,而不是关于省略路径组件的元表示法。

哎呀,我明白了!

这是一个愚蠢的Windows斜杠/反斜杠的东西...!

获取图像路径时,我只需要转换斜杠:

string logoImg = BackslashToSlash(Path.GetFullPath(imageFile));
xsltArgumentList.Add("logo-image", logoImg);
...
public static String BackslashToSlash(String inStr)
{
try
{
return inStr.Replace("\", "/");
}
catch (Exception)
{
return "";
}
}

在样式表(xsl(中,您甚至可以在"file:"(!(之后使用单斜杠版本:

<fo:external-graphic src="url({concat('file:/',$logo-image)})" />

尽管如此,我认为它实际上应该是三斜杠:

<fo:external-graphic src="url({concat('file:///',$logo-image)})"

最新更新