I wrote a small servlet that went through PDF's byte by byte sending them to the 
output stream.  It also looked for default values in PDF form fields and replaced them 
with parameters sent in by the request.  Here's a slice of the code, but it's the part 
that loads the PDF file.  The actual writing of the bytes to the OutputStream occurs 
in fillTemplateFileWithValues(), a portion of which is below.

        public void doGet( HttpServletRequest req, HttpServletResponse res )
               throws ServletException, IOException
        {
                res.setContentType( "application/pdf" );

                try {
                        InputStream template = 
getServletContext().getResourceAsStream( processPath(req) + ".pdf" );
                        OutputStream custom = res.getOutputStream();

                        PDFConverter convert = new PDFConverter( template, custom, 
buildParameterMap(req) );
                        convert.fillTemplateFileWithValues();
                        res.setContentLength( convert.getBytesSent() );

                        template.close();
                        custom.close();
                } catch ( FileNotFoundException fnfe ) {
                        fnfe.printStackTrace();
                } catch ( SecurityException se ) {
                        se.printStackTrace();
                } catch ( InvalidStreamException ise ) {
                        ise.printStackTrace();
                }
        }

This is the loop that outputs the PDF bytes that are definitely not going to be 
replaced.  Another loop looks for strings to replace.

while ( !inString && (lastByteRead != EOF) ) {
        try {
                lastByteRead = templateFile.read();
        } catch (IOException ioe) {
                ioe.printStackTrace();
                lastByteRead = EOF;
                break;
        }

        // If we hit EOF, get out of this loop.
        // The others will take care of themselves.
        if( lastByteRead == EOF ) {
                break;

        // Found the start of a string
        } else if( lastByteRead == '(' ) {
                inString = true;
        }

        try {
                convertedFile.write( lastByteRead );
                bytesSent = bytesSent + 1;
        } catch (IOException ioe) {
                ioe.printStackTrace();
                lastByteRead = EOF;
                break;
        }
}

You could probably do this a lot simpler because you aren't replacing any PDF content, 
but this code's worked well for me.  I don't know if it will solve your problem, 
though.  It certainly doesn't stream it on a one-page-at-a-time basis, and it wouldn't 
display for us until we called setContentLength().  Of course, if you know that ahead 
of time (we can't for replacing), then you might luck out.

Hope that helps...

Tim

>>> [EMAIL PROTECTED] 11/14/01 03:59PM >>>
Yes.  It's not only possible, but support for it is built in to most modern
web servers.

The PDF has to be "optimized" for byte-serving and the web server has to be
capable of byte-serving.

So my question remains.  Anyone out there done it or know how to configure
Tomcat 4 to do it?

-T

-----Original Message-----
From: Chris Tucker [mailto:[EMAIL PROTECTED]] 
Sent: Wednesday, November 14, 2001 5:48 PM
To: Tomcat Users List
Subject: RE: Byte Serving PDF's


Is this even possible?  From my understanding of the PDF format, it is
inherently random-access and relies on the entire file being available
before it can be displayed.

-----Original Message-----
From: MacDonald, Todd [mailto:[EMAIL PROTECTED]] 
Sent: Wednesday, November 14, 2001 2:24 PM
To: 'Tomcat Users List'
Subject: RE: Byte Serving PDF's


The PDF's are pre-existing.  I need to "byte serve" them (for page-at-a-time
access via the Acrobat Reader plug-in in the client's browser).

Currently we have a servlet that reads the file and streams the whole thing
back.  Some of the PDF's are quite large (13 megs).  This means that the
user has to wait until all 13 megs are received before s/he can view it.

Byte-serving solves that problem, I just don't know how to do it.

-T

-----Original Message-----
From: Jim Urban [mailto:[EMAIL PROTECTED]] 
Sent: Wednesday, November 14, 2001 4:54 PM
To: Tomcat Users List
Subject: RE: Byte Serving PDF's


Do you want to dynamically generate the PDF on the fly and return it
directly to the browser or to simply "serve" PDF files?  If you want to do
the first, check out the FOP website and have a look at the FOPServlet
source code.  This assumes you can make the contents of the PDF available in
XML format for processing by FOP.

Jim

-----Original Message-----
From: MacDonald, Todd [mailto:[EMAIL PROTECTED]] 
Sent: Wednesday, November 14, 2001 1:53 PM
To: Tomcat-User (E-mail)
Subject: Byte Serving PDF's


Anyone know how (or better yet, have some code to) byte serve PDF's through
Tomcat 4?

-T

--
To unsubscribe:   <mailto:[EMAIL PROTECTED]>
For additional commands: <mailto:[EMAIL PROTECTED]>
Troubles with the list: <mailto:[EMAIL PROTECTED]>



--
To unsubscribe:   <mailto:[EMAIL PROTECTED]>
For additional commands: <mailto:[EMAIL PROTECTED]>
Troubles with the list: <mailto:[EMAIL PROTECTED]>

--
To unsubscribe:   <mailto:[EMAIL PROTECTED]>
For additional commands: <mailto:[EMAIL PROTECTED]>
Troubles with the list: <mailto:[EMAIL PROTECTED]>


--
To unsubscribe:   <mailto:[EMAIL PROTECTED]>
For additional commands: <mailto:[EMAIL PROTECTED]>
Troubles with the list: <mailto:[EMAIL PROTECTED]>

--
To unsubscribe:   <mailto:[EMAIL PROTECTED]>
For additional commands: <mailto:[EMAIL PROTECTED]>
Troubles with the list: <mailto:[EMAIL PROTECTED]>


--
To unsubscribe:   <mailto:[EMAIL PROTECTED]>
For additional commands: <mailto:[EMAIL PROTECTED]>
Troubles with the list: <mailto:[EMAIL PROTECTED]>

Reply via email to