2015-10-30 13 views
10

Ich habe ein sehr seltsames Problem mit der PDF-Rendering funktioniert überall, aber nicht auf prod. Entwickler- und Testumgebungen arbeiten ohne Probleme, aber prod kann einfach nicht damit umgehen. Die einzigen Änderungen, die jetzt auf prod sind: höhere Grails-Version als der letzte Krieg (2.1.0 ->2.3.8 [aber diese Änderung wurde in die Testumgebung vor ca. 2 Monaten eingeführt und alle Probleme wurden dann behoben]) mit wenigen verbesserten Plugins, insbesondereRendering PDF funktioniert nicht auf Prod-Umgebung

compile ":rendering:0.4.3" 

geändert

compile ":rendering:1.0.0" 

Stacktrace ich auf prod erhalten:

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) 

Mein ReportController Verfahren für PDF-Dateien zu erzeugen (nichts wirklich passiert hier und, ja, beginnt pdfShow Datei mit einem Unterstrich):

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') 
} 

Ich habe schon einiges an Forschung getan und fanden Hinweise darauf, dass es das Problem mit Schriftarten in deklariert sein könnten. CSS-Datei, die von der PDF-Vorlage verwendet wird.

Nun, das ist die 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; 
} 

Und die Schriften gibt es sowohl auf Test und prod. Und änderte ihren Standort nicht.

Ich habe versucht, die Herabstufung rendering Plugin zurück zu 0.4.3, aber es hat nicht funktioniert, über nicht verfügbaren Klassen klagen:

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. 

Einstellung im BuildConfig.groovy

legacyResolve true 

innen grails.project.dependency.resolution { ... tat auch nicht Arbeit.

Haben Sie eine Idee, was könnte falsch sein?

+0

Haben Sie versucht, es in der Produktion ohne die '@ font-face' Abschnitte in CSS laufen zu lassen? –

+0

@AshrafPurno noch nicht (werde ich), aber was ist, wenn ich diese Schriftart brauche und sie immer ohne Probleme benutzt habe? –

+0

Sind CDNs oder andere Caching-Mechanismen beteiligt? –

Antwort

0

Die Sache, die das Problem gelöst, war eine Zeile zum Config.groovy Zugabe:

environments { 
    production { 
     (...) 
     grails.resources.processing.enabled = false 

wir diese Linie in dem test und development Umgebungen hatten, aber vor, mit Grails es trotzdem 2.1.0 gearbeitet.

+0

Das hat mir nicht geholfen. Ich war gezwungen, benutzerdefinierte Schriftarten nicht als schnelle Lösung zu verwenden ... – kuceram

Verwandte Themen