概述 Java Servlet 编程可以很方便地将 HTML 文件发送到客户端的 Web 浏览器。然而许多站点还允许访问非 HTML 格式的文档,包括 Adobe PDF、Microsoft Word 和 Micorsoft Excel 等。事实上这些非 HTML 格式只要能用 MIME 类型表示,就可以利用 servlet 来发送。本文将以 PDF为例,向你介绍如何使用 servlet 传送非 HTML 格式文件及该文件是如何在服务器端用Java生成的。

你只要将文件写到servlet 的输出流中,就可以利用 servlet 在浏览器中打开一个文件。首先从获得 servlet 的输出流开始:

ServletOutputStream out = res.getOutputStream();



互联网上使用 MIME (multipurpos Internet mail extension 多目的互联网邮件扩展协议)来传送混合格式、多媒体和二进制数据文件。如果要在 servlet 的 response 对象中打开某个文档,就必须设置该文档的 MIME 类型。

向Web客户端发送PDF文档
(一)MIME类型
Web 浏览器使用 MIME 类型来识别非 HTML 文档,并决定如何显示该文档内的数据。将插件 (plug-in) 与 MIME 类型结合使用,则当 Web 浏览器下载 MIME 类型指示的文档时,就能够启动相应插件处理此文档。某些 MIME 类型还可以与外部程序结合使用,浏览器下载文档后会启动相应的外部程序。

MIME 类型非常有用。它们允许 Web 浏览器处理不同格式的文档,却不需要事先嵌入相关知识。Java Servlets 可以使用 MIME 类型来向浏览器传送非 HTML 文件,比如 Adobe PDF 和 Micorsoft Word。使用正确的 MIME 类型能够保证这些非 HTML 文件被正确的插件或外部程序显示。

PDF 文件的 MIME 类型是 "application/pdf"。要用servlet 来打开一个 PDF 文档,需要将 response 对象中 header 的 content 类型设置成 "application/pdf":

// PDF 文件的 MIME 类型 
res.setContentType( "application/pdf" ); 
//也可以通过下面的方式来设置response.setHeader("Content-type", "application/pdf");


(二)Content disposition
HTTP response header中的content-disposition 允许 servlet 指定文档表示的信息。使用这种header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。如果没有指定,则对话框中就会出现 servlet 的名字。在 servlet 中,你需要将 header 设置成下面这样:

res.setHeader("Content-disposition", 
"attachment; filename=" + 
"Example.pdf" ); 
// attachment -因为不希望在浏览器中直接打开它,而是利用Adobe Acrobat。 
// 可以通过设置default file name来确定保存文当时的建议名称。 
//response.setHeader("Content-Disposition", "inline; filename=report.pdf");


(三)封装非 HTML 文档
完成上述工作后,剩下的就非常简单了。你需要根据待传送文件的名字,创建一个 java.net.URL 对象。交给 URL 构造器的字符串必须是指向该文件的一个有效 URL 地址。在这里,我要打开本地的PDF文档:

String fileURL = "http://localhost/aboutadobe/careeropp/pdfs/tables.pdf;



URL 字符串也可以类似于 http://www.gr.com/pub/somefile.doc 或 http://www.gr.com/pub/somefile.xls。但必须确保待传送文件类型与先前在 HTTP response 对象中设置的 MIME 类型一致。

(四)其他
开始阅读传送的文档之前,首先要从 URL 对象中获得输入流 InputStream,用 BufferedInputStream 将 InputStream 封装起来。

BufferedInputStreambis = newBufferedInputStream(url.openStream());



一旦你完成上述操作,就只要简单地将 InputStream 中的字节,写入到 servlet 的输出流 OutputStream 中:

BufferedOutputStreambos = new BufferedOutputStream(out); 

byte[] buff = new byte[2048]; 
intbytesRead; 

// 一个简单的读写循环 
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) { 
bos.write(buff, 0, bytesRead); 
}




在最后的代码块中,关闭这些流 ,如:bos.close();

PDF文档在服务器端的生成
利用iText040工具包可以很方便的输出一个十分漂亮的PDF文档。

1.Document的创建

Document document=new Document(p0, p1, p2, p3, p4)


其中,p0为页面的大小,如 PageSize.A4; p1?p4分别描述上下左右页边空白。

2. 构造复写器

PdfWriter.getInstance(document, new FileOutputStream("tables.pdf"))



执行程序后,将在当前目录下生成一个名为tables.pdf的文件。

接着打开Document:document.open()

3. 根据需要定义一个Table

//一个拥有十列的Table 
Table datatable = new Table(10); 
//定义Cell与Cell之间的距离为零 
datatable.setCellpadding(0); 
//定义Cell的间隔 
datatable.setCellspacing(3); 
//使Table