grails renderpdf plugin, how does it work?

匆匆过客 提交于 2019-12-13 08:31:27

问题


i´m trying to render PDF with renderpdf grails plugin, but their documentation is very short.

i made a button in my gsp view/file

<button type="button">PDF Me!</button>

and

ByteArrayOutputStream bytes = pdfRenderingService.render(template: "/pdfs/report", model: [data: data])

in a view for binding images

<rendering:inlinePng bytes="${imageBytes}" class="some-class" />

model data is domainInstance and how do i connect the button with this renderpdf?

may be i should more specify my code

def invoice ={
    def vermittlungInstance = Vermittlung.get(params.id)


    def aa = vermittlungInstance.lieferungen.id
    def lieferungInstance = Lieferung.get(aa)

    def bb = lieferungInstance.packete.id // .id
    def packetInstance = Packet.findAllByIdInList(bb)

    if (!vermittlungInstance & !lieferungInstance) {
        flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'vermittlung.label', default: 'Vermittlung'), params.id])}"
        redirect(action: "list")
    }
    else {
        if(vermittlungInstance.rechnungen.id!=null || vermittlungInstance.lieferungen.id!=null || lieferungInstance.packete.id!=null ){
            def a = vermittlungInstance.rechnungen.id
            def rechnungList = Rechnung.findById(a)

            def b = vermittlungInstance.lieferungen.id
            def lieferungList = Lieferung.findById(b)

            def c = lieferungInstance.packete.id
            //println c
            def packetList = Packet.findAllByIdInList(c)//findById(c)

            def d = packetInstance.artikel.id//id
            def artikelList = Artikel.findAllByIdInList(d)//findById(d)

            def e = lieferungInstance.adressen.id
            def adresseList = Adresse.findById(e)

            [vermittlungInstance: vermittlungInstance,
                    rechnungInstanceList:rechnungList,
                    lieferungInstanceList:lieferungList,
                    packetInstanceList: packetList,
                    artikelInstanceList: artikelList,
                    adresseInstanceList: adresseList
            ]



            //System.out.println(c)

        }

        else{

            def rechnungList = Rechnung.all
            def lieferungList = Lieferung.all
            def packetList = Packet.all
            def artikelList = Artikel.all
            def adresseList = Adresse.all

            [vermittlungInstance: vermittlungInstance,
                    rechnungInstanceList:rechnungList,
                    lieferungInstanceList:lieferungList,
                    packetInstanceList: packetList,
                    artikelInstanceList: artikelList,
                    adresseInstanceList: adresseList
            ]
        }



    }

}

this is my def in a controller, i tried to put this renderpdf on many places, but it won't render the page, actually i am changing some values in html (browser), so it should render in html.

the controller seems to be a wrong place to renderpdf than, but there is no render function for .gsp

thanks


回答1:


Add a new action which generates the pdf version of your invoice and link them from your view.

Here is your link:

<g:link action="downloadInvoice" id="${yourInvoiceID}">Download invoice</g:link>

In your controlle add following:

def downloadInvoice = {
    def invoice = Invoice.get(params.id) //replace with your logic

   renderPdf(template: '/templates/pdf/invoice', model: [invoice: invoice], filename: "yourTitle")
} 

Your invoice template is a simple gsp view where you could place all your HTML (including images) and CSS:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <title>Invoice</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <link rel="stylesheet" href="${resource(dir:'css',file:'your.css')}" />        
    </head>
    <body>
        <img src="${resource(dir:'images',file:'invoiceLogo.png')}" />
        <h1>Invoice: ${invoice.id}</h1>
         .
         .
         .
    </body>
</html>    

Hope that example helps!




回答2:


How to add unicode fonts to this plugin ?? unicode characters are not displayed in rendered pdf. The generated pdf contains blank spaces in place of unicode characters, although they are displayed in other gsp pages. later that i tried the below css. but not worked.

@font-face {
  font-family: 'Ubuntu';
  font-style: normal;
  font-weight: 400;
  src:url(http://themes.googleusercontent.com/static/fonts/ubuntu/v4/_xyN3apAT_yRRDeqB3sPRg.woff) format('woff');
  -fs-pdf-font-embed: embed;
  -fs-pdf-font-encoding: UTF-8;
}

body pre{
font-size: 14px;
font-family: 'Ubuntu', Helvetica, Arial, sans-serif;
}

Thank you,



来源:https://stackoverflow.com/questions/11047692/grails-renderpdf-plugin-how-does-it-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!