我正在使用grails渲染插件生成pdf。 在开发中,我使用带有src的标记将图像包含在服务器上的图像中。它工作正常,但在部署应用程序时不再适用。图像消失了。
我正在通过一个模板进行渲染,所以当我将这个模板调用到gsp中时,它是可以的(即我看到带有图像的pdf的html版本),在使用renderPdf在我的控制器中调用时没有图像。
仅在部署的应用程序(战争)中,而不是在开发中。
任何提示?
编辑:根据热门请求,这里是代码:
_pdf.gsp文件可以像
一样简单<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head/>
<body>
<img src="path/to/image.jpg"/>
</body>
</html>
控制器的相关部分是
def pdf={
renderPdf(template: "/file/pdf", filename: "myfile.pdf")
}
答案 0 :(得分:7)
我一直在看这个令人沮丧的日子,并尝试了很多东西。我的建议是,他们在文档中给出的建议是坚持内嵌图像。我的意思是以字节形式定义图像。你不会后悔,你将确保渲染插件能够与其他插件如ui-performance和资源一起使用。
首先像这样创建文件对象
def paid = new File(ApplicationHolder.application.parentContext.servletContext.getRealPath("/images/paid.jpg"))
然后将文件的字节传入模型
renderPdf(template:invoiceTemplate, model:[paidBytes:paid.bytes])
现在,在您的pdf模板中,使用以下标记:
<rendering:inlineJpeg bytes="${paidBytes}" />
如果您没有依赖性问题,那么您应该设置。 如果您遇到像我一样遇到依赖性问题并注意到HERE,那么请查看您提到的iText版本。
答案 1 :(得分:3)
它肯定与渲染插件的文档中所述的内容有关:
“应用程序必须可以访问所有资源链接(例如图像,css)。这是由于应用程序而不是浏览器访问链接的资源。根据您在生产中的网络配置,这可能需要一些特殊的考虑“
可能提示:如果您在服务器上运行Linux,请将您站点的域名添加到/ etc / hosts,以便解析为127.0.0.1。如果其他操作系统做了相应的操作。
答案 2 :(得分:0)
正如wwwclaes所说,这是关于应用程序的可用资源。
但是,如果你正在使用资产管道,你可以使它更简单。
控制器:
def assetResourceLocator
...
def myAction() {
...
renderPdf(template:invoiceTemplate, model:[rl:assetResourceLocator])
}
...
然后在你的模板中:
<rendering:inlineJpeg bytes="${rl?.findAssetForURI('paid.jpg').byteArray}" />
现在,您可以将rl用于模板中的任意数量的图像,而不会使用演示项目来破坏控制器中的模型。