我正在尝试将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)
答案 0 :(得分:2)
最后它对我有用。以下是解决方案:
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()
}
而且我确实运行了清理命令。还有一个提示,不要将字节的变量名称作为'attachBytes'。喜欢:attachBytes "filename.pdf", "application/pdf", attachBytes.toByteArray()
这也让我花了很多时间来解决问题。