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类型就可以做到。
Servlet输出PDF文档方法的更多相关文章
- PHP制作pdf文档方法
原文:PHP制作pdf文档方法 本篇博客是在看完 php+mysql web书以后自己的测试代码,虽然是测试代码,但不是简单的粘贴复制,为了学习thinkPHP框架,自己就用这个来做的,而且这本书已经 ...
- itextpdf JAVA 输出PDF文档
使用JAVA生成PDF的时候,还是有些注意事项需要处理的. 第一.中文问题,默认的itext是不支持中文的,想要支持,需要做些处理. 1.直接引用操作系统的中文字体库支持,由于此方案限制性强,又绑定了 ...
- 程序生成word与PDF文档的方法(python)
程序导出word文档的方法 将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob.Apache POI.Java2Word.iText等各种方式,以及使用free ...
- 常用PDF文档开发库
C++库: 1,PDF类库 PoDoFo http://podofo.sourceforge.net/ PoDoFo 是一个用来操作 PDF 文件格式的 C++ 类库.它还包含一些小工具用来解析 ...
- iText框架(生成pdf文档)
1.创建一个itext的简单示例 a.导包(pom.xml文件) <dependencies> <dependency> <groupId>com.lowagie& ...
- 操作PDF文档功能的相关开源项目探索——iTextSharp 和PDFBox
原文 操作PDF文档功能的相关开源项目探索——iTextSharp 和PDFBox 很久没自己写写心得日志与大家分享了,一方面是自己有点忙,一方面是自己有点懒,没有及时总结.因为实践是经验的来源,总结 ...
- C#生成PDF文档,读取TXT文件内容
using System.IO;using iTextSharp.text;using iTextSharp.text.pdf; //需要在项目里引用ICSharpCode.SharpZipLib.d ...
- 使用PHP生成PDF文档
原文:使用PHP生成PDF文档 实际工作中,我们要使用PHP动态的创建PDF文档,目前有许多开源的PHP创建PDF的类库,今天我给大家来介绍一款优秀的PDF库,它就是TCPDF,TCPDF是一个用于快 ...
- (实用篇)使用PHP生成PDF文档
http://mp.weixin.qq.com/s?__biz=MzIxMDA0OTcxNA==&mid=2654254929&idx=1&sn=8715d008d19af70 ...
随机推荐
- 使用gm和imageMagick处理图片
第一步安装imageMagick和gm模块 1, cnpm install --save imageMagick gm 第二步在服务器上安装imageMagick,下载地址http://www.ima ...
- Android各版本代号、版本号、API/NDK级别、发布时间及市场份额
Android各版本代号.版本号.API/NDK级别.发布时间及市场份额 代号 版本号 API/NDK级别 发布时间 - O 8.0 API level 26 2017-3-21 牛轧糖 Nougat ...
- Fluent UDF【5】:第一个UDF
这里以一个简单的初始化案例来描述UDF的使用过程. 0 Fluent中的Patch Fluent中提供了全域初始化以及局部Patch功能.对于整体区域的全局初始化可以采用starndard及hybri ...
- scala future
https://docs.scala-lang.org/overviews/core/futures.html https://docs.scala-lang.org/overviews/index. ...
- 用NPOI创建Excel、合并单元格、设置单元格样式、边框的方法
本篇文章小编为大家介绍,用NPOI创建Excel.合并单元格.设置单元格样式.边框的方法.需要的朋友参考下 今天在做项目中,遇到使用代码生成具有一定样式的Excel,找了很多资料,最后终于解决了,Ex ...
- (原创)拨开迷雾见月明-剖析asio中的proactor模式(二)
在上一篇博文中我们提到异步请求是从上层开始,一层一层转发到最下面的服务层的对象win_iocp_socket_service,由它将请求转发到操作系统(调用windows api),操作系统处理完异步 ...
- [转] lua 获取本地当月天数
亲测,无误. 原文传送门:lua 获取本地当月天数 开发中有用到,记录一下. local year,month = os.date("%Y", os.time()), os.dat ...
- 使用PyHive操作Hive
使用PyHive操作Hive 废话 搜了一下,看到了StackOverFlow的回答,试了一下前两个方案,感觉第二个更简洁,这里记录一下,更详细的见参考. 安装依赖 pip install sasl ...
- Linux下烧写工具DNW和USB驱动安装(一)
转:http://blog.csdn.net/zhengmeifu/article/details/8837930 Linux下编译记录:编译PC端USB驱动和写入工具dnw_linux.tgz压缩包 ...
- 【机器学习】EM的算法
EM的算法流程: 初始化分布参数θ: 重复以下步骤直到收敛: E步骤:根据参数初始值或上一次迭代的模型参数来计算出隐性变量的后验概率,其实就是隐性变量的期望.作为隐藏变量的现估计值: ...