使用iText7----生成纯文本、图片、表格内容的pdf文件

本文翻译自http://developers.itextpdf.com/content/itext-7-jump-start-tutorial

        这是一个iText 7入门教程。让我们从一些包含基础构建块的例子开始,不会涉及过多细节。

开始例子之前,先了解一个PDF

        PDF全称Portable Document Format,是Adobe公司开发的电子文件格式。这种文件格式与操作系统平台无关,也就是说,PDF文件不管是在Windows,Unix还是在苹果公司的Mac OS操作系统中都是通用的。这一特点使它成为在Internet上进行电子文档发行和数字化信息传播的理想文档格式。越来越多的电子图书、产品说明、公司文告、网络资料、电子邮件开始使用PDF格式文件。PDF格式文件目前已成为数字化信息事实上的一个工业标准。

        PDF文件格式可以将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中。一般pdf的纸张默认是A4型号。

一、Hello World--示例

        和别的语言的代码库一样,我们又从Hello World开始入手,代码如下所示:

PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
document.add(new Paragraph("Hello World!"));
document.close();

· 创建PdfWriter实例,PdfWriter是一个可以写PDF文件的对象,它不需要了解它要写的pdf的实际内容是什么,PdfWriter不需要知道文档是什么,一旦文件结构完成,它就写不同的文件部分,不同的对象,构成一个有效的文档。PdfWriter的初始化参数可以是文件名或者Stream

· PdfWriter了解它需要写什么内容,因为它监听PdfDocument的动态。PdfWriter负责管理添加的内容,并把内容分布到不同的页面上,并跟踪有关页面内容的所有信息。在第7张,我们可以发现PdfWriter可以有多重监听PdfDocument的方式。

· PdfDocumentPdfWriter创建以后,我们把PdfDocument传入Docment,并对Document对象操作

· 创建Paragraph,包含"Hello World"字符串,并把这个短语加入Document独享中

· 关闭Document。PDF文档创建完成

        我们在pdf中创建一个Hello World的字符这个pdf文件有参数dest指定。如下图所示: 

 

                                                                                                                           图1-Hello World示例

二、添加缩进无序段落

     下面的例子是添加更加复杂的文字的情况

PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
// Create a PdfFont
PdfFont font = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
// Add a Paragraph
document.add(new Paragraph("iText is:").setFont(font));
// Create a List
List list = new List()
    .setSymbolIndent(12)
    .setListSymbol("\u2022")
    .setFont(font);
// Add ListItem objects
list.add(new ListItem("Never gonna give you up"))
    .add(new ListItem("Never gonna let you down"))
    .add(new ListItem("Never gonna run around and desert you"))
    .add(new ListItem("Never gonna make you cry"))
    .add(new ListItem("Never gonna say goodbye"))
    .add(new ListItem("Never gonna tell a lie and hurt you"));
// Add the list
document.add(list);
document.close();

PdfWriter writer = new  PdfWriter(dest); PdfDocument pdf = new  PdfDocument(writer); Document document = new  Document(pdf); // Create a PdfFont  PdfFont font = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN); // Add a Paragraph  document.add( new  Paragraph( "iText is:" ).setFont(font)); // Create a List  List list = new  List() .setSymbolIndent( 12 ) .setListSymbol( "\u2022" ) .setFont(font); // Add ListItem objects  list.add( new  ListItem( "Never gonna give you up" )) .add( new  ListItem( "Never gonna let you down" )) .add( new  ListItem( "Never gonna run around and desert you" )) .add( new  ListItem( "Never gonna make you cry" )) .add( new  ListItem( "Never gonna say goodbye" )) .add( new  ListItem( "Never gonna tell a lie and hurt you" )); // Add the list  document.add(list); document.close();

     产生的效果如下图所示: 

                                                                                                           图2-List示例

         从第1行到22行内容是与Hello World这个例子是相同的,不过我们不仅仅增加了一个Paragraph。iText默认使用Helvetica字体,如果想使用其他字体,就要通过PdfFontFactorycreateFont方法创获得一个PdfFont对象。然后,我们可以使用这个PdfFont对象改变ParagraphList里面的字体,List是一个标题段落(11行)的集合,并且每一列表项都缩进12个字符。我们添加6个ListItem对象到list,最终写入document

三、添加图片

         如果我们使用如下代码添加图片和文字:

Image fox = new Image(ImageDataFactory.create(FOX));
Image dog = new Image(ImageDataFactory.create(DOG));
Paragraph p = new Paragraph("The quick brown ")
            .add(fox)
            .add(" jumps over the lazy ")
            .add(dog);
document.add(p);

        产生的效果如下图所示: 

                                                                                   图3-Image示例

        一开始我们把图片的路径传给ImageDataFactory,并会返回一个Image对象。ImageDataFactory会根据路径自动分析文件的类型(包括jpg,png,gif,bmp等)并进行处理保存在pdf中,在本例中我们插入的图片同时也是Paragraph的一本部分,他们替代了单词”fox”和”dog”。

四、展示数据库

       许多用户都会使用iText来创建pdf展示数据库的查询结果。下图是一个保存美国各大州的信息的数据库的展示: 

                                                                                                                                              图4-Table示例

        当然,如果我们使用数据库的话会增加代码的复杂度,所以我们使用csv格式的文件CSV:字符分隔值,如下图: 

                                                                                                            图5-United States CSV file

         一般pdf的纸张默认是A4型号的,在本例中如果想要展示如上上图所示的效果的话,先要通过PageSize.A4.rotate()来使A4纸旋转。在第5改变边缘大小,从默认的36字符到20字符。代码如下所示:

PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);    
Document document = new Document(pdf, PageSize.A4.rotate());
document.setMargins(20, 20, 20, 20);
PdfFont font = PdfFontFactory.createFont(FontConstants.HELVETICA);
PdfFont bold = PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD);
Table table = new Table(new float[]{4, 1, 3, 4, 3, 3, 3, 3, 1});
table.setWidthPercent(100);
BufferedReader br = new BufferedReader(new FileReader(DATA));
String line = br.readLine();
process(table, line, bold, true);
while ((line = br.readLine()) != null) {
    process(table, line, font, false);
}
br.close();
document.add(table);
document.close();

        在本例中,我们一行一行读取CSV文件,并把CSV文件每行的数据放在Table对象中,首先,我们创建两个相同字体家族的字体:Helvetica regular和Helvetica bold。接着,我们传递9个float类型的数据来创建Table对象,其中每个float类型的数据定义了表格列的宽度,例如第一、三列的长度是第二列的2倍(4/1),然后设置表格的相对于纸张的大小。在本例中我们设置表格大小为为纸张大小的100%(100%也会减去边缘大小然后再按比例)。 
  最后,我们根据路径(data.csv)来读取CSV文件,读取第一行并使用process()来处理这一行数据,process()这个函数是用来在Table中添加line,这个line的样式为font字体,并且检查这个line是否为header(表头)。其中,我们使用StringTokenizer来分割CSV文件的每一行,根据是否为表头内容来添加ParagraphCell对象中。以下是process函数:

public void process(Table table, String line, PdfFont font, boolean isHeader) {
    StringTokenizer tokenizer = new StringTokenizer(line, ";");
    while (tokenizer.hasMoreTokens()) {
        if (isHeader) {
            table.addHeaderCell(
                new Cell().add(
                    new Paragraph(tokenizer.nextToken()).setFont(font)));
        } else {
            table.addCell(
                new Cell().add(
                    new Paragraph(tokenizer.nextToken()).setFont(font)));
        }
    }
}

五、总结

           通过以上几个例子,我们可以见识到itext的基本功能,通过itext我们可以用程序创建文档。Paragraph,List,Image,TableCell,这些都是基础的高层次[high-level]对象,在我们创建基础文档的时候有着重要作用。 
          但是,我们有时候也需要低层次语法(高层次用来建立块内容,低层次的方式影响布局和设计),在第二章,我们开始介绍这些低层次方法

 

参阅:http://blog.csdn.net/u012397189/article/details/52161461

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值