Itext教程翻译
――熊建峰
www.passtwo.com
最近因为项目的事情需要使用pdf进行报表打印,到网上找了很多资料,没有找到太合适的,内容都大同小异,讲得不够细致、系统,无奈,只好到官方网站上去找了,官方网站有教程,只不过时英文的,于是就想翻译过来共大家学习,参考。本人英语水平有限,有很多不妥的地方欢迎大家指正。passtwo@gmail.com
序言
iText是一个可以使开发人员的web应用程序(或者其他java程序)拥有动态生成pdf文档的功能。在本教程里面,你可以通过大量单独的例子来学习iText的大多数功能和特性。他们可以很容易的和大多数的servlet,Java Web Start Application,或者其他java程序。这篇教程并不是完全的,但是以后会定期更新。
l 第一部分:iText的一般应用
l 第二部分:高级对象的使用
l 第三部分:字体
l 第四部分:直接内容
l 第五部分:互动性
l 第六部分:iText工具箱
l 第七部分:RTF
l 第八部分:HTML
l 第九部分:XML
l 第十部分:待续…..
第一部分:iText的一般应用
Hello Word
五步建立一个pdf文档
本节向导
l 五步建立一个pdf文档
l 第一步:Document对象
l 第二步:Writer对象
l 第三步:打开文档
l 第四步:添加内容
l 第五步:关闭文档
示例文件
1. HelloWorld
u 创建一个简单的”Hello World” PDF文件
u 输出结果:
u 使用标准的(默认的)页面尺寸和预先定义的标准页面尺寸创建一个Pdf文件
u 输出结果:
u 创建一个第一页横放第二页竖放的PDF文件。(这是看结果翻译的,原话:Generates a PDF document with the first page in Lanscape; the second page in Portrait)
u 输出结果:
u 使用自定义尺寸和背景色创建一个PDF文件
u 输出结果:
5. Margins
u Margin(也就是上下左右的边距)功能示范
u 输出结果:
u 将PDF输出到System.out
u 输出结果:
u 同时向不同的writers输出;使用pause()和resume()
u 输出结果:
u 又一个“Hello World”PDF文件,不过这次的文件是加过密的,在阅读之前,你需要知道用户密码:Hello
u 输出结果:
u 向PDF文档中添加Metadata(不知道什么意思)
u 输出结果:
五步创建一个PDF文档
在我学习第一门编程语言的时候(在TI-99/ 4A 电脑上运行的BASIC语言),我做的第一个程序就是”Hello World”例子。那是1982年,我那时12岁。现在,我已经20多岁了,但是我仍然写着同一个程序:一个仅仅输出”Hello World”的例子,不过这次不是在那蓝色的屏幕上,而是在一个PDF文件上。
这个例子向你展示了使用iText创建一个新的PDF文档所必须的五个步骤:
² 第一步:创建一个com.lowagie.text.Document:的实例。
Document document = new Document();
² 第二步:创建一个Writer(com.lowagie.text.pdf.PdfWriter的实例),监听这个文档,并且将这个文档输出到你所选择的输出流(OutPutStream)中:
PdfWriter.getInstance(document, new FileOutputStream("HelloWorld.pdf"));
² 第三步:打开这个文档
document.open();
² 第四步:向文档中添加内容
document.add(new Paragraph("Hello World"));
² 第五步:关闭文档
document.close();
java文件下载:com.lowagie.examples.general.HelloWorld
PDf文件:HelloWorld.pdf
下面,我们将详细介绍每一步。
第一步:Document对象
com.lowagie.text.Document类有3个构造函数:
public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize,
int marginLeft,
int marginRight,
int marginTop,
int marginBottom);
第一个构造函数使用PageSize.A4参数调用第二个构造函数。第二个构造函数调用第三个,对每个margin值使用36
PageSize
默认纸张是A4(iText是欧洲的,A4是那里最常用的一种格式),但是为了方便期间,com.lowagie.text.PageSize类也提供了其他一些标准尺寸:A0-A10, LEGAL, LETTER, HALFLETTER, _11x17, LEDGER, NOTE, B0-B5, ARCH_A-ARCH_E, FLSA 等等。
Java文件下载:com.lowagie.examples.general.DefaultPageSize
Pdf文件下载:DefaultPageSize.pdf
大部分的标准尺寸都是PORTRAIT-format(不知道怎样翻译)格式,To create a document in landscape format, just make the height smaller than the width.(不知道怎样翻译,大致意思是要创建一个xx格式的文档,只需要将height设置的比width小就可以了)。所有的标准尺寸都可以使用rotate()函数来进行旋转:
Document document = new Document(PageSize.A4.rotate());
Java文件下载:com.lowagie.examples.general.LandscapePortrait
Pdf文件下载:LandscapePortrait.pdf
当然,并不是说你只局限于这个列表中,你可以使用任何尺寸创建任何你自己想要的页面(尽管Acrobat 3.0最大支持200×200,最小:45×45英寸)。你也可以定义页面的背景颜色。在下面的例子中我们将创建一个有淡黄色背景的又长又窄的文档。
Java文件下载:com.lowagie.examples.general.CustomPageSize
Pdf文件下载:CustomPageSize.pdf
如果你想了解更多,请参考:FAQ.
Margins
在第四步,你将向文档中添加一些内容,如果你使用高级对象,你将不必关心边距和布局的问题,高级对象已经帮助你完成了这些。当然,你首先必须先定义边距,也就是说:如果你希望使用除了36点(半英寸)之外的边距,你可以在向文档里面添加内容之前来改变边距。注意:改变只会在下一页显示出来(译者注:最好在添加内容之前改变),如果你希望边距镜像(奇数页和偶数页),你可以执行这个方法:setMarginMirroring(true).
Java文件下载:com.lowagie.examples.general.Margins
Pdf文件下载:Margins.pdf
如果你想了解更多,请参考:FAQ.
为什么getPagenumber(页码)没有工作?
Document类是关于内容的,不是关于表现的,不同的writers可以监听到同一个Document上,所以,并不能从Document对象获得页码。Document返回那个数呢?到底是PDF文档的页码呢还是HTML文档的页码?提示:你可以从特定的文档对象获得页码,但不是Document对象。
第二步:Writer对象
一旦Document对象被创建,我们可以创建一个或者多个Writer对象来监听这个文档。所有的Writer对象应该是从抽象类com.lowagie.text.DocWriter继承下来的。当前支持三种Writer对象:
PdfWriter
创建PDF(Portable Document Format便携文档格式)文档
RtfWriter
创建RTF文档。关于RTF更多的情况请参阅RTF一节
HtmlWriter
创建Html文档,这个最初是为调试错误写的(参考用iText生成Html文档)
所有的这些Writers都是从DocWriter继承下来的。writer-classes的构造函数是protected(保护型)型的你只能使用静态方法getInstance来获得它的实例:PdfWriter.getInstance, RtfWriter2.getInstance or HtmlWriter.getInstance:
public static xxxWriter getInstance(Document document, OutputStream os) throws DocumentException
注:实际使用时xxx 换成 Pdf, Rtf 或 Html
PdfWriter.getInstance(document, new FileOutputStream("HelloWorld.pdf"));
使你吃惊的或许是“看上去没有创建对象呀”?或许你期望的是这种形式:
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("HelloWorld.pdf"));
实际上,上面两种情况下都有一个Writer对象,但是在简单的应用程序中,你永远不会用到它。
getInstance的第一个参数是我们第一步创建的Document对象,第二个参数可以是任意的java.io.OutputStream对象,在本教程中,我们总是使用java.io.FileOutputStream对象,但是你可以使用ava.io.ByteArrayOutputStream在内存中创建一个PDF文档,或者一个javax.servlet.ServletOutputStream,如果你愿意,你甚至可以将Pdf文件输出到System.out上,(但是看起来不怎么样)如下图:
Java源文件:com.lowagie.examples.general.HelloSystemOut
Pdf文件:HelloWorld.txt
注:你可以使用不同的writer同时监听到同一个文档上,例如:如果你想通过servler直接向浏览器传送一个pdf对象,但是又希望在服务器上保留一个副本,你可以对一个document对象执行两次getInstance方法,不同的仅仅是outputstream对象。
在Ghent University,我们需要将编程的相关信息发布成两个版本,一个是用于网站发布的html文件,另外一个是用来打印的Pdf文件,这可以使用同一段代码来完成,甚至是同一个document对象,区别只是在某些地方,我们暂停PdfWriter,向Pdf文档添加一个从html页面获得的链接,下面的例子可以说明这一点: