pdf流生成pdf文件_从Java应用程序动态生成PDF文件

许多应用程序要求动态生成PDF文档。 这样的应用程序范围很广,从银行生成用于发送电子邮件的客户对账单,到购买特定书籍章节并以PDF格式接收它们的读者。 列表是无止境的。 在本文中,我们将使用iText Java库来生成PDF文档。 我们将带您看一个示例应用程序,以便您自己动手并更好地理解它。

熟悉iText版本5.3.0

iText是可从http://itextpdf.com免费获得的Java库。 iText库功能强大,除了生成PDF之外,还支持HTML,RTF和XML文档的生成。 您可以从文档中使用的各种字体中进行选择。 另外,iText的结构允许您使用相同的代码生成任何上述类型的文档。

iText库包含用于生成各种字体的PDF文本,在PDF文档中生成表格,向页面添加水印等的类。 iText提供了更多功能。 不可能在一篇文章中演示所有这些内容。 我们将介绍PDF生成所需的基本知识。 有关更多详细信息,请参阅供应商提供的文档。

我们将使用Eclipse来开发示例应用程序。 作为开放源代码的IDE,Eclipse是免费提供的并且功能强大。 您可以立即下载Eclipse。

iText API:近距离观察

com.itextpdf.text.Document是生成PDF文档的主要类。 这是要实例化的第一类。 创建文档后,您需要编写者才能写入文档。 com.itextpdf.text.pdf.PdfWriter是PDF编写器。 下面列出了一些其他常用的类:

  • com.itextpdf.text.Paragraph-此类表示缩进的段落。
  • com.itextpdf.text.Chapter此类表示PDF文档中的一章。 它是使用“ Paragraph作为标题并使用“ int作为章号创建的。
  • com.itextpdf.text.Font-此类包含字体的所有规范,例如字体系列,大小,样式和颜色。 在此类中,各种字体都声明为静态常量。
  • com.itextpdf.text.List-此类表示一个列表,该列表又包含多个ListItems
  • com.itextpdf.text.pdf.PDFPTable-这是一个表,可以放在绝对位置,也可以作为类Table添加到文档中。
  • com.itextpdf.text.Anchor-锚可以是参考,也可以是参考的目标。

在Eclipse中下载和配置iText

作为纯Java库,iText以JAR文件的形式出现。 下载该库后(假设位于路径C:\ temp),以下步骤将在Eclipse环境中配置iText库:

  1. 在Eclipse中创建一个名为iText的新Java项目。
  2. 在Package Explorer视图中右键单击iText项目,然后选择Properties
  3. 单击Java构建路径 在“库”选项卡上,单击“ 添加外部JAR”
  4. 浏览到C:\ temp目录,然后在此目录中选择itext-5.3.0.jar。
  5. 单击确定

现在已配置了iText,并且Eclipse准备创建Java应用程序以生成动态PDF文档。

样品申请

有什么比您自己动手制作的工作样本更好地展示任何技术的呢? 现在,您已经拥有必需的工具(Eclipse IDE)和库(iText库),我们都可以设计和开发示例运行程序。

让我们创建一个简单的PDF文档,其中包含一些基本元素,例如纯文本,带有非默认字体的彩色文本,表格,列表,章节,节等。此应用程序的目的是使您熟悉使用iText库的方式。 有很多类可以为您做很多与PDF文档生成相关的工作。 不可能涵盖所有这些课程。 iText的javadocs是有关如何使用这些类的很好的信息来源。 让我们开始编码。

第一步是创建一个文档。 文档是PDF文档所有元素的容器。

清单1.文档对象的实例化
Document document = new Document(PageSize.A4, 50, 50, 50, 50);

第一个参数是页面大小。 接下来的参数分别是左,右,上和下页边距。 该文档的类型尚未定义。 这取决于您创建的编写器的类型。 对于我们的示例,我们选择com.itextpdf.text.pdf.PdfWriter。 其他作家是HtmlWriter,RtfWriter,XmlWriter以及其他一些作家。 他们的名字充分说明了他们的目的。

清单2.创建PdfWriter对象
PdfWriter writer = PdfWriter.getInstance(document, \

new FileOutputStream("C:\\ITextTest.pdf"));

document.open();

第一个参数是对文档对象的引用,第二个参数是将在其中写入输出的文件的绝对名称。 接下来,我们打开文档进行编写。

现在,我们将在文档的第一页上添加一些文本。 借助com.itextpdf.text.Paragraph可以添加任何文本。 您可以使用文本以及字体,颜色,大小等的默认设置来创建默认段落。 否则,您可以提供自己的字体。 在本文中,我们还将讨论锚定(链接)到PDF文档。 在此PDF中,我们使用backToTop作为链接。 当您单击backToTop链接时,它将带您到文档的第一页。 您需要将文本设置为首页的定位目标。 让我们看看如何设置锚定目标并将字体设置为添加的段落。

清单3.创建段落对象
Anchor anchorTarget = new Anchor("First page of the document.");
      anchorTarget.setName("BackToTop");
      Paragraph paragraph1 = new Paragraph();

      paragraph1.setSpacingBefore(50);

      paragraph1.add(anchorTarget);
      document.add(paragraph1);

document.add(new Paragraph("Some more text on the \

first page with different color and font type.", 

FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD,	new CMYKColor(0, 255, 0, 0))));

图1显示了清单3中的代码示例输出。 要关闭文档,请添加document.close(); 清单3中的代码末尾。

图1.清单3中的代码示例输出
pdf流生成pdf文件_从Java应用程序动态生成PDF文件_第1张图片

您刚刚看到了如何在PDF文档中添加纯文本。 接下来,我们需要在文档中添加一些复杂的元素。 让我们从创建一个新的章节开始。 章节是一个特殊部分,从新页面开始,默认情况下显示数字。

清单4.创建章对象
Paragraph title1 = new Paragraph("Chapter 1", 

   FontFactory.getFont(FontFactory.HELVETICA, 
   
   18, Font.BOLDITALIC, new CMYKColor(0, 255, 255,17)));
   
Chapter chapter1 = new Chapter(title1, 1);
      
chapter1.setNumberDepth(0);

在清单4的代码中,我们创建了一个新的章对象chapter1 ,标题为“ This is Chapter 1”。 将编号深度设置为0将不会在页面上显示章节编号。

节是章节的子元素。 在清单5的代码中,我们创建了一个标题为“这是第1章的第1节”的部分。 要在此部分下添加一些文本,我们创建另一个段落对象someSectionText ,并将其添加到该部分对象中。

清单5.创建节对象
Paragraph title11 = new Paragraph("This is Section 1 in Chapter 1", 

       FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, 
   
       new CMYKColor(0, 255, 255,17)));
   
Section section1 = chapter1.addSection(title11);

Paragraph someSectionText = new Paragraph("This 

text comes as part of section 1 of chapter 1.");

section1.add(someSectionText);

someSectionText = new Paragraph("Following is a 3 X 2 table.");

section1.add(someSectionText);

在添加表之前,让我们看一下文档的外观。 添加以下两行以关闭图2中的文档。 然后编译并执行程序以生成PDF文档: document.add(chapter1);document.close();

图2.本章的示例输出
pdf流生成pdf文件_从Java应用程序动态生成PDF文件_第2张图片

接下来,我们创建一个表对象。 表格包含行和列的矩阵。 一行中的一个单元格可以跨越多于一列。 同样,一列中的一个单元格可以跨越多于一行。

清单6.创建表对象
PdfPTable t = new PdfPTable(3);

      t.setSpacingBefore(25);
      
      t.setSpacingAfter(25);
      
      PdfPCell c1 = new PdfPCell(new Phrase("Header1"));  
      
      t.addCell(c1);
      
      PdfPCell c2 = new PdfPCell(new Phrase("Header2"));
      
      t.addCell(c2);
      
      PdfPCell c3 = new PdfPCell(new Phrase("Header3"));
      
      t.addCell(c3);
      
      t.addCell("1.1");
      
      t.addCell("1.2");
      
      t.addCell("1.3");
      
      section1.add(t);

在清单6的代码中,我们创建了一个具有三列的PDFPTable对象t ,并继续添加行。 接下来,我们创建三个具有不同文本的PDFPcell对象。 我们继续将它们添加到表中。 它们将从第一列开始添加到第一行,然后移至同一行的下一列。 该行完成后,下一个单元格将添加到下一行的第一列。 只需提供单元格的文本,例如t.addCell("1.1");也可以将单元格添加到表中t.addCell("1.1"); 最后,将表对象添加到节对象。

最后,让我们看看如何将列表添加到PDF文档。 列表包含许多ListItem 列表可以编号或不编号。 将第一个参数传递为true意味着您要创建编号列表。

清单7.创建列表对象
List l = new List(true, false, 10);

l.add(new ListItem("First item of list"));

l.add(new ListItem("Second item of list"));

section1.add(l);

我们已经将所有内容添加到了chapter1对象中。 现在,我们在java项目中添加一个图像。 我们可以使用以下Image方法之一缩放图像:

  • scaleAbsolute()
  • scaleAbsoluteWidth()
  • scaleAbsoluteHeight()
  • scalePercentage()
  • scaleToFit()

在清单8中 ,我们使用了scaleAbsolute。 然后将图像对象添加到该部分。

清单8.将图像添加到主文档
Image image2 = Image.getInstance("IBMLogo.bmp");

      image2.scaleAbsolute(120f, 120f);
      
      section1.add(image2);

iText中的com.itextpdf.text.Anchor类表示指向外部网站或文档内部的链接。 锚点(链接)可以像网页中的链接一样单击。 要添加锚点,我们需要创建一个新的锚点并将引用设置为清单3中创建的Anchor目标。 然后将锚点添加到该部分,并将该部分添加到文档。

清单9.将Anchor添加到主文档
Paragraph title2 = new Paragraph("Using Anchor", 

        FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, 

        new CMYKColor(0, 255, 0, 0)));

section1.add(title2);

title2.setSpacingBefore(5000);

Anchor anchor2 = new Anchor("Back To Top");

anchor2.setReference("#BackToTop");

section1.add(anchor2);

没有更多的元素可以添加到chapter1 ,是时候将chapter1添加到主document 与示例应用程序一样,我们还将在此处关闭文档对象。

清单10.在主文档中增加一章
document.add(chapter1);

document.close();

运行示例应用程序

  1. 下载示例应用程序j-itextsample.jar(请参阅下载 )。
  2. 将j-itextsample.jar解压缩到目录中。 例如,如果将其提取到C:\ temp,则将源文件和类文件放入C:\ temp \ com \ itext \ test。
  3. 打开命令提示符,并将目录更改为C:\ temp。
  4. 在此命令提示符下设置系统的类路径。 在系统的类路径中包含C:\temp\itext-5.3.0.jar 在Windows®上,执行命令set classpath=C:\temp\itext-5.3.0.jar;%classpath%
  5. 使用命令java com.itext.test.ITextTest运行该应用程序。

该程序将在C:\处生成ITextTest.pdf文档。 图3显示了PDF文档首页的屏幕截图。

图3. PDF文档的屏幕截图
pdf流生成pdf文件_从Java应用程序动态生成PDF文件_第3张图片

图4显示了第1章及其在PDF文档中的节,文本,表格,列表和图像的屏幕截图。

图4. PDF文档的屏幕截图
pdf流生成pdf文件_从Java应用程序动态生成PDF文件_第4张图片

图5显示了PDF文档中Anchor链接的屏幕截图。

图5. PDF文档的屏幕截图
pdf流生成pdf文件_从Java应用程序动态生成PDF文件_第5张图片

结论

您刚刚看到了PDF生成的一些基本元素。 iText的优点在于,您可以在不同类型的编写器中使用相同元素的语法。 另外,您可以将编写器的输出重定向到控制台(对于XML和HTML编写器),Servlet的输出流(对于对PDF文档的Web请求的响应)或任何其他类型的OutputStream 。 在响应相同的情况下,iText也很方便,但是响应的类型因PDF,RTF,HTML或XML而异。 iText允许您创建水印,加密文档以及其他输出功能。


翻译自: https://www.ibm.com/developerworks/java/library/os-javapdf/index.html

你可能感兴趣的:(pdf流生成pdf文件_从Java应用程序动态生成PDF文件)