Hi,
Can anyone please help me with displaying the
multipage tiff in PDF? I spent so much time on this
but still stuck by this.
I tried to use JAI to get each page from a multipage
tiff image and then use FOP and XSL to display all the
pages. But it always displayed the first page(even if
I just want to display second page, or third page by
setting pageNumber). This tiff image has total 3
pages. My servlet did display 3 pages but they are all
same content from the first page. I think something
wrong with my JAI part, but I just cannot see where
the problem is. Can anyone please take a look at
following codes for me? Many thanks in advance.
Jerry
*********************************************
//main servlet
private void DisplayImage(HttpServletResponse res,
HttpServletRequest
req, byte[] bt){
SeekableStream tiffStream =
SeekableStream.wrapInputStream(new
ByteArrayInputStream(bt), true);
//how many pages in one tiff
int pageNumber =
TIFFDirectory.getNumDirectories(tiffStream);
TIFFDecodeParam decodeParam = new TIFFDecodeParam();
decodeParam.setDecodePaletteAsShorts(true);
ImageDecoder tiffDecoder =
ImageCodec.createImageDecoder("tiff", tiffStream,
decodeParam);
ByteArrayOutputStream out = new
ByteArrayOutputStream();
Driver driver = new Driver();
driver.setLogger(log);
driver.setRenderer(Driver.RENDER_PDF);
File xsltfile = new
File("C:/workspace/ViewImage/Web
Content/html/Tiff2Pdf.xsl");
res.setContentType("application/pdf");
driver.setOutputStream(out);
//Setup XSLT
TransformerFactory factory =
TransformerFactory.newInstance();
Transformer transformer =
factory.newTransformer(new StreamSource(xsltfile));
for (int p = 0; p < pageNumber; p ++) {
String
GetByteStreamServletURL="http://localhost:9080/Download/GetByteStreamForSpecifiedPage?"
+ req.getQueryString() + "&pageNumber=" + p;
//*assign ByteArrayInputStream bais to image
variable in xsltfile
transformer.setParameter("image"+ p,
GetByteStreamServletURL);
}
try {
//Resulting SAX events (the generated
FO) must be piped through to FOP
Result result = new
SAXResult(driver.getContentHandler());
//Start XSLT transformation and FOP
processing
transformer.transform(new
StreamSource("c:/temp/DummyXML.xml"), result);
byte[] content = out.toByteArray();
res.setContentLength(content.length);
res.getOutputStream().write(content);
res.getOutputStream().flush();
} finally {
out.close();
}
} catch (Exception ex) {
//throw new ServletException(ex);
}
}
//Below the snippet of GetByteStreamForSpecifiedPage
servlet which to return a byte stream associated with
specific page
private void
sendByteStreamResponse(HttpServletResponse res,
HttpServletRequest
req, byte[] bt,
String
sContTypeHeader,
String
sEncodingHeader, String encoding) {
byte[] ImageByteData=null;
int
p=Integer.parseInt(req.getParameter("pageNumber").trim());
if (p >= 0) {
try{
SeekableStream tiffStream =
SeekableStream.wrapInputStream(new
ByteArrayInputStream(bt), true);
TIFFDecodeParam decodeParam = new TIFFDecodeParam();
decodeParam.setDecodePaletteAsShorts(true);
ImageDecoder tiffDecoder =
ImageCodec.createImageDecoder("tiff", tiffStream,
decodeParam);
RenderedImage tiffPage =
tiffDecoder.decodeAsRenderedImage(p);
bt=(byte[])tiffPage.getSources().elementAt(0);
}catch (Exception ex) {
//throw new ServletException(ex);
}
}
res.addHeader("Expires", "Wed, 26 Feb 1970
08:21:57 GMT");
res.addHeader("Cache-Control", "no-cache");
res.setContentType("image/tiff");
OutputStream out = null;
res.setContentType(sContTypeHeader);
if (encoding == COMPRESS_TYPE_NONE) {
if (sEncodingHeader != null) {
res.setHeader("Content-Encoding",
sEncodingHeader);
}
res.setContentLength(bt.length);
out = res.getOutputStream();
out.write(bt);
//out.write(ImageByteData);
}
}
__________________________________
Do you Yahoo!?
Yahoo! Tax Center - File online by April 15th
http://taxes.yahoo.com/filing.html
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]