Hello World

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

  1. PdfWriter writer = new PdfWriter(dest);
  2. PdfDocument pdf = new PdfDocument(writer);
  3. Document document = new Document(pdf);
  4. document.add(new Paragraph("Hello World!"));
  5. 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的字符如下图所示: Hello World pdf


添加缩进无序段落

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

  1. PdfWriter writer = new PdfWriter(dest);
  2. PdfDocument pdf = new PdfDocument(writer);
  3. Document document = new Document(pdf);
  4. // Create a PdfFont
  5. PdfFont font = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
  6. // Add a Paragraph
  7. document.add(new Paragraph("iText is:").setFont(font));
  8. // Create a List
  9. List list = new List()
  10. .setSymbolIndent(12)
  11. .setListSymbol("\u2022")
  12. .setFont(font);
  13. // Add ListItem objects
  14. list.add(new ListItem("Never gonna give you up"))
  15. .add(new ListItem("Never gonna let you down"))
  16. .add(new ListItem("Never gonna run around and desert you"))
  17. .add(new ListItem("Never gonna make you cry"))
  18. .add(new ListItem("Never gonna say goodbye"))
  19. .add(new ListItem("Never gonna tell a lie and hurt you"));
  20. // Add the list
  21. document.add(list);
  22. document.close();

     产生的效果如下图所示: 文字缩进

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


添加图片

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

  1. Image fox = new Image(ImageDataFactory.create(fox.bmp));
  2. Image dog = new Image(ImageDataFactory.create(dog.bmp));
  3. Paragraph p = new Paragraph("The quick brown ")
  4. .add(fox)
  5. .add(" jumps over the lazy ")
  6. .add(dog);
  7. document.add(p);

     产生的效果如下图所示: 图片

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


展示数据库

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

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

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

  1. PdfWriter writer = new PdfWriter(dest);
  2. PdfDocument pdf = new PdfDocument(writer);
  3. Document document = new Document(pdf, PageSize.A4.rotate());
  4. document.setMargins(20, 20, 20, 20);
  5. PdfFont font = PdfFontFactory.createFont(FontConstants.HELVETICA);
  6. PdfFont bold = PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD);
  7. Table table = new Table(new float[]{4, 1, 3, 4, 3, 3, 3, 3, 1});
  8. table.setWidthPercent(100);
  9. BufferedReader br = new BufferedReader(new FileReader(data.csv));
  10. String line = br.readLine();
  11. process(table, line, bold, true);
  12. while ((line = br.readLine()) != null) {
  13. process(table, line, font, false);
  14. }
  15. br.close();
  16. document.add(table);
  17. 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函数:

  1. public void process(Table table, String line, PdfFont font, boolean isHeader) {
  2. StringTokenizer tokenizer = new StringTokenizer(line, ";");
  3. while (tokenizer.hasMoreTokens()) {
  4. if (isHeader) {
  5. table.addHeaderCell(
  6. new Cell().add(
  7. new Paragraph(tokenizer.nextToken()).setFont(font)));
  8. } else {
  9. table.addCell(
  10. new Cell().add(
  11. new Paragraph(tokenizer.nextToken()).setFont(font)));
  12. }
  13. }
  14. }

总结

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