我有一个非常奇怪的问题,渲染PDF到处工作,但不是生产.开发人员和测试环境正常运行,但prod无法处理它.现在唯一的变化是:比上一次战争更高的Grails版本(2.1.0- > 2.3.8[但这个变化已经引入测试环境〜2个月前,所有问题都解决了]),几乎没有升级过的插件,特别是
compile ":rendering:0.4.3"
Run Code Online (Sandbox Code Playgroud)
变成
compile ":rendering:1.0.0"
Run Code Online (Sandbox Code Playgroud)
Stacktrace我开始刺激:
java.lang.NullPointerException
at org.xhtmlrenderer.swing.NaiveUserAgent.getBinaryResource(NaiveUserAgent.java:228)
at org.xhtmlrenderer.pdf.ITextFontResolver.importFontFaces(ITextFontResolver.java:97)
at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:178)
at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:142)
at grails.plugin.rendering.pdf.PdfRenderingService.doRender(PdfRenderingService.groovy:36)
at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:43)
at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:37)
at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:35)
at grails.plugin.rendering.RenderingService.render(RenderingService.groovy:65)
at GrailsMelodyGrailsPlugin$_closure4_closure16_closure17.doCall(GrailsMelodyGrailsPlugin.groovy:184)
at RenderingGrailsPlugin$_closure3.doCall(RenderingGrailsPlugin.groovy:59)
at com.my.app.ReportController$_closure8.doCall(ReportController.groovy:169)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:200)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at net.bull.javamelody.JspWrapper.invoke(JspWrapper.java:150)
at net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler.invoke(JdbcWrapper.java:285)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:198)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:176)
Run Code Online (Sandbox Code Playgroud)
我ReportController生成pdf的方法(这里没有发生任何事情,是的,pdfShow文件以下划线开头):
def generatePdf = {
if (!params.id) {
throw new IllegalArgumentException("PDF Generation: an instance identifier has not been passed.")
}
def reportInstance = Report.findById(params.id)
renderPdf(template: "pdfShow", model: [reportInstance: reportInstance], filename: reportInstance?.reportFilename + '.pdf')
}
Run Code Online (Sandbox Code Playgroud)
我已经做了很多研究,并发现可能是pdf模板使用的.css文件中声明的字体问题.
嗯,这是.css:
@font-face {
src: url("../fonts/DejaVuSansCondensed.ttf");
-fs-pdf-font-embed: embed;
-fs-pdf-font-encoding: Identity-H;
}
@font-face {
src: url(../fonts/DejaVuSansCondensed-Bold.ttf);
-fs-pdf-font-embed: embed;
-fs-pdf-font-encoding: Identity-H;
}
body {
font-family: "DejaVu Sans Condensed", Arial, sans-serif;
}
Run Code Online (Sandbox Code Playgroud)
在测试和产品上都有字体.并没有改变他们的位置.
我已经尝试将rendering插件降级回来0.4.3,但它没有用,抱怨没有可用的类:
plugins\rendering-0.4.3\grails-app\services\grails\plugin\rendering\document\XhtmlDocumentService.groovy: 20: unable to resolve class org.xhtmlrenderer.resource.XMLResource
(...)\plugin\rendering\pdf\PdfRenderingService.groovy: 25: unable to resolve class com.lowagie.text.pdf.BaseFont
(...)\plugin\rendering\pdf\PdfRenderingService.groovy: 19: unable to resolve class org.xhtmlrenderer.pdf.ITextRenderer
...and few others etc.
Run Code Online (Sandbox Code Playgroud)
设置在 BuildConfig.groovy
legacyResolve true
Run Code Online (Sandbox Code Playgroud)
里面grails.project.dependency.resolution { ...也没用.
你知道什么是错的吗?
解决问题的方法是在以下内容中添加一行Config.groovy:
environments {
production {
(...)
grails.resources.processing.enabled = false
Run Code Online (Sandbox Code Playgroud)
我们在test和development环境中有这条线,但之前,在 Grails 2.1.0 中它仍然可以工作。
| 归档时间: |
|
| 查看次数: |
803 次 |
| 最近记录: |