Isn't it possible to create a dynamic WEB resource the generates your XML
and then feed this XML to Big Faceless PDF library for creating the PDF? And
them stream back the PDF? I haven't used that library myself but I guess
that would be possible??

Best,

Ernesto

On Tue, Feb 23, 2010 at 8:30 AM, Geir Eilertsen <geir.eilert...@gmail.com>wrote:

> I'm using Big Faceless PDF library to generate a PDF from a dynamic
> Wicket Page which renders XML.
>
> I have tried different approaches, but the only one I get to work is by
> plugging a filter into the app using:
>
> getRequestCycleSettings().addResponseFilter(new
> FacelessResponseFilter());
>
> filter code:
>
> public class FacelessResponseFilter implements IResponseFilter
> {
>        static
>        {
>                ReportParser.setLicenseKey("SOME KEY");
>        }
>
>        @Override
>        public AppendingStringBuffer filter(AppendingStringBuffer
> responseBuffer)
>        {
>                if (responseBuffer.indexOf("big.faceless.org") == -1)
>                {
>                        return responseBuffer;
>                }
>                ReportParser parser = null;
>                try
>                {
>                        parser = ReportParser.getInstance();
>                }
>                catch (SAXException e)
>                {
>                        e.printStackTrace();
>                }
>                WebRequestCycle requestCycle = (WebRequestCycle)
> RequestCycle.get();
>                BufferedWebResponse wr = (BufferedWebResponse)
> requestCycle.getWebResponse();
>                wr.setAttachmentHeader("pdfFile.pdf");
>                wr.setContentType("application/pdf");
>                InputSource is = new InputSource(new
> StringReader(responseBuffer.toString()));
>                OutputStream out = wr.getOutputStream();
>                is.setSystemId("/");
>                PDF parse;
>
>                try
>                {
>                        parse = parser.parse(is);
>                        parse.render(out);
>                }
>                catch (IOException e)
>                {
>                        e.printStackTrace();
>                }
>                catch (SAXException e)
>                {
>                        e.printStackTrace();
>                }
>                return new AppendingStringBuffer();
>        }
> }
>
> Page code:
>
> public class CountryListXMLPage extends Page
> {
>        private boolean stripTagsSettingBeforeThisPageLoad;
>
>        public CountryListXMLPage()
>        {
>                add(new ListView<Country>("countryList", new
> CountryListModel())
>                {
>                        private static final long serialVersionUID = 1L;
>
>                        @Override
>                        protected void populateItem(final ListItem<Country>
> listItem)
>                        {
>                                listItem.add(new Label("name",
> listItem.getModelObject().getName()));
>
>                                Region region =
> listItem.getModelObject().getRegion();
>                                listItem.add(new Label("region.name",
> region == null ? "" :
> region.getName()));
>
>                        }
>                });
>        }
>
>        @Override
>        protected void onBeforeRender() {
>                stripTagsSettingBeforeThisPageLoad =
> Application.get().getMarkupSettings().getStripWicketTags();
>
>  Application.get().getMarkupSettings().setStripWicketTags(true);
>                super.onBeforeRender();
>        }
>
>
>        @Override
>        protected void onAfterRender() {
>
>
> Application.get().getMarkupSettings().setStripWicketTags(stripTagsSettingBeforeThisPageLoad);
>                super.onAfterRender();
>        }
>
>        @Override
>        public String getMarkupType()
>        {
>                return "xml";
>        }
>
>        class CountryListModel extends
> LoadableDetachableModel<List<Country>>
>        {
>                private static final long serialVersionUID = 1L;
>
>                @Override
>                protected List<Country> load()
>                {
>                        SolidApplication app =
> (SolidApplication)SolidApplication.get();
>                        return app.getDomainService().getCountries();
>                }
>        }
>
> }
>
> I have a Link loading this page and get the PDF download OK, but since
> the filter hijacks the OutputStream, I get the error:
>
> [ERROR,WebResponse,http-8080-1] Unable to redirect
> to: ?wicket:interface=:2::::, HTTP Response has already been committed.
> [ERROR,WicketFilter,http-8080-1] closing the buffer error
> java.lang.IllegalStateException
>        at
>
> org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)
>        at
>
> javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:136)
> ...
>
>
> Does anyone know about a better way to do what I'm trying here?
>
> Geir
>

Reply via email to