grails - 使用 grails 邮件插件在电子邮件中发送 PDF 附件

标签 grails pdf groovy rendering wkhtmltopdf

我正在尝试将 PDF 文件作为电子邮件附件发送。我不想在服务器或客户端计算机上保存 pdf 文件。我尝试过跟随。但这不起作用。请建议正确的方法。

ByteArrayOutputStream bytes = pdfRenderingService.render(template: "path to template", model: [account:account])

asynchronousMailService.sendMail {
                    multipart true
                    to emailID
                    subject emailSubject
                    html emailBodyContent
                    attachBytes "filename.pdf", "application/pdf", bytes
                }

它不起作用,因为它需要在附件中发送字节。并且 ByteArrayOutputStream 不提供以字节为单位的输出。有人有解决办法吗?

我尝试了bytes.toByteArray()。但它给出了以下异常:

2014-11-03/22:25:35.994 [http-bio-8080-exec-9]  ERROR errors.GrailsExceptionResolver - MissingMethodException occurred when processing request: [GET] /morningProc/approvalPdfFR
No signature of method: [B.call() is applicable for argument types: (java.lang.String, java.lang.String, [B) values: [Approval.pdf, application/pdf, [37, 80, ...]]
Possible solutions: wait(), any(), grep(), dump(), find(), collect(). Stacktrace follows:
groovy.lang.MissingMethodException: No signature of method: [B.call() is applicable for argument types: (java.lang.String, java.lang.String, [B) values: [Approval.pdf, application/pdf, [37, 80, ...]]
Possible solutions: wait(), any(), grep(), dump(), find(), collect()
    at com.crm.MultilingualEmailService$_$tt__sendEmailFormateWithAttachment_closure14$$EOuZNrCU.doCall(MultilingualEmailService.groovy:79)
    at grails.plugin.mail.MailService.sendMail(MailService.groovy:39)
    at MailGrailsPlugin$_configureSendMail_closure7.doCall(MailGrailsPlugin.groovy:180)
    at com.crm.MultilingualEmailService$$EOuZNrCS.$tt__sendEmailFormateWithAttachment(MultilingualEmailService.groovy:74)
    at com.crm.MorningProcController$$EOuZVK1N.approvalPdfFR(MorningProcController.groovy:882)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:200)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53)
    at grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49)
    at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

即使我尝试使用 Wkhtmltopdf 插件。但它给出了错误。 我尝试了以下代码:

byte[] pdfData = wkhtmltoxService.makePdf(
            view: "/morningProc/approvalPdfFR",
            model: [account:accountInst],
            header: "",
            footer: "",
            marginLeft: 20,
            marginTop: 35,
            marginBottom: 20,
            marginRight: 20,
            headerSpacing: 10
    )

但不幸的是没有运气。它抛出异常:

Cannot find wkhtml executable at [:] trying to make it available with the makeBinaryAvailableClosure
2014-11-04/00:50:35.985 [http-bio-8080-exec-2]  ERROR errors.GrailsExceptionResolver - GroovyCastException occurred when processing request: [GET] /morningProc/approvalPdfFR
Cannot cast object 'groovy.util.ConfigObject@5ee8e41c' with class 'groovy.util.ConfigObject' to class 'groovy.lang.Closure' due to: groovy.lang.GroovyRuntimeException: failed to invoke constructor: public groovy.lang.Closure(java.lang.Object) with arguments: [[:]] reason: java.lang.InstantiationException. Stacktrace follows:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'groovy.util.ConfigObject@5ee8e41c' with class 'groovy.util.ConfigObject' to class 'groovy.lang.Closure' due to: groovy.lang.GroovyRuntimeException: failed to invoke constructor: public groovy.lang.Closure(java.lang.Object) with arguments: [[:]] reason: java.lang.InstantiationException
    at org.wkhtmltox.WkhtmltoxService.makePdf(WkhtmltoxService.groovy:56)
    at org.wkhtmltox.WkhtmltoxService.makePdf(WkhtmltoxService.groovy:35)
    at com.crm.MorningProcController$$EOua5loZ.approvalPdfFR(MorningProcController.groovy:881)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:200)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53)
    at grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49)
    at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

最佳答案

终于对我有用了。解决办法如下:

ByteArrayOutputStream bytes = pdfRenderingService.render(template: "path to template", model: [account:account])

asynchronousMailService.sendMail {
                    multipart true
                    to emailID
                    subject emailSubject
                    html emailBodyContent
                    attachBytes "filename.pdf", "application/pdf", bytes.toByteArray()
                }

而且我也运行了清理命令。还有一个提示,不要将 bytes 变量名设置为“attachBytes”。例如:attachBytes“filename.pdf”、“application/pdf”、attachBytes.toByteArray() 这也让我花了很多时间来寻找解决方案。

关于grails - 使用 grails 邮件插件在电子邮件中发送 PDF 附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26711159/

相关文章:

grails - Grails/GORM中的旧版映射:1:N关系中的一个域类和两个表

javascript - 可以在 PDF 中嵌入 javascript 并在浏览器窗口中打开 PDF 时触发它吗?

java - Groovy gdk 命名空间冲突

unix - 从命令行运行 Groovy 脚本

java - 响应创建elasticsearch来自文件的响应期间出错

grails - 在Controller中使用域类时,在测试完 Controller 后将返回错误

grails - 动态调度作业:在Groovy中使用cron触发器

pdf - 使用 PDFBox 从 PDF 获取可见签名?

spring - Grails对于transaction = false的默认传播是什么?

java - 从 Servlet 下载文件的 HttpURLConnection 不起作用,直接链接有效