因为前些日子在一个项目中用到了iText,稍有收获,便总结于此,以供他人所需。
iText是一个比较底层的pdf库,很多项目的pdf操作都是以它为基础的。像spring,以及另一个比较有名的报表工具jasperreports。简单的pdf报表输出用它比较合适,比较复杂的话使用起来就比较困难了,你要手工编写太多的代码。
比较好的是iText网站上提供相当多的示例代码,比较容易入门。我这里只说一些在它的文档里并没有直接讲到的东西。
1 关于Document
Document的几种构造函数:
public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize,
int marginLeft,
int marginRight,
int marginTop,
int marginBottom);
下面两种比较有用,如果是你想定义纸张大小和边缘的时候。对于Margin,iText上提到“You can also change the margins while you are adding content. Note that the changes will only be noticed on the NEXT page. If you want the margins mirrored (odd and even pages), you can do this with this method: setMarginMirroring(true). ”不过,对于table似乎并不好使。table并不会了理会你设定的margin,如果想改变它的magin还是需要去改变它的宽度(setWidth)。
2 pdf表单
使用PdfStamper是可以填充pdf表单的,这样就给出了一种很好的报表生成思路。
word制作报表样式-->acrobat转pdf-->itext填充数据-->输出pdf
这做非常简单,因为可以比较容易的控制pdf的样式。我对于Java的报表工具了解的并不多,不过在jasperreports,即使用GUI工具做一个样式比较复杂的报表也不是怎么容易。比如有那种斜线的表头,比较花哨的嵌套表格。这样的情况还是比较多见的,客户不会关系你实现起来是否困难。不过想要使用这种方式也有不足的地方。首先是acrobat把word转化成pdf的时候,格式总是保持不好,特别的是字体。然后是文件的体积这样生成的pdf会比直接用iText生成的pdf文件大很多,acrobat在pdf里加入了太多无用的信息。初次使用iText填充Adobe Designer生成的pdf表单时会有点小麻烦。在Designer中设计了一个name的text文本框的绑定名为name。照着iText中例子使用使用PdfStamper的setField方法去这样写form.setField("name", "XXXX");并不会成功。原因是Adobe Designer生成的表单名都是具有层次的,它可能是这个样子form1[0].#subform[0].name[0]。不过我们可以用一个方法把它们列出来,只要做一次就知道结构了,可以使用类似下面的代码:
PdfReader reader = new PdfReader("form.pdf");
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream("registered_flat.pdf"));
AcroFields form = stamp.getAcroFields();
for (Iterator it = form.getFields().keySet().iterator(); it
.hasNext();) {
System.out.println(it.next());
}
如果直接用iText编程生成的表单就不会有这样的问题,设定的什么名字就是什么名字。
3 表单元素
pdf 并不像html那样具有良好清晰的结构,而是一个有层次的文档类型。在它的maillist里,作者说明了iText虽然可以操作现存的pdf文件但是没办法去还原它的结构的。没办法像html一样,能从一个pdf文件获得一个清晰的“源文件”的。关于层次,可以从iText上得到详细的讲述,获取去看看 pdf规范。表单和普通文本是不在一个层上的。没办法适用对待文本表各一样把它们简单的add进Document对象。获取一个cb直接去用绝对定位的方法可以加入表单元素,不过很多的时候因为排版并不能那么简单的去做。就是在html中布局一样可以使用表格定位。想把一个表单元素加入cell,要借助 cell的setCellEvent方法。以一个checkbox为例。新建一个类CheckBoxForm,实现PdfPCellEvent接口。需要实现一个cellLayout的方法。
public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases)
position可以好好利用,它包含当前cell的位置信息,你可以用它来确定自己checkbox的位置。
position.top ()-position.bottom()就能得到高position.right()-position.left()可以得到长,如果需要这两个值得花可以如此计算。下面的代码就是定义一个宽度为a的checkbox的rectangle 。它在cell中水平居中,垂直也居中。
float bo = (position.top()-position.bottom()-a)/2;
float ao = (position.right()-position.left()-a)/2;
Rectangle rectangle = new Rectangle(position.left() + ao, position
.bottom() + bo, position.left() +ao+ a, position.bottom()+ bo + a);
然后把它加入Document
RadioCheckField tf = new RadioCheckField(writer, rectangle, fieldname,
"f");
tf.setCheckType(RadioCheckField.TYPE_SQUARE);
tf.setBorderWidth(1);
tf.setBorderColor(Color.black);
tf.setBackgroundColor(Color.white);
try {
PdfFormField field = tf.getCheckField();
writer.addAnnotation(field);
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
其它的元素与此类似。
(来源 www.iocblog.net)
4 PdfPTable和Table
说不上哪种更好用,有时候不能不使用PdfPTable。可惜它只有setColspan方法,没有setRowspan。嵌套的时候也有区别, PdfPTable是用addcell()加入嵌套表的,table则有一个更明了的方法insertTable()。PdfPTable想进行设置 border之类的操作要先获得一个默认cell,
pdfPTableName.getDefaultCell().setBorder(Rectangle.NO_BORDER);//设置无框的表
另外在PdfPTable中,一些修饰属性会因为设置的时机不正确而没有效果。如,适用cell的构造函数加入了文本,在cell的 setVerticalAlignment()fangfa去设定垂直对齐方式就不会有效。还有一个有意思的不同是table默认外边框是加粗的,而 PdfPTable则一样粗细。
5 字体
iText的例子有很多足够用,给出一些pdf的字体名称和编码,如果想使用内嵌字体的话。
语言 PDF 字体名
简体中文 STSong-Light
繁体中文 MHei-Medium
MSung-Light
日语 HeiseiKakuGo-W5
HeiseiMin-W3
韩语 HYGoThic-Medium
HYSMyeongJo-Medium
字符集 编码
简体中文 UniGB-UCS2-H
UniGB-UCS2-V
繁体中文 UniCNS-UCS2-H
UniCNS-UCS2-V
日语 UniJIS-UCS2-H
UniJIS-UCS2-V
UniJIS-UCS2-HW-H
UniJIS-UCS2-HW-V
韩语 UniKS-UCS2-H
UniKS-UCS2-H
必须要有Asian的包才可以用,也可以使用TrueType字体。
ps:因为隔了一段时间了,所以有些现在一时也想不起来了,也可能会有理解的错误。另外,适用iText的时候自己最好抽象一下,可能会省不少力气。
分享到:
相关推荐
在学习iText的过程中,可能会遇到各种问题,这篇博文“学习iText问题总结”可能是博主在深入理解和实践iText时的一些经验分享。以下是对iText相关知识点的详细阐述: 1. **PDF基础**:PDF(Portable Document ...
总结起来,IText是一个功能丰富的Java库,用于处理PDF和RTF文档,尤其是`itext-asian-5.2.0.jar`对于亚洲语言的支持,使得在中文环境下的应用更加得心应手。通过学习和掌握IText,开发者可以有效地提高工作效率,...
**Itext概述** Itext是一款强大的Java库,专门用于创建、修改和处理PDF文档。它在IT行业中广泛应用,尤其在需要生成...无论是初学者还是经验丰富的开发者,都应该充分利用这些资源,深入理解和运用Itext的全部功能。
总结,iTextPDF 5.5.5是一个强大的PDF处理工具,无论是在企业级应用还是个人项目中,都能发挥重要作用。通过熟练掌握其API和使用技巧,开发者可以高效地创建专业且富有表现力的PDF文档,满足多样化的业务需求。
总结,Itext库是PDF处理的重要工具,无论是在创建新的PDF文档还是对已有文档进行编辑,它都提供了强大而灵活的功能。通过学习和掌握Itext,开发者可以轻松处理PDF相关任务,提高工作效率。而不同版本之间的升级,...
**正文** ITextPDF是一款强大的Java...无论你是新手还是经验丰富的开发者,都能通过学习和使用iTextPDF来提升报表开发的效率和质量。在实际项目中,结合具体的业务场景,善用iTextPDF将使你的报表更具专业性和个性化。
通过以上内容可以看出,《iText In Action Second Edition》是一本全面而深入的技术书籍,不仅适合初学者快速入门iText的使用方法,也适合有经验的开发者深入研究PDF文档的创建和管理。本书通过丰富的示例和清晰的...
### iText in Action 第二版知识点解析 #### 一、书籍基本信息 ...以上内容基于提供的文件摘要进行了详细的知识点总结与扩展,希望能够帮助读者更好地理解和掌握《iText in Action》第二版的主要内容。
总结来说,《Itext in Action》这本书及其配套的源码示例,为Java开发者提供了一个强大的工具来处理PDF文档,通过学习和实践这些示例,开发者可以掌握PDF的创建、编辑、格式化等技术,提升项目中的文档处理能力。...
### iText in Action:创建与操作PDF文档 #### 一、引言 ...无论是初学者还是有经验的开发者,都可以从中获益匪浅。通过这本书的学习,读者不仅可以掌握iText的核心技术,还能深入了解PDF文档的各种高级特性。
"iText in Action"教程详细介绍了iText库的使用,无论你是初学者还是经验丰富的开发人员,都能从中受益。通过实践书中的例子和项目,你可以掌握PDF编程的关键技能,从而在实际工作中更有效地生成和处理PDF文档。
### PDF文件全攻略知识点概述 #### 一、iText简介及基本操作 - **iText** 是一个开源库,主要用于创建、操作PDF...无论是初学者还是有经验的开发者,都能从中获得有价值的信息,从而更高效地完成PDF文档的开发工作。
### BIRT 安装与使用详解 #### 一、简介 Business Intelligence and Reporting Tools ...无论是初学者还是经验丰富的开发者,都能够快速上手并利用 BIRT 实现复杂的数据分析需求。希望本文能为你提供有用的指导。
itext 生成报表 几大框架问题 Struts2常用标签总结等 Word文件">包括165个javaEE学习的Word文件 jstl标准函数 mysql命令详解 javascript 常用JavaScript代码 java位运算大全 java struts2 0经典知识点 ORACLE 经验 ...
在IT行业中,图片转PDF是一项常见的需求,尤其在...总结来说,这个"图片转PDF项目代码示例"涵盖了Java编程、图像处理、PDF文档操作等重要技术点,通过学习和理解这个项目,可以提升在这些领域的技能,提高工作效率。
总结来说,"BREW 50个例子"是一份宝贵的开发资源,它涵盖了BREW平台的关键领域,包括文本处理、网络通信、位置服务和短信操作。对于初学者和有经验的BREW开发者来说,这些都是提高编程效率、解决实际问题的实用参考...