概述 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" );
(二)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来确定保存文当时的建议名称。
(三)封装非 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:
分享到:
相关推荐
这篇内容将深入探讨如何在Java中进行PDF到JPEG的转换,以及可能遇到的问题及其解决方案。 首先,我们需要一个库来处理PDF和图像转换。Apache PDFBox和iText是两个广泛使用的开源库,但在这个场景下,我们更倾向于...
### Java打印PDF文件及批量打印实现 #### 一、引言 在企业级应用开发中,经常需要处理各种文档操作,其中包括PDF文件的打印。Java作为一种广泛应用的企业级开发语言,提供了多种方式来实现这一功能。本文将详细...
Java 实现 HTML 转 PDF 的解决方案 Java 实现 HTML 转 PDF 的解决方案是指使用 Java 语言将 HTML 页面转换为 PDF 文档的技术方案。本解决方案通常用于生成 PDF 报表、证书、合同等需要保留固定格式的文档。 在本...
项目中遇到此需求,网上搜罗各种资料,都没有100%解决问题,要么丢字符,要么格式错乱,要么乱码,潜心攻克几天,终于找到完美方案,现分享给各位同仁; 基于apache pdfbox库实现Java PDF转图片,带源码和pom文件;...
本资源“JAVA报表解决方案源码”正为那些需要在Java环境中开发报表功能的开发者提供了宝贵的参考资料。 首先,我们要了解Java报表的基本概念。报表通常涉及从数据库或其他数据源获取数据,然后将这些数据以结构化的...
基于Apache Tomcat的一站式Java应用服务器解决方案,包括系统整体架构设计以及监控运维管理平台Open Tomcat的构建。Open Tomcat通过松散耦合的方式对各应用节点进行管理,并集成了开源监控工具PsiProbe,同时为了...
9. **多平台兼容性**:Java的跨平台特性使得PDF转图片的解决方案可以在Windows、Linux和Mac OS等多种操作系统上运行。 10. **实战示例**:下面是一个使用Apache PDFBox进行PDF转图片的简单代码示例: ```java ...
首先,当然是找到能够解析PDF的完美组件,百度和谷歌不约而同的告诉我们。IText是王道。而目前开源的组件中,Itext的确是一个First Choice,如果各位单纯是做把图片转成PDF或者自己写了Velocity或者FreeMarker模板...
在这个"doc转pdf终极解决方案demo"中,我们将会看到如何利用Aspose.Words的Java API在两种操作系统上实现这个功能。 首先,让我们了解一下为什么需要将DOC转换为PDF。DOC是Microsoft Word的默认格式,而PDF...
"java pdf方案测试"这个项目就是针对这一需求提供的一种解决方案。在这个项目中,主要涉及到的技术包括Flyingsaucer和iText,它们是Java领域常用的两个库,用于将HTML转换为PDF。 首先,让我们了解一下Flyingsaucer...
在Java编程环境中,将Excel文件转换为PDF文件是一项常见的任务,尤其在数据报告或文档格式转换的场景下。本文将详细介绍如何使用Apache POI库处理Excel数据,以及使用iText库将这些数据导出为PDF格式。Apache POI是...
在这个项目中,我们主要探讨了利用iTextPDF和PDFBox两个库在Java环境下如何进行PDF电子签名的实现。 iTextPDF是一个流行的Java库,专门用于创建、修改和处理PDF文档。它的电子签名功能强大,支持创建、验证和添加...
Java批量压缩图片格式的PDF档(源码Demo) 适用:仅针对纯图片型的pdf(类似扫描版)进行压缩 原理:压缩图片然后再另存成新文件 实例如下: ├── META-INF │ └── MANIFEST.MF ├── pom.xml └── src ├...
总的来说,这个“Java pdf转换Txt文本demo”提供了一个基础但实用的解决方案,适用于那些希望在Java环境中快速将PDF转换为文本的开发者。通过使用Apache PDFBox库,你可以轻松地处理PDF文档,无论是进行文本分析、...
若要处理这种情况,可能需要寻找其他解决方案,如使用支持这类元素的第三方库,或者在转换后手动添加水印和图章。 后端代码通常会涉及接收PDF文件,执行转换操作,然后返回结果图像。这可能涉及到文件上传、文件...
"AI数字员工解决方案" AI数字员工解决方案是一种基于人工智能技术的解决方案,旨在帮助金融机构实现业务流程的自动化和数字化。该解决方案通过数字员工的应用,实现了生产力的数字化,提高了业务流程的自动化程度,...
为了实现一个完整的Java CEB转PDF解决方案,除了上述代码之外,还需要考虑错误处理、多线程支持、批量转换等功能。同时,确保转换后的PDF可以正确建立全文索引,可能需要对生成的PDF进行额外的处理,例如提取文本并...