新闻资讯 | 控件产品 | 技术文章 | 购物车 | 合作伙伴 | 问题解答 | 电子简报 | PDF论坛 | 资源下载
您现在的位置:技术文章>PDF开发篇 首页|PDF应用篇|PDF开发篇|解决方案

iText PDF概述(1)

发布日期:2006-12-21 作者:Bruno Lowagie 出处:吴晓明 kfc@seu.edu.cn 东南大学

一篇介绍 iText-PDF 技术的文章

 

作者:Bruno Lowagie     翻译:吴晓明 kfc@seu.edu.cn   东南大学

作者简介:Bruno Lowagie教授是比利时根特大学( Ghent University )的教授,是 iText  的创始人。

 

      当人们问我靠什么谋生时,我常常犹豫着该如何回答。最简单的答案莫过于“我在根特大学工作”。那当然是真的。不过,实际上,我更愿意这么回答,我是一个免费/开源软件开发人员。我曾很多次尝试这么回答,然而每次都会随之蹦出更多的问题。免费软件? 

     那么你如何谋生?再者,你开发什么软件?我也尽量明确地说:“我是 iText 的创始人,它是一个免费的 JAVA-PDF 库。”这样的回答并没有使听者明白,反而让他们更加困惑。什么是库(library)?它是不是可供下载、并且可以在本机运行 PDF ,是不是一种在我的浏览器里面开启 Adobe Reader 的东西?问题是如此多,这让我难以用片言只语来解释清楚。因此,我就选择写这篇文章来介绍一下我的工作。

    PDF

      首先,让我们来看一看 PDF , 即便携式文档格式( Portable Document Format )。当你在网上碰到一个 PDF (或者与 PDF 相关)的文档,你就需要一个查看应用程序( Viewer application ),比如 Adobe Reader 、Ghostview 、 Preview 或者 Foxit 。 PDF 之所以被称之为便携式,是因为一个 PDF 文档可以在任何平台上查看和打印,比如: UNIX 、 Mac 、 Windows 、 Linux 、 Palm OS 等等不一而足。与 JAVA 所宣称的“一朝编写,天下运行”类似,你也可以说 PDF 是“一朝书写,四海阅读”(但是这种方式,显然要比 JAVA 诱人耳膜的广告词承诺更加可靠)。当我谈论 PDF 文档时,我很可能需要你设想的是一个“传统的” PDF 文件:一份只读的标了页码的文件,并且该文件已经设定好了打印布局(也就是说,打印出来的效果就是屏幕上显示的样子,即所见即所得),但这仅仅是 PDF 功能的冰山一角。在 PDF 内部,深藏着更多的功能特性。一个 PDF 文件可以包含多媒体、书签、各种各样的链接、动作和标注。可以将它加密,可以用口令保护,或者是添加一个数字签名。一个 PDF 文件还可以包含交互式表单( form ),有时称之为 AcroForm 。一个 AcroForm 是一个域( field )集合。通过交互的方式,这些域用来收集用户信息。它们也常常表现为占位符,配以固定的坐标,供填充不同的内容。此外还有表单数据格式( Forms Data Format , FDF )和 XML 版本的 FDF (XFDF )。FDF 文件和 XFDF 文件包含一个键( key )、值( value)集合,还有一个指向某个 PDF 文件的引用。如果你打开一个 FDF 文件或 XFDF ,那么包含该表单的 PDF 文件就会随之打开,并且自动填充内容。很多工具(包括 iText )都可以合并 PDF 表单和它的 FDF 数据。

PDF/X - PDF/A
      
     有很多种方法可以创建完全有效的 PDF 文件。这种自由是一把双刃剑,既是优点也是缺点。并非所有有效的 PDF 文件都可以在任何上下文中便于使用。尤其是印前部门(prepress sector,也有人翻译成制版部门,听起来更好听一点)需要限制格式的时候。于是,制版公司就组成了一个协会,并合力发布了一套 PDF/X 规范( X 表示交换)。 PDF/X 是一套 ISO 标准集合,它描述了定义完备的 PDF 规范子集,该套规范确保能够创建可预知的、一致性 PDF 文档。最近(2005年9月),另外一套 ISO 规范也出版了: PDF/A ( A 表示存档)。对于存档来说,目前有很多种电子格式(ASCII、 TIFF 、 PDF 、 XML 等等)和技术(数据库、容器等等),选择面很宽。然而,这些格式的特性本质也是其中的最大缺点:它们不能保证长期有效性。比如:如果你用最新版本的 MS WORD 打开10年前的 word 文档,你不会看到与它十年前相同的显示结果。与绝大多数文字处理格式不同的是, PDF 文件可以不用原始版本的应用程序就可以查看。此外,所有针对 PDF 规范的修订都是向后兼容的。比如:如果你的查看器可以阅读和打印一个1.6版本 PDF 文件,那么它也可以阅读1.2版本的 PDF 文件。而且,有关这种文件格式的信息一直存在于公共领域。任何人、在任何地点、在任何时间、使用任何硬件或者软件都可以创建程序来访问 PDF 文档。 PDF/A 和 PDF/X 引起的约束是相似的。我就不往下深入细节了,但是这些约束包括:所有的字体必须是嵌入式的、不允许加密、禁止声音和视频等等。对于 PDF/A 而言,每一个存档的文件自我编制也是非常重要的。你必须通过一种可靠的方式来搜索和查找文档。这就是为什么 PDF/A 文件使用 XMP 。XMP 是 Adobe 公司的可扩展元数据平台( Extensible Metadata Platform )的缩写。它是一种创建、处理和交换元数据的标准格式。(注意, XMP 不仅仅限于 PDF 格式。)

          

PDF 文件的内部

PDF 不是一个简单文本流(像RTF 文件),也不是一个程序(像 PostScript 文件)。它是一个对象的集合,从中你要知道精确的磁盘偏移量( disk offset),这样就可以在 offset 后面写上一条索引。下面就是一张图片,从中你可以看到由 iText 产生的一个 PDF 输出,并写入了 System.Out 。如果你想重新生成它,只需要修改其中一个 Hellp Word 样例中获得 PdfWriter 的那一行代码:

 PdfWriter.getInstance(document, System.out);

     实际的 PDF 文件从%PDF-1.4开始,在 %%EOF结束。由 obj endobj 包括的部分正是 PDF 对象,这在 PDF 参考中有描述(由 Adobe Systems Inc. 提供)。在 xref 之后, trailer 之前的部分是交叉引用表,里面包括了该 PDF 的所有对象。

      


       
      图1,一个写入 System.out 的 PDF 文件
      
       PDF
有一些鲜为人知的功能。我希望你能够理解 PDF 是一种真正灵活方便的格式,它具有广泛的可能性。我与 PDF 结缘是否仅仅是一种巧合?我不知道。它就是这样开始的。iText 开始于1998年,当时根特大学正在发起一个移植项目,希望重新设计一整套独立程序供学生管理部门( Student Administration )使用。我受聘于重新设计现有的(胖客户端)软件,将它改成基于 Java Servlet Web 应用程序(瘦客户端)。在这个项目里面,涉及到了非常多的文档:课程和学生的成绩表、评议报告、档案记录等等。那时,你不能依靠 HTML 来打印美观优雅的文档,尤其是不能让这些文档看上去显得比较“官方”。因此,在没有充分认识到后果之前,我向老板承诺:我自己要生成 PDF 。我当时认为网上会有非常充足的免费软件或开源软件。不幸的是,我测试过所有的库,没有哪一个可以满足我们的需要。如果要信守承诺,就必须自己写库文件。这就是 iText 诞生的过程。我用了大约6个星期写完第一个版本。这个初始库于19993月份在网上发布,尽管当时还没有很多人了解,但是那些使用 iText 的人们的确让我在开发的时候从中获益良多。比如,我在根特(比利时))从上午9点开始工作,然后下午5点发布“我今天的工作”。其中有一个在加拿大的 iText 用户,在工作日的时候,这位同僚在我第二天工作开始之前就为我完成了一份完整的 bug 报告。因此换言之,通过将它开源化,这个库被日夜连续不断改进。逐渐地, iText 越来越强大。自从1999年以来,成百上千的人为之贡献代码。 Paulo Soares 就是一个主要的贡献者(也是 iText 的官方合作开发者)。 Mark Hall 负责 RTF 包。目前,我暂时处理该库有关文档的事务。事实上,我正在为 Manning Publications co. 写一本关于 iText 的书。它是“实践( in Action )”系列书籍的出版商。我希望我能够在2006年夏天能够完成“iText in Action”。在这本书里,我将尽力覆盖尽可能多的功能。这不是个简单的任务,因为 iText 是一个非常庞大的库,而且人们在许多不同的方面使用它。

 

高层对象

 

从头开始创建一个 PDF 文档需要5个步骤:

 1)创建一个 document

 2)获得一个 writer 实例,它将文档所有的特定语法写入一个输出流,

 3)打开这个 document

 4)向 document 添加内容,

 5)关闭文档。

 Document document = new Document(); // 步骤 1 try {

 PdfWriter.getInstance(document, // 步骤 2

 new FileOutputStream("HelloWorld1.pdf")); // "

 document.open(); // 步骤 3

 document.add(new Paragraph("Hello World")); // 步骤 4

 } catch (Exception e) {

 System.err.println(e.getMessage());

 }

 document.close(); // 步骤 5

          实现步骤43种不同的方法。最简单的一种是使用 iText 的高层对象。在这个例子当中,我用了一个 Paragraph 对象;一个文档可以由多种结构和对象组成:列表( List ListItem )、超链接(Anchor)、表格( PdfPTable Table 或者 SimpleTable)、图形(Image)、列( ColumnText 或者 MultiColumnText )等等。在这本书里,你将会看到这些对象的“实践(in action)”。




图2,使用 iText 生成一篇文章

相关文章:

发布人:管理员 【报告错误】·【推荐好友】·【打印文章】
相关评论 本文现有 0 条评论 评分人数: 0 平均分: 0
相关评论
用户名: 密  码:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
注意:请不要在评论中含与内容无关的广告链接,违者封ID
文章搜索
推荐文章
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
热门点击
一个简单的PDF文件结构的分析(22465)
PHP的FDF文档支持(16188)
用C#制作PDF文件全攻略(13631)
Word转换PDF格式的C#或(12147)
pdfMaker文章:PDF加(11644)
ITextRenderer学习(11214)
PDF文件加密仿真(11057)
怎样用iReport制作Web(10413)
iText PDF概述(1)(9923)
循序渐进学习iTextShar(9873)
热门评论
从pdf文档中提取出文本(8)
PDFlib开发:创建超文本元(2)
客户端自动打印PDF(Prin(2)
浅谈PDFlib中文输出(一)(2)
xml的转换之pdf 2 ((1)
xml的转换之pdf 1 (x(1)
PDF知识讲座(1)(1)
PDFBox使用简介(1)
使用正则表达式计算PDF文档的(1)
word转pdf(1)