2014-11-03 2 views
2

이메일에 첨부 파일로 PDF 파일을 보내려고합니다. 나는 서버 또는 클라이언트 컴퓨터에 pdf 파일을 저장하고 싶지 않습니다. 나는 다음을 시도했다. 그러나 그것은 효과가 없습니다. 올바른 방법을 제안하십시오.grails 메일 플러그인을 사용하여 이메일에 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 
    ) 

그러나 불행하게도 운 : 나는 다음 코드를 시도했다. 그것은 예외를 throw합니다 :

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 '[email protected]' 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 '[email protected]' 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

'bytes.toByteArray();을 시도하십시오. – Jens

+0

@Jens : 작동하지 않습니다. 내 업데이트 된 질문을 참조하십시오. – user3853055

+0

'attachBytes 'filename.pdf', 'application/pdf ", bytes' work?'비동기 메일 플러그인 1.1' 플러그인을 사용하고 있습니까? – cfrick

답변

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'로 지정하지 마십시오. Like : attachBytes "filename.pdf", "application/pdf", attachBytes.toByteArray() 또한 해결책을 찾는데 너무 많은 시간을 보냈습니다.

관련 문제