使用XSL-FO和数据URI方案在PDF中显示图像需要帮助。

4

对于数据,如果我在参数中设置了base64编码的字符串,

String imageData = Base64.encode(IOUtils.toByteArray(is));
transformer.setParameter("imageData", imageData);

然后像这样在xslt中使用参数:

<fo:external-graphic src="data:image/jpeg;base64,$imageData"/>

我尝试了有url和没有url两种方式,但都似乎不起作用。请帮助我。我已经努力一个月了,但仍无法将图像放在pdf上。

你的问题是无法在属性中获取base64编码数据,还是FO引擎未能正确呈现数据URI? - Mads Hansen
1个回答

4
你遇到的问题是 $imageData 没有被输出,只输出了字符串 "$imageData"?
当你在属性内部并且想要评估变量的值时,你需要使用 属性值模板 。用花括号包裹变量。
<fo:external-graphic src="data:image/jpeg;base64,{$imageData}"/>

非常感谢,它起作用了。现在我有一个运行的东西,你能否帮我提供一个更高效的解决方案来添加图片,而不是每次都需要读取和转换图像为bas64字符串。这就是我的设置。我有一张图片,在xsl相对路径中-images/pic.jpg。我了解到,为了使xsl解析相对路径,我必须设置基本URL。但默认的基本URL是域目录,即'C:\Oracle\Middleware\user_projects/domains/myDomain/'。 - Aravind
当应用程序部署时,它会在域目录中展开,我想要的图像位于此文件夹内 - 'servers/myApp/tmp/_WL_user/agency/29k2yv/war/images'。如果我将此目录设置为基本目录,则可以像这样访问图像 - <fo:external-graphic src="file:image.jpg"/> 但是,在QA和生产环境中,位置将发生变化,不想硬编码超出应用程序ear的路径。是否有更好的解决方案? - Aravind
很高兴它起作用了。一个简化获取Base64内容的想法是创建一个Servlet,你可以将文件名或URI作为查询字符串参数传递给它,该Servlet会返回XML内容,其中包含该资源的Base64值,您可以在其中XPath并检索内容。您可以以任何方式引用这些Servlet URL(实体引用,使用XSLTdocument()函数等)。您的文件的物理位置可能会更改,但您可以维护一个静态servlet路径'http://localhost/myApp/base64Servlet?file=image.jpg'。 - Mads Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接