2015-10-30 12 views
10

Ho un problema molto strano con il rendering PDF funziona ovunque, ma non su prod. Gli ambienti di sviluppo e test funzionano senza problemi, ma prod non riescono a gestirlo. Le uniche modifiche che sono ora su prod: versione Grails superiore rispetto all'ultima guerra (2.1.0 ->2.3.8 [ma questa modifica è stata introdotta nell'ambiente di test ~ 2 mesi fa e tutti i problemi sono stati risolti quindi]) con alcuni plugin aggiornati, soprattuttoRendering PDF non funziona su ambiente prod

compile ":rendering:0.4.3" 

cambiato in

compile ":rendering:1.0.0" 

Stacktrace salgo sul prod:

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) 

mio ReportController metodo per la generazione di file PDF (nulla è realmente accadendo qui e, sì, il file pdfShow inizia con un trattino):

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

ho già fatto un bel po 'di ricerche e ho trovato indicazioni che potrebbe essere il problema con i font dichiarati nel. file CSS che viene utilizzato dal modello pdf.

Bene, questo è il 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; 
} 

E i caratteri ci sono, sia in prova e prod. E non ha cambiato la loro posizione.

ho cercato declassamento rendering plug-in di nuovo a 0.4.3, ma non ha funzionato, lamentano classi non disponibile:

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. 

impostazione nel BuildConfig.groovy

legacyResolve true 

all'interno grails.project.dependency.resolution { ... inoltre, non ha lavoro.

Avete idea di cosa potrebbe essere sbagliato?

+0

Hai provato a eseguirlo in produzione senza le sezioni '@ font-face' in css? –

+0

@AshrafPurno non ancora (lo farò), ma cosa succede se ho bisogno di questo font e l'ho sempre usato senza problemi? –

+0

Sono presenti CDN o altri meccanismi di memorizzazione nella cache? –

risposta

0

La cosa che ha risolto il problema, è stata aggiunta una riga alla Config.groovy:

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

Abbiamo avuto questa linea negli ambienti test e development, ma prima, con Grails 2.1.0 ha funzionato comunque.

+0

Questo non mi ha aiutato. Sono stato costretto a non usare caratteri personalizzati come soluzione rapida ... – kuceram