Servlet输出PDF文档方法

概述 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没有边框 
datatable.setBorder(Rectangle.NO_BORDER); 
//定义每一列的宽度 
intheaderwidths[] = {10, 30, 15, 15, 5, 5, 5, 5, 5, 5}; 
datatable.setWidths(headerwidths); 
datatable.setWidth(100);

4.字体的定义: 
BaseFont bf = BaseFont.createFont(String name, String encoding, boolean embedded)

“name”为字体名,“encoding”为编码名称。

5. Cell的定义 
Cell cell = new Cell(new Phrase("String string",f));

String为Cell中要显示的内容。另外有很多方法来控制Cell,其中比较常用的几个方法如下:

cell.setBorder(int value)

根据经验,value值对应的边框形状见下图:

图例 Value 整数值 
Rectangle.ALIGN_BOTTOM 6 
Rectangle.ALIGN_BASELINE 7 
Rectangle.ALIGN_CENTER 1 
Rectangle.ALIGN_JUSTIFIED 3 
Rectangle.ALIGN_MIDDLE 5 
Rectangle.ALIGN_RIGHT 2 
Rectangle.ALIGN_TOP 4

cell.setColspan(int value)和 cell.setRowspan(int value)分别定义了cell所占的列和行。

值得注意的是:一行中各cell所占列的总和一定要严格符合构造table时定义的列数。

cell.setHorizontalAlignment(int value)和cell.setVerticalAlignment(int value)分别确定该cell将处在水平及竖直方向上的位置。

最后,将cell加入到table中去:table.addCell(Cell cell)

6.table加到document中去,并关闭document:

document.add(table); 
document.close();

小结 
正如你所读到的,利用iText040编写一个可以输出PDF文档的JavaBean。接着,再通过sevlet将它输出到客户端,相当简单。只要你使用适当的方法,设置正确的MIME类型就可以做到。

时间: 2024-11-03 21:43:56

Servlet输出PDF文档方法的相关文章

PHP制作pdf文档方法

本篇博客是在看完 php+mysql web书以后自己的测试代码,虽然是测试代码,但不是简单的粘贴复制,为了学习thinkPHP框架,自己就用这个来做的,而且这本书已经有年头了.原书的代码中的方法,在查阅手册的时候,很多都已经弃用了,所以分享给大家还是有必要的.php制作pdf文档的方法有很多,我写的只是其中一种,大家有时间可以多看看.好了,进入正题 准备工作: 1.php手册(在线php关于pdf地址: http://php.net/manual/zh/intro.pdf.php ) 2.PD

itextpdf JAVA 输出PDF文档

使用JAVA生成PDF的时候,还是有些注意事项需要处理的. 第一.中文问题,默认的itext是不支持中文的,想要支持,需要做些处理. 1.直接引用操作系统的中文字体库支持,由于此方案限制性强,又绑定了操作系统,所以此处不做实现,有兴趣可在网上搜索看看. 2.引用itext-asian.jar包的字体支持,代码稍后上. 第二.表格中的设置,特别是上中下,左中右,不同的对象有不同的枚举实现,刚入手很容易混淆.其外是前景色,背景色,表格颜色等等. 第三.输出图片,很容易报错.. package com

常用PDF文档开发库

C++库: 1,PDF类库 PoDoFo   http://podofo.sourceforge.net/  PoDoFo 是一个用来操作 PDF 文件格式的 C++ 类库.它还包含一些小工具用来解析.修改和创建 PDF 文 2,Xpdf http://www.foolabs.com/xpdf/download.html   Xpdf是一个开放源代码的PDF档案浏览器,Xpdf 可解码LZW压缩格式并阅读加密的PDF文件 3,PDF生成工具 Poppler http://poppler.free

使用PHP生成PDF文档

原文:使用PHP生成PDF文档 实际工作中,我们要使用PHP动态的创建PDF文档,目前有许多开源的PHP创建PDF的类库,今天我给大家来介绍一款优秀的PDF库,它就是TCPDF,TCPDF是一个用于快速生成PDF文件的PHP5函数包.TCPDF基于FPDF进行扩展和改进,增强了实用功能. 使用PHP生成PDF文档 实际工作中,我们要使用PHP动态的创建PDF文档,目前有许多开源的PHP创建PDF的类库,今天我给大家来介绍一款优秀的PDF库,它就是TCPDF,TCPDF是一个用于快速生成PDF文件

C#生成PDF文档,读取TXT文件内容

using System.IO;using iTextSharp.text;using iTextSharp.text.pdf; //需要在项目里引用ICSharpCode.SharpZipLib.dll和itextsharp.dllpublic string TxtFilePath;public string SavePdfPath;//保存PDF的路径 #region 读取TXT内容        private string ReadXieyi(string FilePath)      

PDF文档的拆分方法,这个方法你了解吗?

PDF文档的拆分方法你知道吗?现在PDF文档使用的较多,但是对于怎么拆分PDF文档还是不清楚,其实想要拆分PDF文档就可以使用迅捷PDF编辑器来进行操作,下面小编就为大家操作一下PDF文档的拆分方法. 操作使用工具:迅捷PDF编辑器 具体操作方法如下: 1:首先我们将PDF编辑器安装到自己的电脑中,打开软件找到打开更多文件,将需要拆分的PDF文件添加到软件中. 2:在软件的顶部可以找到文档,点击文档就会在下面看到拆分文档,点击拆分文档,在软件的界面就会出现一个弹窗. 3:在弹窗中可以找到拆分方式

pdf文档的一些简单编辑方法

如今最常用的办公文档除了Word外,更多的都是使用PDF文档,而且我们可以从各个平台看到PDF文档的身影.但是接触过PDF的人都知道,PDF文档是不能直接编辑的.我们需要专门的pdf编辑软件才能进行,捷速PDF编辑器就是一个非常实用的编辑工具.下面我们来看看具体操作方法吧. 1. 文字的替换与删除 文字的替换与删除最为简单,先将待处理文档在pdf编辑软件打开(打开软件,文件——打开),然后再用鼠标双击需要调整的文字段落.此时,被调整段落将会以编辑框覆盖显示,在这里我们就能像Word一样对选中的文

利用jasperreports报表生成pdf文档中文不能显示问题解决方法

在利用jasperreports5.6.0系列开发工具生成的jrxml格式文件和jasper格式文件的项目中,和pdf中字体有关的jar包有如下两个: iText-2.1.7.js2.jar:iTextAsian.jar. 另外在开始设计jrxml格式文件的时候,要注意选择元素(Text Field,Static Text等)的属性值设置. 利用jasperreports报表生成pdf文档中文不能显示问题解决方法

WPS在线转PDF文档的简单方法

WPS转PDF简单的方法有哪些?我们是怎么在线将WPS文档在线转换成PDF文档的呢?下面小编就来给大家简单的介绍一下.1. 首先我们需要在线转换,打开我们的电脑,在浏览器上搜索迅捷PDF在线转换器.2. 搜索到之后我们就开始点击进入到网站中,我们进入的是PDF在线转换器的网站首页面,我们选择点击文档处理中的WPS在线转PDF.3. 在选择文件进行上传之前我们需要自定义设置,设置原文件格式,页码的选择文件是否被公开,设置好了之后我们进入到文件的选择,我们选择文件进行上传.4. 文件进行选择好之后我