`

Itext笔记2

阅读更多

因为前些日子在一个项目中用到了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();
    }
其它的元素与此类似。

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

分享到:
评论

相关推荐

    iText笔记

    这篇笔记主要探讨了如何使用iText创建和操作表格。在给定的代码示例中,我们看到一个简单的Java程序,该程序展示了如何使用iText库创建一个包含多个单元格的PDF表格。 首先,程序创建了一个`Document`对象,这是...

    IText入门开发文档

    "iText中文教程.doc"和"学习itext笔记.docx"是两份中文学习资料,它们可能是对IText的详细解释和实践心得。这些文档可能会提供更贴近中文开发者习惯的解释,帮助你更好地理解和运用IText。 在学习过程中,建议按照...

    Itext笔记4

    iText中文包 博文链接:https://moon-vv.iteye.com/blog/224725

    itext生成PDF和word的两个demo

    其中还附有学习笔记一份,上述生成的文档包括对字体的选择(本地或者iTextAsian里面的),有对图片的添加,有对样式的调整,有对table的添加,其中生成的文档格式比较正规,是现实用户使用模板。如有需要欢迎大家...

    使用itext方式导出word格式

    案例中的两个`.txt`文件可能是博主在测试过程中记录的笔记或输出结果,它们可以提供更具体的信息,帮助理解实际的实现细节。 总结来说,利用iText库,开发者可以在Java中创建Word文档,这在需要自动化报告生成、...

    Itext5生成PDF报表

    table.addCell("列2"); table.addCell("列3"); document.add(table); document.close(); ``` 接下来,我们讨论FastDFS。FastDFS是一个开源的高性能、轻量级的分布式文件系统,适用于互联网领域的大规模文件存储。...

    itext in action PDF输出语言报告

    itext in action (java中 pdf 格式输出笔记)

    Java学习笔记

    总之,"Java学习笔记"涵盖了从基础到进阶的众多Java主题,结合JFreeChart和iText这两个实用库,不仅提供了对Java编程语言的深入理解,还展示了其在数据可视化和文档生成方面的强大能力。对于任何希望提升Java技能的...

    APACHE BIRT图表学习笔记

    ### Apache BIRT 图表学习笔记知识点详解 #### 一、Apache BIRT 概述 Apache BIRT(Business Intelligence and Reporting Tools)是一款开源的商务智能工具,由Eclipse基金会发起并维护。它为开发者提供了创建数据...

    dwr3 学习笔记<一>

    2. **itext-2.0.6.jar** - 这是一个用于创建PDF文档的Java库,可能在笔记中涉及了DWR3如何用来实现实时生成或更新PDF文件的功能。 3. **dwr.jar** - DWR的核心库,包含了所有必需的类和资源,用于在浏览器和服务器...

    java生成pdf文件

    2. **iText 7 Hyphenation**: itext7-hyph-7.0.1.pom.asc 可能关联到自动换行功能,帮助处理长单词和行尾断词。 3. **iText 7 Font Asian**: itext7-font-asian-7.0.1.pom.asc 用于支持亚洲字体,如中文、日文和...

    Jasperreport+ireport学习笔记1

    ### Jasperreport与iReport整合开发Web报表学习笔记 #### 一、环境配置 为了能够顺利地使用Jasperreport和iReport进行报表设计与开发,首先需要确保开发环境配置正确。 1. **Java JDK环境**: 确保已安装最新版的...

    NoteTakingApplication:笔记记录应用程序,允许用户添加笔记,生成下载PDF并通过电子邮件发送笔记。 在AWS上实时签出应用程序

    笔记记录应用程序,允许用户添加笔记,生成下载PDF并通过电子邮件发送笔记。 应用程序 : : 使用的技术和库 1,Spring MVC 2,Hibernate + MySql 3,Hibernate验证器 4,JavaMail API 5.iTextPDF库 6.html,css...

    Spring MVC 学习笔记 十二 PDF/Excel格式输出

    2. **ModelAndView**:Controller方法返回的对象,用于将模型数据和视图名称传递给视图层。你可以将数据放入ModelAndView的模型中,然后指定视图名称,如"viewName"。 3. **Model**:模型对象,包含业务数据。在...

    JfreeChart 学习笔记

    ### JfreeChart 学习笔记:深度解析与应用 #### JFreeChart概览与核心功能 JFreeChart作为一款开源的JAVA项目,专为图表开发而设计,支持丰富的图表类型,包括饼图、柱状图(含普通及堆栈柱状图)、线图、散点图、...

    CRMSys项目笔记

    项目可能使用Apache POI库读写Excel,iText或PDFBox生成Pdf文件。学习这些技能对于生成报告、导出数据等场景非常实用。 5. **统计报表** “统计报表注意事项.txt”可能涵盖了报表的设计和生成过程。在CRMSys中,...

    JFreeChart学习笔记

    2. **PDF和SVG**: 通过`JFreeChart`对象的`createBufferedImage()`方法,结合第三方库(如iText)可以导出为PDF;对于SVG,可以使用Batik库。 ### 八、总结 JFreeChart作为Java中的强大图表库,提供了丰富的图表...

    CleanerNotes:基于tomcat的网络应用程序,可将笔记中的照片清除为pdf

    此外,CleanerNotes可能还使用了PDF库,如iText或Apache PDFBox,这些库提供了创建、编辑和操作PDF文档的能力。通过这些库,开发者可以精确控制PDF的布局,将照片和文本合并到一个统一的文档中。在处理过程中,可能...

Global site tag (gtag.js) - Google Analytics