Pdf Grails渲染插件在部署时不渲染图像

Pdf Grails渲染插件在部署时不渲染图像,pdf,grails,war,grails-plugin,Pdf,Grails,War,Grails Plugin,我正在使用grails渲染插件生成pdf。 在开发过程中,我使用带有src的标记将图像包含到服务器上的图像中。它可以正常工作,但在部署应用程序时就不再工作了。图像消失了 我正在通过一个模板重新定义,所以当我在gsp中调用此模板时,它是正常的(即我看到带有图像的pdf的html版本),但在我的控制器中使用renderPdf调用时,没有图像 同样,仅在部署的应用程序(war)中,而不是在开发中 有什么提示吗 编辑:在“常用请求”下,以下是代码: _pdf.gsp文件可以简单到 <!DOCTYP

我正在使用grails渲染插件生成pdf。 在开发过程中,我使用带有src的标记将图像包含到服务器上的图像中。它可以正常工作,但在部署应用程序时就不再工作了。图像消失了

我正在通过一个模板重新定义,所以当我在gsp中调用此模板时,它是正常的(即我看到带有图像的pdf的html版本),但在我的控制器中使用renderPdf调用时,没有图像

同样,仅在部署的应用程序(war)中,而不是在开发中

有什么提示吗

编辑:在“常用请求”下,以下是代码:

_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>

这肯定与渲染插件文档中的说明有关:

应用程序必须能够访问指向资源(如图像、css)的所有链接。这是由于应用程序而不是浏览器正在访问链接的资源。根据生产中的网络配置,这可能需要特别考虑


可能的提示:如果您在服务器上运行Linux,请将站点的域名添加到/etc/hosts,使其解析为127.0.0.1。如果其他操作系统也这样做。

我已经花了两天的时间研究这个问题,并尝试了很多方法。我的建议,他们在文档中给出的建议是坚持使用内联图像。我的意思是以字节形式定义图像。你不会后悔的,你会确信渲染插件会与其他插件(如ui性能和资源)配合使用

首先像这样创建file对象

def paid = new File(ApplicationHolder.application.parentContext.servletContext.getRealPath("/images/paid.jpg"))
然后将文件的字节传递到模型中

renderPdf(template:invoiceTemplate, model:[paidBytes:paid.bytes])
现在,在pdf模板中使用以下标记:

<rendering:inlineJpeg bytes="${paidBytes}" />

如果您没有依赖性问题,那么应该设置。
如果您确实遇到了依赖性问题,如我所做的和注意到的,那么请查看iText的版本

正如wwwclaes所说,这是关于应用程序可用资源的问题

但是,如果您使用的是资产管道,则可以使其变得简单一点

控制器:

def assetResourceLocator
...
def myAction(){
...
renderPdf(模板:invoiceTemplate,模型:[rl:assetResourceLocator])
}
...

然后在模板中:



现在,您可以对模板中的任意数量的图像使用rl,而不会使控制器中的模型与演示项目混淆。

以及日志输出(如果有任何感兴趣的内容)。我已使用代码进行了更新。请注意,内联图像数据是一种解决方法,但是对于大图像来说太重了。您是否使用嵌入式插件?在部署到tomcat时,某些路径会有所不同。解压你的战争并检查图像的真实位置。我猜路径是错误的。事实上,没有,因为我呈现了模板的html版本,并且图像是存在的。嗯,我确信图像是存在的,因为正如我的消息中所述,在生产服务器上调用另一个gsp中的模板是可以的(即图像是存在的)。顺便说一句,我使用jetty作为服务器是的,图像已存在,您的浏览器将找到并显示该图像。但是,渲染插件尝试直接从服务器而不是从浏览器中查找图像。由于网络是如何配置的,它肯定找不到它,这就是为什么你在pdf中看不到它的原因。试试我的小费!事实上,我在使用内联时也得出了这个结论,内联在一个项目上运行得很好,但另一个项目,我必须在pdf中报告许多图像,并且pdf的大小随着这种方法的使用而快速增长(3页文档的大小为10米),而且服务器有点超载……很高兴听到你得出了同样的结论:)我发现指定绝对URL可以让图像显示在PDF中,只要它们没有被g-Zip压缩。所以这可能是你的备用计划。我很想知道:如果你只是在gsp中将图像指定为URL,这实际上会减少PDF的大小吗?我倾向于认为它对大小没有影响。是的,事实上,原因是图像在内联时以某种方式嵌入ascii模式,就像您放置数据一样:image/png,%89PNG%0D%0A%1A%0A%00%00%00%00%00%00%00%05%00%00%05%08%06%00%00%00%8Do%26%E5%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9%11%EW%8%C151%CE8%(%00%00%00%00IEND%AEB%60%82在您的浏览器中我发现,当我在一个简单的gsp页面中呈现模板时,最好使用
resourceLocator.findAssetForURI('image.png').getInputStream().bytes
,而不是使用pdfIt,以避免生产中的错误。
<rendering:inlineJpeg bytes="${paidBytes}" />