In that case, someone posted how to get HTML from a page for sending email a long time ago. This is what I distilled. I do this in a page, but it doesn't use PageRenderSupport:

                MyPageToRender p = get MyPageToRender();
                p.setSomeParameter(value);

                MarkupFilter filter = new AsciiMarkupFilter();
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                PrintWriter writer = new PrintWriter(bos);

                RequestCycleFactory factory = getRequestCycleFactory();
IRequestCycle cycle = factory.newRequestCycle(getRequestCycle().getEngine());

MarkupWriterImpl mw = new MarkupWriterImpl("text/html", writer, filter);
                DefaultResponseBuilder rb = new DefaultResponseBuilder(mw);

                cycle.activate(p);
                cycle.renderPage(rb);
                
                writer.flush();
                byte [] html = bos.toByteArray();


Norman Franke
Answering Service for Directors, Inc.
www.myasd.com



On Jul 27, 2009, at 4:27 PM, Nathan Beemer wrote:

Unfortunately, I need to render a Page and capture that output to feed into my PDF lib.

And its the rendering to someplace-other-than-the-web browser that is fighting me.

Thanks for your help though!


On Jul 27, 2009, at 3:02 PM, Norman Franke wrote:

Mine is rather long owning to having it create a PDF. In short, I don't use PageRenderSupport since you don't really need it and it's likely usable only by pages, which this isn't. In my case, I'm filling in a form then flattening it (removing the forms, but leaving the filled in data.) Using iText, I get a Reader (which reads PDFs) and then create a Stamper that writes them, and it uses a FileOutputStream to send the data.

If your lib can't use a FileOutputStream, create an ByteArrayOutputStream or copy from a local file (I do that as well for PDFs that just stream out as-is.)

Here is an excerpted part:

public class PDFExport implements IEngineService {

        public static final String MIME_TYPE = "application/pdf";

        private WebResponse response;

        private LinkFactory linkFactory;

        private HttpServletRequest request;
        
        public PDFExport() {
        }
        
        public PDFExport(MapMailbox inMailbox) {
                mailbox = inMailbox;
        }

        public WebResponse getResponse() {
                return response;
        }

        public void setResponse(WebResponse response) {
                this.response = response;
        }

        public LinkFactory getLinkFactory() {
                return linkFactory;
        }

        public void setLinkFactory(LinkFactory linkFactory) {
                this.linkFactory = linkFactory;
        }

        public HttpServletRequest getRequest() {
                return request;
        }

        public void setRequest(HttpServletRequest request) {
                this.request = request;
        }

        @Override
        public void service(IRequestCycle cycle) throws IOException {
                WebResponse w = getResponse();
                ContentType ct = new ContentType(MIME_TYPE);

                String formIdParam = cycle.getParameter("formId");

                // Set special headers to work around a bug in IE with https.
                w.setHeader("Cache-Control", "max-age=0");
                w.setHeader("Pragma", "public");

                Integer formId = Integer.parseInt(formIdParam);
                Form f = FormManager.getForms(true).get(formId);

                // Set the file name of the exported file.
w.setHeader("Content-Disposition", "inline; attachment; filename=" + f.getFileName());
                
Map<String, Object> baseFieldMap = FormManager.getFieldMap(getMailbox(), f);

                servicePdf(f, baseFieldMap, w.getOutputStream(ct));
        }

        /**
         * Output a dynamically modified PDF form.
         *
         * @param f                                     The form to output.
         * @param baseFieldMap          The data to put on the form.
         * @param theOutStream          The stream to output the form to.
         * @throws IOException
         */
public void servicePdf(Form f, Map<String, Object> baseFieldMap, OutputStream theOutStream) throws IOException {
                // Set up an output stream
                OutputStream webOut = theOutStream;
                PdfReader reader = null;
                 FileInputStream fis = new FileInputStream(f.getFile());

                reader = new PdfReader(fis);

                // Write PDF to webOut
                PdfStamper stamp = new PdfStamper(reader, out);
                ...
        }



<service-point id="PDFExport" interface="org.apache.tapestry.engine.IEngineService">
    <invoke-factory model="threaded">
      <construct class="com.myasd.util.PDFExport">
<set-object property="response" value="infrastructure:response"/> <set-object property="linkFactory" value="infrastructure:linkFactory"/> <set-service property="request" service- id="tapestry.globals.HttpServletRequest"/>
      </construct>
    </invoke-factory>
 </service-point>

<contribution configuration- id="tapestry.services.ApplicationServices">
    <service name="PDFExport" object="service:PDFExport"/>
 </contribution>


Norman Franke
Answering Service for Directors, Inc.
www.myasd.com



On Jul 27, 2009, at 3:45 PM, Nathan Beemer wrote:

Sorry, my response wasn't put together very well.

The specific problem I'm having is with the rendering from with my IEngineService.service(IRequestCycle) implementation

The latest problem is with the PageRenderSupport error. I've tried a few different approaches, but they all end up with some Exception thrown during Tapestry's render process.

Would you mind posting your implementation of IEngineService.service(..) ?

Thanks

On Jul 27, 2009, at 2:34 PM, Norman Franke wrote:

I am using an IEngineService. I get an output stream from the response and use that to send the data. I don't know what PD4ML expects, but I'd hope it can take an OutputStream.

Norman Franke
Answering Service for Directors, Inc.
www.myasd.com



On Jul 27, 2009, at 1:49 PM, Nathan Beemer wrote:

I need to have a "Download as PDF" link on some of my pages that will render the given page to PDF and send to client.

I'm not familiar with iText, but everything you said sounds good, except the "blast out the data". My trouble is getting a handle on "the data".

I'm using PD4ML, but I can't hook onto the rendered Tapestry output to pipe into PD4ML.

Are you not using a IEngineService for this?




On Jul 27, 2009, at 10:35 AM, Norman Franke wrote:

I do this for PDF exporting from iText. I inject the (Http) request and (WebResponse) response along with a linkFactory via hivemind.xml. Then WebResponse.setHeader("Content-Description", "inline; attachment; filename=whatever"); Then just blast out the data to getResponse().getOutputStream().

Perhaps PageRenderSupport can't be used in services? What do you need it for?

Norman Franke
Answering Service for Directors, Inc.
www.myasd.com



On Jul 25, 2009, at 11:05 AM, Nathan Beemer wrote:

I want to direct the render of a Page to a specific OutputStream.

Is it possible to do this?


I'm trying to use an IEngineService to accomplish this. Seems I'm close, but getting:

"Component UClients/a requires rendering support, but no PageRenderSupport object has been stored into the request cycle. This object is typically provided by a Body component. You should add a Body component to your template."


I'm injecting RequestGlobals service into my Pages and then doing:

((AbstractMyPage) homePage).getRequestGlobals().store(builder);

But this doesn't seem to be what Tapestry is looking for during the render:

Stack Trace:
org .apache .tapestry .TapestryUtils.getPageRenderSupport(TapestryUtils.java:124) org .apache .tapestry .dojo .form .DropdownDatePicker.renderFormWidget(DropdownDatePicker.java: 120) org .apache .tapestry .dojo .form .AbstractFormWidget .renderFormComponent(AbstractFormWidget.java:66)





---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org


Reply via email to