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();
    }
其它的元素与此类似。

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字体。

转载于:https://www.cnblogs.com/yan5lang/archive/2009/07/14/1523374.html

iText的一些总结相关推荐

  1. Java使用itext生成Pdf

    Java使用itext生成Pdf 背景 所需依赖 解决jpedal-lgpl jar包问题 示例代码 生成带图片的PDF(使用本地文件系统图片) 生成带图片的PDF(使用网络图片) 背景 在某些业务场 ...

  2. java 生成pdf itext_使用Java组件itext 生成pdf介绍

    iText是一个能够快速产生PDF文件的Java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好的给合.使用iText与 ...

  3. 使用iText在word文档中插入复杂的Table表格

    iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档和word文档的一个java类库.通过iText不仅可以生成PDF或rtf 的文档,而且可以将XML.Html文件转 ...

  4. java 重复start,iText中带有“start”属性的有序列表[重复]

    使用最新版本的iText无法重现您的问题 . 我使用了以下HTML文件( lists.html ): Element 1 Element 2 Element 2 import java.io.File ...

  5. 使用iText库创建PDF文件

    前言 译文连接:http://howtodoinjava.com/apache-commons/create-pdf-files-in-java-itext-tutorial/ 对于excel文件的读 ...

  6. 一些关于iText和iTextSharp的旧闻(some old news about iText and iTextSharp)

    Google Calendar使用iText来输出PDF(iText used in Google Calendar) The calendars are generated as PDF files ...

  7. iText in Action 2nd4.2节(Changing the properties of a cell)读书笔记

    前言 PdfPCell类继承于Rectangle类,因此也继承了很多修改边框和背景色的属性和方法,后续我们会讨论到,但现在我们先要说明PdfPCell的内容模式.在iText的内部PdfPCell的内 ...

  8. java itext 设计器_使用Java组件itext 生成pdf的介绍

    [IT168 技术]iText是一个能够快速产生PDF文件的java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好的给 ...

  9. java itext word操作_使用JAVA中的Apache POI和iText从Word(DOC)创建PDF

    docx4j包含 code,用于使用iText从docx创建PDF.它还可以使用POI将doc转换为docx. 曾经有一段时间我们平等地支持这两种方法(以及通过XHTML的PDF),但我们决定专注于X ...

  10. JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档

    POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...

最新文章

  1. 手抖有救了!DeblurGAN消除运动模糊效果惊人 | 附论文+代码
  2. ASP.NET学习笔记 —— 一般处理程序之图片上传
  3. POJ3096Surprising Strings(map)
  4. 大数据技术周报第 004 期
  5. 各执一词,民用安防市场现状看法PK
  6. 编写一个关于浏览器盒子模型的方法
  7. 当手机访问时自动跳转到手机网站
  8. C语言数据结构各种结构体的定义
  9. GAMP读取精密星历存在一个小BUG
  10. PS下载Adobe Photoshop 2020中文安装教程 亲测可用
  11. c#记录合并PDF和word
  12. #Geek Point# 创业、艺术家和量子物理
  13. 作为程序员,到底是老板对你怎么了,让你竟然写下这么既奇葩无语又崩溃的代码注释,笑哭...……
  14. 题目 1567: 超级玛丽
  15. 全网多种方法解决未连接到互联网 代理服务器出现问题,或者地址有误的错误
  16. 如何检测摄像头是否被占用
  17. 文件管理nas php,家用nas安装配置可道云进行文件管理
  18. 微信小程序底部菜单详解
  19. 逆天了word 90后:情人节巧用小小技术就俘获了女神
  20. 硬核!8个类手写一个配置中心!

热门文章

  1. “腾讯基因”讨论:为什么我常说做to C的人很难去做to B?
  2. 精译丨贝莱德掌舵人拉里 · 芬克:华尔街是什么
  3. 不确定性原理的前世今生 · 数学篇(完)
  4. 【优化覆盖】基于matlab改进的鲸鱼算法求解无线传感器WSN覆盖优化问题【含Matlab源码 XYQMDXP001期】
  5. 【人脸表情识别】基于matlab GUI LBP+SVM脸部动态特征人脸表情识别【含Matlab源码 1369期】
  6. 【图像隐写】基于matlab DWT数字水印多种攻击效果对比【含Matlab源码 1134期】
  7. 【数学建模】基于matlab时变参数随机波动率向量自回归模型(TVP-VAR)【含Matlab源码 037期】
  8. SPSS问卷或量表调查研究需要多少份或要求多大的样本量?【SPSS 062期】
  9. pandas--groupby相关操作
  10. @excel 注解_SpringBoot中关于Excel的导入和导出