Ok, below the code I use to create a link that allows to download pdf file
created by jasper on runtime. Hope it helps. Do not hesitate to ask
questions.


public class PdfGenerateLink extends ResourceLink<Void> {

    public PdfGenerateLink(final String id, final IModel<Bid> model, final
PdfBuilderFromBidCreator creator) {

        super(id, new WebResource() {
            @Override
            public IResourceStream getResourceStream() {
                IResourceStream resourceStream = new
AbstractResourceStreamWriter() {

                    public void write(OutputStream output) {
                        try {
                            generate(output, model.getObject());
                        } catch (Exception e) {
                            throw new RuntimeException(e);
                        }
                    }

                    private void generate(OutputStream output, Bid bid)
throws Exception {
                        PdfOfertaDocumentBuilder pdf = creator.create(bid);
                        InputStream generate = pdf.generate();
                        byte[] buffer = new byte[1024];
                        while (generate.read(buffer) != -1) {
                            output.write(buffer);
                        }
                        generate.close();
                    }

                    public String getContentType() {
                        return "application/pdf";
                    }
                };

                return resourceStream;
            }

            @Override
            protected void setHeaders(WebResponse response) {
                super.setHeaders(response);
                response.setCharacterEncoding("UFT-8");
                response.setHeader("Expires", "0");
                response.setHeader("Cache-Control", "no-cache");
                response.setHeader("Cache-Control", "must-revalidate,
post-check=0, pre-check=0");
                response.setHeader("Pragma", "public");

response.setAttachmentHeader(model.getObject().getPublicTask().getName().replace("
", "_") + ".pdf");
            }
        });
        add(createImage("icon", "pdficon16.png"));
    }
}

On Tue, Oct 18, 2011 at 8:43 PM, Jim Pinkham <pinkh...@gmail.com> wrote:

> Paul,
>
> I am doing something very similar - I'd be interested to know more about
> how you got this working - here is what I've got that works for now, but I'm
> not real happy with it:
>
> In my report forms, I have buttons like this:  (details about params
> omitted - nothing fancy there)
>
>             add(new MyReportResourceButton("pdf", new
> ReportResource("MyReport", new PdfResourceHandler()), paramsModel));
>             add(new MyReportResourceButton("xls", new
> ReportResource("MyReport", new XlsResourceHandler()), paramsModel));
>
> (So it will load MyReport.jasper that was compiled and put into resources
> folder by maven plugin during build)
>
> MyReportResourceButton has this:
>     @Override
>     public final void onResourceRequested() {
>         Map<String,Object> params = paramsModel.getObject();
>         resource.setReportParameters(params);
>         super.onResourceRequested();
>     }
>
> and it's superclass MyResourceButton has this:
>     @Override
>     public void onSubmit() {
>         onResourceRequested();
>     }
>
>     /**
>      * @see org.apache.wicket.IResourceListener#onResourceRequested()
>      */
>     public void onResourceRequested()
>     {
>         Attributes a = new Attributes(RequestCycle.get().getRequest(),
> RequestCycle.get()
>             .getResponse(), null);
>         resource.respond(a);
>     }
>
>
> At runtime, it basically works, however, it gives me this annoying message
> in my logs multiple times per report request after the report has been
> served and it appears to be trying to just stay on the same page:
>
> 2011-10-13 15:22:42,381 [http-80-12] ERROR
> org.apache.wicket.DefaultExceptionMapper - Unexpected error occurred
> java.lang.IllegalStateException: Header was already written to response!
>     at
> org.apache.wicket.protocol.http.HeaderBufferingWebResponse.checkHeader(HeaderBufferingWebResponse.java:64)
>     at
> org.apache.wicket.protocol.http.HeaderBufferingWebResponse.sendRedirect(HeaderBufferingWebResponse.java:112)
>     at
> org.apache.wicket.request.handler.render.WebPageRenderer.redirectTo(WebPageRenderer.java:136)
>     at
> org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:261)
>     at
> org.apache.wicket.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:139)
>     at
> org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:717)
>     at
> org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:63)
>     at
> org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:96)
>     at
> org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:212)
>     at
> org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:253)
>     at
> org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:160)
>     at
> org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:216)
>
> Could you tell me if there is some way this differs from how you (or your
> contractor) are doing it?
>
> Thanks,
> -- Jim.
>
> On Tue, Oct 18, 2011 at 3:58 AM, Paul Szulc <paul.sz...@gmail.com> wrote:
>
>> yeah, ok, my bad
>>
>> resources where under src/main/resource not src/main/resource*s*
>> *
>> *
>> thx Tor
>>
>
>


-- 
Best regards,
Paul Szulc

http://www.paulszulc.com

Reply via email to