iText入门基础教程

huzh_68

贡献于2011-09-14

字数:7568 关键词: iText PDF工具包

 iText入门教程 用iText生成常用的pdf iText是一个非常著名的能够快速产生PDF文件的Java类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合、著名的Spring也采用iText作为生成PDF的解决方案。 wanghetommy@163.com 2011-5-12 目 录 一、 iText简介 4 1) What is iText®? 4 二、 搭建iText环境 6 1) 环境准备 6 2) 几个基础的类的含义 6 三、 用iText进行PDF操作 7 1) 经典的hello word. 7 2) 给pdf来点颜色 9 3) 设置阅读器参数 10 4) 给文档设置密码和权限 13 5) 解决中文的问题 16 6) 总结: 18 教程版本 说明 作者 0.9 内部培训入门级教程、此教程仅仅作为入门理解之用、不做深入研究。若做深入研究、建议阅读itext.in.action 这本书 wanghe 一、 iText简介 1) What is iText®? 如果你在需要创建PDF的一系列操作,你将使用像Adobe Acrobat 或者Adobe InDesign这样的桌面图形设计工具去手动或者半自动的创建一个文档。 另一种情况, PDF文档是利用软件应用提供的API自动创建的、不需要或者最小化地依赖人工介入。有一些场景是文档先被创建成一些其他的格式、例如:html、xml,然后再转换成PDF.这些不同方式的需求可能需要不同的软件工具。类似的情况发生在操作PDF,你可能用Adobe Acrobat更新PDF,但是也有工具可以使你将数据库形式的数据去增加内容。 iText 就是一个专注于自动化方面的工具。 iText是一个PDF的类库 iText是提供了一组API,允许开发人员做一下的事情:(不仅仅局限以下、还有更多可以做的) · 从xml或者数据库生成文档或者报表。 · 制作绘图和书籍,开拓很多PDF中的交互特性 · 在现有的PDF中增加书签,页码,水印,和其他特性 · 切分或者整合存在的PDF文件 · 填写互动表格 · 在WEB浏览器中提供动态生成和操作PDF的服务 iText 不是最终用户的工具.你必须将iText搭建在你自己的应用中,这样你可以进行PDF的一系列操作了. 功能预览 下图罗列出了你可以用iText进行的操作: iText支持的功能 iText部分支持的功能 iText主要的作用是创建和操作PDF文档 当前最新版本:5.1.0 项目官方网站:http://itextpdf.com/ 下载地址: http://cdnetworks-kr-2.dl.sourceforge.net/project/itext/iText/iText5.1.0/itext-5.1.0.zip 二、 搭建iText环境 1) 环境准备 · MyEclipse8.5 · 下载iText最新jar包 · 新建一个javaProject、将iText.jar导入classPath、这样就可以用iText进行PDF开发了。 2) 几个基础的类的含义 名称 解释 PdfWriter 书写器、用于往document中写入信息。 Document 一个PDF文档组件。 Chunk 文本块、这是可以写入文档的最小的组件。 Phrase 短语、由一系列Chunk组成。 paragraph 段落、有一系列的Phrase或者Chunk组成。 TableWrapper 表格、处理简单表格的组件 PdfPTable 表格、处理复杂表格的组件 Image 图形处理组件 Rectangle 代表几何图形组件、可以通过此组件设置背景色、边框等样式,类似html里的Box BaseColor 定义颜色组件、预装了很多常用颜色 三、 用iText进行PDF操作 1) 经典的hello word. 说明: 生成一个PDF、内容为Hello word! Code: 1.新建Class HelloItext、在main方法中: ------------------------------------------------------------------------------------------ //新建一个文档 Document document = new Document(); try { //建立一个书写器(Writer)与document对象关联 PdfWriter.getInstance( document,new FileOutputStream("D:\\helloworld.pdf")); //打开一个文档 document.open(); //向文档中添加文字:hello world! document.add(new Paragraph("hello world!")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); }finally{ document.close(); } 运行-输出: 在D盘可看见生成了一个helloworld.pdf文件: 打开helloworld.pdf、可看见里面显示了文字hello world! (局部截图) 2) 给pdf来点颜色 说明: 基于第一个例子代码基础上、给文档设置背景颜色、边框、外边距 Code: 1.新建Class ColorItext、在main方法中: ------------------------------------------------------------------------------------------ //定义一个A4大小的矩形组件 Rectangle rect = new Rectangle(PageSize.A4); //设置背景色为浅灰色 rect.setBackgroundColor(BaseColor.LIGHT_GRAY); //设置border类型为box(四周都有) rect.setBorder(Rectangle.BOX); //设置border颜色为深灰色 rect.setBorderColor(BaseColor.DARK_GRAY); //设置border宽度为5 rect.setBorderWidth(5); //创建一个文档,将rect作为预设的样式传入,后面的10,10,10,10是文档的外边距 Document document = new Document(rect,10,10,10,10); try { PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf")); document.open(); document.add(new Paragraph("hello world!")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); }finally{ document.close(); } 运行-输出: 打开helloworld.pdf-有颜色了吧 3) 设置阅读器参数 说明: 基于第一个例子代码基础上、设置阅读器的参数 Code: 1.新建Class WriterItext、在main方法中: ------------------------------------------------------------------------------------------ Document document = new Document(); try { PdfWriter pdf = PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf")); /** * PdfWriter.PageModeUseThumbs:显示缩略图 * PdfWriter.PageLayoutTwoColumnLeft:双列显示,奇数页在左 * PdfWriter.HideMenubar:隐藏阅读程序的菜单 */ pdf.setViewerPreferences(PdfWriter.PageModeUseThumbs|PdfWriter.PageLayoutTwoColumnLeft|PdfWriter.HideMenubar); document.open(); document.add(new Paragraph("hello world!")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); }finally{ document.close(); } 运行-输出: 打开helloworld.pdf 设置阅读器参数的一些静态变量含义 类型 静态变量名 作用 页面 布局 PdfWriter.PageLayoutSinglePage 同时只显示一个页面 PdfWriter.PageLayoutOneColumn 单列显示 PdfWriter.PageLayoutTwoColumnLeft 双列显示,奇数页在左 PdfWriter.PageLayoutTwoColumnRight 双列显示,奇数页在右 页面 模式 PdfWriter.PageModeUseNone 既不显示大钢也不显示缩略图 PdfWriter.PageModeUseOutlines 显示大纲 PdfWriter.PageModeUseThumbs 显示缩略图 PdfWriter.PageModeFullScreen 全屏模式,没有菜单、windows控件或者其他任何windows可见控件 PdfWriter.HideToolbar 当文档激活时,是否隐藏阅读程序(如Adobe Reader)的工具条 PdfWriter.HideMenubar 当文档激活时,是否隐藏阅读程序的菜单 PdfWriter.HideWindowUI 当文档激活时,是否隐藏阅读程序的界面元素,如滚动条、导航条等,而仅仅保留文档显示 PdfWriter.FitWindow 是否调整文档窗口尺寸以适合显示第一页 PdfWriter.CenterWindow 是否将文档窗口放到屏幕中央 全屏 PdfWriter.NonFullScreenPageModeUseNo 既不显示大钢也不显示缩略图 模式下页面布局 ne PdfWriter.NonFullScreenPageModeUseOutlines 显示大钢 PdfWriter.NonFullScreenPageModeUseThumbs 显示缩略图 4) 给文档设置密码和权限 说明: 基于第一个例子代码基础上、设置文档的密码和权限 注意若需要加密则必须导入bcprov-jdk16-1.44.jar这个包下载地址为: http://mirrors.ibiblio.org/pub/mirrors/maven2/org/bouncycastle/bcprov-jdk16/1.44/bcprov-jdk16-1.44.jar Code: 1.新建Class EncryptionItext、在main方法中: ------------------------------------------------------------------------------------------ Document document = new Document(); try { PdfWriter pdf = PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf")); /** * 第一个参数是设置userPassword为123 * 第二个参数是设置ownerPassword为1234 * 第三个参数设置user的权限可以复制、可以打印 * 第四个参数设置加密类型 */ pdf.setEncryption(new byte[]{'1','2','3'},new byte[]{'1','2','3','4'},PdfWriter.ALLOW_COPY|PdfWriter.ALLOW_PRINTING , PdfWriter.STANDARD_ENCRYPTION_40); document.open(); document.add(new Paragraph("hello world!")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); }finally{ document.close(); } 运行-输出: 打开helloworld.pdf 弹出窗口要求输入口令,输入123 打开PDF后、查看文档属性: 可以看出只有打印和内容复制是被允许操作的 设置文档权限相关静态变量含义 下列表列出了文档许可参数设置的含义,不过要注意,如果你用40bit进行加密,那么标注为128bit的会自动的被禁止,如果你想要取消这些许可,你必须用128bit进行加密,显而易见,用128bit进行加密提供了更高的安全级别。 静态变量名 作用 标注 PdfWriter. ALLOW_ASSEMBLY 插入、删除、旋转页面、加入书签的允许。内容不能被改变、除非PdfWriter. 128bit ALLOW_MODIFY_CONTENTS设置了许可 PdfWriter. ALLOW_COPY 拷贝或者提取文本或者图像的许可 PdfWriter. ALLOW_DEGRADED_PRINTING Printing the document, but not with the quality offered by PdfWriter.Allow-Printing. 128bit PdfWriter. ALLOW_FILL_IN 填充表单域许可 128bit PdfWriter. ALLOW_MODIFY_ANNOTATIONS 填写注释许可 PdfWriter. ALLOW_MODIFY_CONTENTS 修改内容许可,比如改变页面内容、或者插入删除页面 PdfWriter. ALLOW_PRINTING 允许打印文档 PdfWriter. ALLOW_SCREENREADERS Extracting text and graphics for use by accessibility devices. 128bit FAQ:如果你想取消拷贝或者保存PDF文件的许可,这样是很难做到的,你不能使abode reader的Save(Save as)命令取消,这不是iText的bug,而是PDF本身带来的安全问题,如果你真想这么做的话,你必须利用digital rights management(数字版权加密保护技术)作为解决方案,有许多这样的技术提供者,但是这些工具是相当昂贵的。 5) 解决中文的问题 说明: 由于itext默认是不支持亚洲文字的,如果要想使用中文,则必须在应用中应用亚洲语言包(itext-asian.jar),我们基于第一个例子代码基础上、向文档中写入中文 Code: 1.新建Class ChineseItext、在main方法中: ------------------------------------------------------------------------------------------ Document document = new Document(); try { PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf")); BaseFont base = null; Font fontChinese = null; try { //创建一个简体中文的基本字体、UniGB-UCS2-H为简体中文 base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.EMBEDDED); fontChinese = new Font(base, 12, Font.NORMAL); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } document.open(); //设置文档中文字为简体中文 document.add(new Paragraph("大家好!",fontChinese)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); }finally{ document.close(); } 运行-输出: 此时会出现异常: com.itextpdf.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized. 这是由于我们没有加入亚洲语言包的问题引起的,不过如果我们用itext5.0+以上版本也会出现这个异常,这是由于itext5.0+以上版本在获取资源文件的时候包路径发生了变化,由原来的“com/ lowagie/text/pdf/fonts/”变成了”com/itextpdf/text/pdf/fonts/” 而老版的itext-asian.jar路径是” com/ lowagie/text/pdf/fonts/”(我没有找到最新版本的语言包、可能最新的语言包已经修复了这个问题) 更改iTextAsian.jar包名的方法如下: 1)将iTextAsian.jar解压,目录结构如下  com/ lowagie/text/pdf/fonts/ 2)将加压后com目录下的包名lowagie更改为itextpdf 3)在命令行转至iTextAsian目录,重新打包为iTextAsian.jar文件   命令如下:      jar cvf iTextAsian.jar cm/itextpdf/text/pdf/fonts/*  执行后,将新的iTextAsian.jar加入到classpath路径 再次运行-输出: 打开helloworld.pdf 此时可以正常显示中文了 6) 总结: iText功能非常强大、此教程仅仅作为入门理解级别的教程、后续有时间还会增加一些高级例子、有基础的同学可以参考<>这本书

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ]
6 人已下载

下载文档

相关文档