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 >