在Web应用中动态创建PDF文件

量子密钥分发(QKD)原理、工程实现与实战部署全解析 密钥分发是信息安全的核心基础,它解决了通信双方如何安全共享秘密密钥的难题。传统方法依赖于数学问题的计算复杂性,而量子密钥分发(QKD)则基于量子力学原理,为密钥分发提供了信息论安全的物理保障。其核心价值在于,利用量子不可克隆定理和测量坍缩原理,使得任何窃听行为都会被合法通信方检测到,从而在理论上实现无条件安全的密钥协商。这项技术特别适用于对安全性要求极高的场景,如金融数据同步、政务专网和电力系统保护。本文聚焦于量子保密通信,深入剖析了以BB84协议为代表的QKD工作原理,并详细拆解了包含单光子探测、偏振编码 阅读详情
 1.iText类库
         http://www.lowagie.com/iText/
        iText是一个创建和处理PDF文档的开源纯Java类库。Bruno Lowagie和Paulo Soares领导着这个项目。IText API能让Java开发人员以编程的方式创建PDF文档。iText提供了很多的特性:

        支持PDF和FDF文档
        各种页面尺寸
        横向和竖向布局
        页边距
        表格
        断字
        页头
        页脚
        页码
        条形码
        字体
        颜色
        文档加密
        JPEG,GIF,PNG和WMF图片
        有序和无序列表
        阴影
        水印
        文档模板

        iText是一个开源库。在写本文的时候,iText可以在两个许可协议下使用:Mozilla Public License和LGPL。如果想了解详细信息,请参考iText站点。在本文中,你将会看到iText API的应用。我们将阐述如何在服务器端应用中使用iText和servlet动态生成PDF文档。

2、开始(Getting Started)

        首先,你需要一个iText Jar文件。访问iText站点并下载最新的版本。在写本文时,最新的版本是使0.99。iText站点提供了API文档和一个全面的指南。

        除了iText,我们还要用servlet.如果你不熟悉servlet,你可以通过Jason Hunter的书《Java Servlet Programming》来学习它。你需要一个J2EE应用服务器或可以独立运行的servlet引擎。开源软件Tomcat,Jetty和Jboss是不错的选择。下文假设你使用的是Jakarta Tomcat 4.1。

        iText API简单易用。通过使用iText,你能创建自定义的PDF文档。iText库由下边的一些包组成:

        
         com.lowagie.servlets
com.lowagie.text
com.lowagie.text.html
com.lowagie.text.markup
com.lowagie.text.pdf
com.lowagie.text.pdf.codec
com.lowagie.text.pdf.hyphenation
com.lowagie.text.pdf.wmf
com.lowagie.text.rtf
com.lowagie.text.xml
com.lowagie.tools
        

为了生成PDF文件,你只需要com.lowagie.text和com.lowagie.text.pdf两个包。

我们的例子使用了这些iText类:

        
         com.lowagie.text.pdf.PdfWriter
com.lowagie.text.Document
com.lowagie.text.HeaderFooter
com.lowagie.text.Paragraph
com.lowagie.text.Phrase
com.lowagie.text.Table
com.lowagie.text.Cell
        

关键的类是Document和PdfWriter。在创建PDF文档时,你将经常使用这两个类。Document是PDF文档基于对象的描述。你可以通过调用Document类提供的方法往文档中加入内容。PdfWriter对象通过java.io.OutputStream对象与Document关联在一起。

 

3、在Web应用中使用iText

        在设计阶段,你必须决定如何使用iText。我们使用了下边的技术开发了我们的Web应用。

        1.A技术

        在服务器文件系统上创建PDF文件。应用使用java.io.FileOutputStream把文件写到服务器文件系统上。用户通过HTTP GET方法下载该文件。

        2.B技术

        使用java.io.ByteArrayOutputStream在内存中创建PDF文件。应用通过servlet的输出流将该PDF文件字节发送到客户端。

        由于应用不需要把文件写到文件系统上,这样能保证在集群服务环境中能正常工作,所以我更倾向于使用B技术。如果你的应用运行在集群环境中且服务器集群不提供会话亲和的功能,A技术可能会导致失败。

        3、例子:PDFServlet

        我们的例子应用由一个类组成:PDFServlet。这个servlet采用B技术。输出流OutputStream是java.io.ByteArryOutputStream。用ByteArrayOutputStream,PDF文档字节将存储在内存中。

        当PDFServlet接收到一个HTTP请求时,它将动态地生成一个PDF文档并将该文档发送到客户端。PDFServlet类扩展了javax.servlet.http.HttpServlet类并导入了两个iText包:com.lowagie.text和com.lowagie.text.pdf。

        doGet方法

        大多数servlet覆盖了doPost和doGet方法中的一个方法。我们的servlet没有什么不同。PDFServlet类覆盖了doGet方法。该servlet将在接收到HTTP GET请求后生成一个PDF文件。

        在核心部分,servlet的doGet方法做了如下的工作:

        1.创建一个包含PDF文档字节的ByteArrayOutputStream对象;

        2.在reponse对象上设置HTTP响应头内容;

        3.得到servlet输出流;

        4.把文档字节写到servlet的输出流中;

        5.刷新servlet输出流;

        generatePDFDocumentBytes方法

        generatePDFDocumentBytes方法负责创建PDF文档。在这个方法中三个最重要的对象是Document对象,ByteArrayOutputStream对象和PdfWriter对象。PdfWriter使用ByteArrayOutputStream关联Document。

        
         Document doc = new Document();
ByteArrayOutputStream 
baosPDF = new ByteArrayOutputStream();
PdfWriter docWriter = null;
docWriter = PdfWriter.getInstance(doc, baosPDF);
// ...
用add方法把内容添加到Document中。
doc.add(new Paragraph(
    "This document was
	created by a class named: "
    + this.getClass().getName()));

doc.add(new Paragraph(
    "This document was created on "
+ new java.util.Date()));
        

当你添加完内容后,要关闭Document和PdfWriter对象。

        
         doc.close();
docWriter.close();
        

当关闭文档后,ByteArrayOutputStream对象返回到调用者。

        
         return baosPDF;
        

ByteArrayOutputStream包含了PDF文档的所有字节。

HTTP响应头

在这个应用中,我们仅仅关注四个HTTP 响应头:Content-type,Content-disposition,Content-length,和Cache-control。如果你从没有使用过HTTP头,请参考HTTP 1.1规范。

研究在PDFServlet中的doGet方法,你会注意到要在任何数据写到servlet输出流之前设置HTTP响应头内容,这是很重要的,也是细微的一点。让我们更详细地说明一下每个响应头的含义。

Content-type

在servlet中,HttpServletResponse有一个表明响应所包含内容类型的参数。对PDF文件而言,内容类型是application/pdf。如果servlet没有设置类型,web浏览器很难决定如何处理这个文件。

PDFServlet用下边的代码设置内容类型:

        
         resp.setContentType("application/pdf");
        

Content-disposition

Content-disposition头提供给浏览器确定HTTP响应内容的信息。当浏览器读到这些头信息后,它能确定:

HTTP响应包含一个文件;

包含在响应中的文件名;

该文件是显示在浏览器主窗口中还是要用外部的应用查看;

RFC 2183中有对Content-disposition头完整的解释。

通过合适地设置Content-disposition的值,servlet能指示浏览器是“内嵌”显示文件还是把它当作附件处理。

例1.内嵌显示一个文件

        
         Content-disposition: inline;
filename=foobar.pdf
        

例2.往response里附加一个文件

        
         Content-disposition: attachment;
filename=foobar.pdf
        

下边的伪码说明了如何设置头信息:

        
         public void doGet(HttpServletRequest req,
HttpServletResponse resp)
{
    // ... 
    resp.setHeader(
        "Content-disposition",
        "inline; filename=foobar.pdf" );
    // ... 
}
        
        Cache-Control

        根据你应用的特性不同,你可以让浏览器缓存或者不缓存你正在生成的PDF文件。服务器端应用可以有很多种HTTP 头来控制内容缓存。下边是一些例子:
        
         Cache-Control: no-cache 
 
Cache-Control: no-store 
 
Cache-Control: must-revalidate 
 
Cache-Control: max-age=30 
 
Pragma: no-cache
        
Expires: 0
关于Cache-Control头的全面解释见HTTP 1.1规范。
PDFServlet把Cache-Control设置为max-age=30。这个头信息告诉浏览器缓存这个文件的最长时间为30秒。
Content-length
Content-length头必须设置成PDF文件中字节的数值。如果Content-length没有设置正确,浏览器可能不能正确地显示该文件。下边是例子代码:
 
        
         ByteArrayOutputStream 
baos = getByteArrayOutputStream();
resp.setContentLength(baos.size());
        
把PDF文档送到Web浏览器
PDFServlet通过把字节流写到servlet的输出流的方式把PDF文档送到客户端。它通过调用HttpServletResponse对象的getOutputStream方法来获得输出流。getOutputStream方法返回一个javax.servlet.ServletOutputStream类型的对象。
 
       
        ServletOutputStream sos;
sos = resp.getOutputStream();
baos.writeTo(sos);
sos.flush();
       
在把所有的数据写到流之后,调用flush()方法把所有的字节发送到客户端。
打包和部署
为了在Tomcat中运行PDFServlet,你需要把应用打包在WAR文件中。iText JAR文件(itext-0.99.jar)必须放在WAR文件的lib目录下边。如果你忘了把iText JAR文件打包进去,servlet会报一个java.lang.NoClassDefFoundError的错误并停止运行。
运行应用
在WAR文件部署之后,你已经准备好了测试servlet了。Jakarta Tomcat在8080端口上监听请求。
在浏览器中请求 http://hostname:8080/pdfservlet/createpdf。servlet将会执行并返回浏览器一个PDF文档。
 
4、iText之外的方案
iText提供了许多产生PDF文档的底层API。然而,它不是对任何应用都有效。在我的日常工作中,我结合Microsoft Word和Adobe Acrobat使用iText。首先,我们的团队使用Microsoft Word设计了一个出货表单。之后,我们用Acrobat把Word文档转换成PDF文档。然后,我们使用iText的模板的功能,我们把PDF文件装入到我们的应用中。从这里,把数据填入表格和输出最终的PDF文档是相当容易的。对基于报表的Web应用,像JasperReports这样的工具,它提供了比iText更高层次的抽象。
【通信协议】GATT 与 BLE HID 工作原理详解 详细介绍BLE HID 跟GATT工作原理与两者的交互关系 阅读详情

相关推荐

英伟达笔试1

本文摘要: 使用NAND2门设计4位奇偶校验发生器,通过15个NAND2门实现4输入异或功能,分三级结构完成奇校验计算。 时序分析公式总结: 建立时间约束:T_cq + T_comb(max) + T_setup + T_skew ≤ T_clk 保持时间约束:T_cq + T_comb(min) + T_skew ≥ T_hold 提供了两段路径的具体时序检查公式和建立违规修复方法 分析32位粘滞累积寄存器Verilog代码: 功能:记录输入数据中出现过的所有1位 每个bit独立实现,复位清零,有效输入时

soulermax的博客 166

关于 com.lowagie.text 报错的问题

首先项目中没有加入com.lowagie.text的依赖(非maven项目看lib目录有没有itext.jar包),需要自己添加相应jar包或依赖, 到maven repositury下载lowagie相关的jar包是需要注意版本信息, 第一次下载的5.5.13版本的,jar包提示是com.itextpdf..xxxx,和项目需要的com.lowagie.text不对,重新搜索lowagie之后发现还有其他版本 重新选择下载次数最多的2.1.7的包导入后显示的是com.lowagie.text..

qq_26582185的博客 5945

(一)ANSYS WORKBENCH实践入门

ANSYS-workbench 有限元分析应用基础教程 (张晔)学习笔记

qq_51767372的博客 1万+

PDF生成工具类(copy 代码直接可用)

import java.awt.Color; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.StringWriter; ...

hxwjilin的博客 1974

MIT 18.03 微分方程 ODE 学习笔记分享——目录

从B站上看到了MIT 微分方程的课程,觉得老爷子讲的真好! 其实微分方程对于工科来说相当重要,但是很多学习也仅把他放在高数里作为单独的一个章节来讲,这是远远不够的。所以对于同学们来说 ,一定要认真听讲,做好笔记! 以下是我的个人学习比较分享。有需要的同学可以做一个参考。 注:个人认为笔记的作用是用来回想起课堂所讲的内容(细节),所以我的笔记风格为以老师讲课思路为准,板书为辅。建议刚开始听这门课的同...

weixin_40664094的博客 2628

浅谈Android MVI架构---大自然的搬运工~~~

浅谈 Android MVI架构

hong_world的博客 2154

总结之使用lowagie.text添加PDF水印

引入依赖 <!-- pdf水印 --> <dependency> <groupId>com.lowagie.text</groupId> <artifactId>com.springsource.com.lowagie.text</artifactId> <version>${com.lowagie.text.version}</version> </dependency

IManiy的博客 4102

AF3 ProteinDataset类的_patch方法解读

AlphaFold3 protein_dataset模块 ProteinDataset 类  _patch 方法的主要目的是围绕锚点残基(anchor residues)裁剪蛋白质数据,提取一个局部补丁(patch)作为模型输入。

qq_27390023的博客 1147

如何在WEB应用中动态创建PDF文件

如何在WEB应用中动态创建PDF文件时间: 2006-04-22 12:55:33 | [ [>>] 作者:itzealot 发文时间:2006.04.18 来源:赛迪博客  在一个最近的后勤项目中,客户要求我们建一个能让用户能从一个遗留系统查询出货信息的Web站点,有三个主要的需求:  1.出货信息必须以PD

hcx_2008的专栏 999

基于STM32F334C8T6的四开关Buck-Boost双向DC-DC电源设计与实现(附源码、仿真与计算书)

本文详细介绍了基于STM32F334C8T6的四开关Buck-Boost双向DC-DC电源设计方案。该设计利用STM32的高分辨率定时器(HRTIM)实现精确PWM控制,支持Buck、Boost和Buck-Boost三种工作模式自动切换,具备双向能量流动能力。通过PSIM仿真和Mathcad计算书进行参数优化,实测效率达95.8%,适用于新能源系统和电池管理等场景。

www00的博客 525

【SpringBoot 3.x 第56节】再见 Feign?原生 HTTP 接口强势上位,这才是微服务调用的正确姿势!

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1017

在WEB应用中动态创建PDF文件

在一个最近的后勤项目中,客户要求我们建一个能让用户能从一个遗留系统查询出货信息的Web站点,有三个主要的需求:   1.出货信息必须以PDF文档的格式返回;   2.PDF文件必须能通过浏览器下载;   3.PDF文件必须能用Adobe Acrobat Reader阅读;   尽管我们的团队有很多J2EE Web应用的开发经验,但在PDF文档处理上却没有多少经验。我们需要找一个能在服务器端...

Marky616379799的博客 205

Yield Management软件:Lam Research二次开发_(5).缺陷分析与分类方法

在半导体制造过程中,缺陷分析和分类是提高良率管理(Yield Management)的关键步骤。通过准确地识别和分类缺陷,可以更好地理解工艺过程中的问题,从而采取有效的措施来提高生产效率和产品质量。本节将详细介绍缺陷分析和分类的方法,包括缺陷检测、特征提取、分类算法及其在Lam Research软件中的应用。

2401_87715305的博客 690

java jsp动态生成pdf_在Web应用中动态创建PDF文件

在Web应用中动态创建PDF文件原文:SeanC.Sullivan翻译:gagaghost在一个最近的后勤项目中,客户要求我们建一个能让用户能从一个遗留系统查询出货信息的Web站点,有三个主要的需求:1.出货信息必须以PDF文档的格式返回;2.PDF文件必须能通过浏览器下载;3.PDF文件必须能用AdobeAcrobatReader阅读;尽管我们的团队有很多J2EEWeb应用的开...

weixin_39525300的博客 299

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

在Web应用中动态创建PDF文件(转载…

原文:SeanC.Sullivan翻译:gagaghost在一个最近的后勤项目中,客户要求我们建一个能让用户能从一个遗留系统查询出货信息的Web站点,有三个主要的需求:1.出货信息必须以PDF文档的格式返回;2.PDF文件必须能通过浏览器下载;3.PDF文件必须能用AdobeAcrobatReader阅读;尽管我们的团队有很多J2EEWeb应用的开发经验,但在PD...

gzc_870301的博客 518

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

在Web应用中动态创建PDF文件-Java基础-Java-编程开发

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/javascript"

java专栏 1302

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

itext学习笔记

在Web应用中动态创建PDF文件 原文:Sean C. Sullivan    翻译:gagaghost   在一个最近的后勤项目中,客户要求我们建一个能让用户能从一个遗留系统查询出货信息的Web站点,有三个主要的需求:   1.出货信息必须以PDF文档的格式返回;   2.PDF文件必须能通过浏览器下载;   3.PDF文件必须能用Adobe Acrobat Reader阅读;

Hello World! 2727

java操作ptf文档

(网上资料) package **.**.**.action; import java.awt.Color; import java.io.FileOutputStream; import java.util.Random; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Htt...

mahualei的专栏 181

Itext笔记1

在Web应用中动态创建PDF文件 原文:Sean C. Sullivan    翻译:gagaghost   在一个最近的后勤项目中,客户要求我们建一个能让用户能从一个遗留系统查询出货信息的Web站点,有三个主要的需求:   1.出货信息必须以PDF文档的格式返回;   2.PDF文件必须能通过浏览器下载;   3.PDF文件必须能用Adobe Acrobat Reader阅读; 尽管我们的团队...

moon_vv 187
上一篇: 纯java的Excel解决方案
下一篇: Oracle数据库中分区表的操作方法
潇湘紫琅
博客等级 码龄24年 6粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值