Плагин Grails Rendering сохранить в файл - PullRequest
2 голосов
/ 17 мая 2011

Я пытаюсь использовать плагин рендеринга для сохранения сгенерированного PDF в файл, когда отображается действие контроллера для создания PDF.Я следую инструкциям: http://gpc.github.com/grails-rendering/docs/manual/index.html

def pdf = {
        def project = Project.get(params.id)
        def numGoodMilestones = queryService.getGoodShapeMilestonesCount(project)
        def totalMilestones = project.milestones.size()
        def updateHistory = queryService.getReadableHistory(project)
        def summaryName = "${project.name.replace(" ","_")}_summary_${String.format('%tF', new Date()).replace(" ","_")}"
        if(!project)
        {
            flash.message = g.message(code:'default.not.found.message',
                args:[message(code:'project.label',default:'Project'),params.id])
            redirect(uri:'/')
        }
        // see if a summary has been generated with this data and attached to the
        // project. If not, do it.
        def existingAttachedSummary = ProjectDocument.findByName(summaryName)
        if(!existingAttachedSummary)
        {
            //make the file
            def savedSummary = new File(summaryName).withOutputStream { outputStream ->
                pdfRenderingService.render( controller:this,
                template: "projectDetail",
                model:[project:project,
                      numGoodMilestones:numGoodMilestones,
                      totalMilestones:totalMilestones,
                      updateHistory: updateHistory])
            }
            def projectDocument = new ProjectDocument(name:summaryName,
                                  description:"Project summary automatically generated on ${new Date()}}",
                                  fileData:savedSummary,
                                  owner: springSecurityService.currentUser,
                                  project:project
                              )
            if(projectDocument.validate())
            {
                projectDocument.save(flush:true)
                flash.message="I saved a document, yo. ${projectDocument}."
            }
            else
            {
                flash.message="Errors, yo. ${projectDocument.errors.allErrors.each{ it }}."
            }
        }
        else
        {
            flash.message = "project summary already attached to project"
        }

        renderPdf(template: "projectDetail",
        model:[project:project, numGoodMilestones:numGoodMilestones, totalMilestones:totalMilestones, updateHistory: updateHistory],
        filename: "${summaryName}.pdf")
    }

Метод renderPdf () работает нормально, так как вывод в моем браузере соответствует ожидаемому.Но когда я смотрю на созданный ProjectDocument, я вижу пустой файл PDF.Я пытаюсь сохранить в файл точно так же, как описано в документации рендеринга.Что я делаю не так?

Ответы [ 4 ]

1 голос
/ 30 апреля 2015

Для меня это работает следующий скрипт для Грааля 2.5.0

        // Render to a file
        //  rendering 2.5.0
        def pdf = new ByteArrayOutputStream().withStream { outputStream ->
            pdfRenderingService.render(
                    [controller:this,
                     template: "printReporte",
                     model: [reporteCufinInstance: reporteCufinInstance, numAnios: columnas]],
                    outputStream // <- in the documentation use the outputstream http://gpc.github.io/grails-rendering/guide/single.html#5.%20Rendering%20To%20The%20Response
            ).toByteArray()   // <- parse to byteArray for render file
        }
        render(file:pdf,contentType: 'application/pdf')

Спасибо, ребята

1 голос
/ 12 января 2013

Немного опоздал с игрой, но примеры в документации вводят в заблуждение.Я также попытался

new File("report.pdf").withOutputStream { outputStream ->
            outputStream << pdfRenderingService.render(template: '/report/report', model: [serial: 12345])
        }

, который создал пустой PDF.Имейте в виду, что это были не нулевые байты - в файле были данные, но это был пустой PDF.Проблема заключается в том, что сигнатура метода берет карту и выходной поток, тогда как в примере это выглядит так:

pdfRenderingService.render(template: '/report/report', model: [serial: 12345])

Это должно быть так:

pdfRenderingService.render([template: '/report/report', model: [serial: 12345]], new File("report.pdf").newOutputStream())

Тогда ваш PDF будет иметь содержимое.

Я думаю, что образец пытается показать сигнатуру метода renderPDF или ... ну, кому все равно нужны образцы, верно?

Надеюсь, это поможет другим.

1 голос
/ 04 ноября 2013

Я перепробовал все вышеперечисленные решения ... но в "toByteArray ()" не хватало одной вещи:

def mypdf = new ByteArrayOutputStream().withStream { outputStream ->
        pdfRenderingService.render(
            [controller:this,
            template: "pdf",
            model:[form:formInstance]],
            outputStream // <- ataylor added this parameter
        ).toByteArray()   // <- I added this
}

Теперь вы можете сохранить его и использовать позже, например:

response.contentType = 'application/pdf'
response.setHeader 'Content-disposition', "attachment; filename=\"${formInstance.name}.pdf\"" // comment this to open in browser
response.outputStream << mypdf
response.outputStream.flush()
1 голос
/ 17 мая 2011

Я думаю, что это ошибка в документации.Передайте свой outputStream в качестве последнего аргумента pdfRenderingService.render.

def savedSummary = new File(summaryName).withOutputStream { outputStream ->
    pdfRenderingService.render( controller:this,
        template: "projectDetail",
        model:[project:project,
              numGoodMilestones:numGoodMilestones,
              totalMilestones:totalMilestones,
              updateHistory: updateHistory],
        outputStream)  // <- added this parameter
}
...