前言

译文连接:http://howtodoinjava.com/apache-commons/create-pdf-files-in-java-itext-tutorial/

对于excel文件的读写操作,相信大家都比较熟悉,使用apache的POI库即可。本篇文章,我将基于iText库编写各式各样的代码示例去创建PDF文件。这些例子会按它们各自的功能分类,为了使大家能更加形象的看到代码所生成的PDF文件内容,每一个例子我都会附加上一张PDF文件截图。我已经尽可能的把我能找到的有用的例子放在这里,如果你觉得我错过了一些用例,随时在评论里留下你的建议,我会把这些例子添加进去。

iText库概述

好的一面是,iText是开源的API,但是需要注意,虽然iText是开源,如果你出于商业目的使用它,仍然需要购买商业许可证。你可以从http://itextpdf.com上免费获取iText的Java类库,iText库非常强大,支持HTML、RTF、XML以及PDF文件的生产,你可以在文档中使用各种各样的字体,并且,还可以使用同样的代码生成上述不同类型的文件,这真的是一个很棒的特性,不是吗?

iText库包含一系列接口,可以生成不同字体的PDF文件,在PDF中创建表格,添加水印等等功能。当然,iText还有许许多多其它的功能,这将留给读者去探索。

如果你的项目是maven工程的话,在pom.xml文件中添加如下依赖,即可以给自己的应用程序添加iText库支持。

<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.0.6</version>
</dependency>

当然,你也可以自己去下载最新的jar文件,然后添加到工程里,下载地址

iText库常用类

让我们先列出几个接下来例子中要用到的重要的类,熟悉熟悉。

com.itextpdf.text.Document:这是iText库中最常用的类,它代表了一个pdf实例。如果你需要从零开始生成一个PDF文件,你需要使用这个Document类。首先创建(new)该实例,然后打开(open)它,并添加(add)内容,最后关闭(close)该实例,即可生成一个pdf文件。

com.itextpdf.text.Paragraph:表示一个缩进的文本段落,在段落中,你可以设置对齐方式,缩进,段落前后间隔等。

com.itextpdf.text.Chapter:表示PDF的一个章节,他通过一个Paragraph类型的标题和整形章数创建。

com.itextpdf.text.Font:这个类包含了所有规范好的字体,包括family of font,大小,样式和颜色,所有这些字体都被声明为静态常量。

com.itextpdf.text.List:表示一个列表;

com.itextpdf.text.pdf.PDFPTable:表示一个表格;

com.itextpdf.text.Anchor:表示一个锚,类似于HTML页面的链接。

com.itextpdf.text.pdf.PdfWriter:当这个PdfWriter被添加到PdfDocument后,所有添加到Document的内容将会写入到与文件或网络关联的输出流中。

com.itextpdf.text.pdf.PdfReader:用于读取PDF文件;

iText Hello World示例

让我们先从简单的“Hello World”程序开始,在这个程序中,我将会创建一个PDF文件,里面的内容为一条简单的语句。

package cn.edu.hdu.chenpi.cpdemo.itext;

import java.io.FileNotFoundException;
import java.io.FileOutputStream; import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter; public class JavaPdfHelloWorld {
public static void main(String[] args) {
Document document = new Document();
try {
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("HelloWorld.pdf"));
document.open();
document.add(new Paragraph("A Hello World PDF document."));
document.close();
writer.close();
} catch (DocumentException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

给PDF文件设置文件属性

这个例子将展示如何给PDF文件设置各种属性,如作者名字,创建日期,创建者,或者标题。

        Document document = new Document();
try
{
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("SetAttributeExample.pdf"));
document.open();
document.add(new Paragraph("Some content here")); //Set attributes here
document.addAuthor("Lokesh Gupta");
document.addCreationDate();
document.addCreator("HowToDoInJava.com");
document.addTitle("Set Attribute Example");
document.addSubject("An example to show how attributes can be added to pdf files."); document.close();
writer.close();
} catch (Exception e)
{
e.printStackTrace();
}

PDF中添加图片

下面例子展示如何往PDF文件中添加图片。例子中图片来源包含了两种方式:本地图片或URL。

并且,我添加了一些代码,用于设置图片在文档中的位置。

        Document document = new Document();
try
{
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("AddImageExample.pdf"));
document.open();
document.add(new Paragraph("Image Example")); //Add Image
Image image1 = Image.getInstance("C:\\temp.jpg");
//Fixed Positioning
image1.setAbsolutePosition(100f, 550f);
//Scale to new height and new width of image
image1.scaleAbsolute(200, 200);
//Add to document
document.add(image1); String imageUrl = "http://www.eclipse.org/xtend/images/java8_logo.png";
Image image2 = Image.getInstance(new URL(imageUrl));
document.add(image2); document.close();
writer.close();
} catch (Exception e)
{
e.printStackTrace();
}

PDF中创建表格

以下代码展示了如何在PDF文件中创建表格

Document document = new Document();
try {
PdfWriter writer = PdfWriter.getInstance(document,
new FileOutputStream("AddTableExample.pdf"));
document.open(); PdfPTable table = new PdfPTable(3); // 3 columns.
table.setWidthPercentage(100); // Width 100%
table.setSpacingBefore(10f); // Space before table
table.setSpacingAfter(10f); // Space after table // Set Column widths
float[] columnWidths = { 1f, 1f, 1f };
table.setWidths(columnWidths); PdfPCell cell1 = new PdfPCell(new Paragraph("Cell 1"));
cell1.setBorderColor(BaseColor.BLUE);
cell1.setPaddingLeft(10);
cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
cell1.setVerticalAlignment(Element.ALIGN_MIDDLE); PdfPCell cell2 = new PdfPCell(new Paragraph("Cell 2"));
cell2.setBorderColor(BaseColor.GREEN);
cell2.setPaddingLeft(10);
cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
cell2.setVerticalAlignment(Element.ALIGN_MIDDLE); PdfPCell cell3 = new PdfPCell(new Paragraph("Cell 3"));
cell3.setBorderColor(BaseColor.RED);
cell3.setPaddingLeft(10);
cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
cell3.setVerticalAlignment(Element.ALIGN_MIDDLE); // To avoid having the cell border and the content overlap, if you
// are having thick cell borders
// cell1.setUserBorderPadding(true);
// cell2.setUserBorderPadding(true);
// cell3.setUserBorderPadding(true); table.addCell(cell1);
table.addCell(cell2);
table.addCell(cell3); document.add(table); document.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}

PDF中创建列表

这个例子将会帮助你理解iText库是如何在PDF文件里创建列表的。

Document document = new Document();
try
{
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("ListExample.pdf"));
document.open();
document.add(new Paragraph("List Example")); //Add ordered list
List orderedList = new List(List.ORDERED);
orderedList.add(new ListItem("Item 1"));
orderedList.add(new ListItem("Item 2"));
orderedList.add(new ListItem("Item 3"));
document.add(orderedList); //Add un-ordered list
List unorderedList = new List(List.UNORDERED);
unorderedList.add(new ListItem("Item 1"));
unorderedList.add(new ListItem("Item 2"));
unorderedList.add(new ListItem("Item 3"));
document.add(unorderedList); //Add roman list
RomanList romanList = new RomanList();
romanList.add(new ListItem("Item 1"));
romanList.add(new ListItem("Item 2"));
romanList.add(new ListItem("Item 3"));
document.add(romanList); //Add Greek list
GreekList greekList = new GreekList();
greekList.add(new ListItem("Item 1"));
greekList.add(new ListItem("Item 2"));
greekList.add(new ListItem("Item 3"));
document.add(greekList); //ZapfDingbatsList List Example
ZapfDingbatsList zapfDingbatsList = new ZapfDingbatsList(43, 30);
zapfDingbatsList.add(new ListItem("Item 1"));
zapfDingbatsList.add(new ListItem("Item 2"));
zapfDingbatsList.add(new ListItem("Item 3"));
document.add(zapfDingbatsList); //List and Sublist Examples
List nestedList = new List(List.UNORDERED);
nestedList.add(new ListItem("Item 1")); List sublist = new List(true, false, 30);
sublist.setListSymbol(new Chunk("", FontFactory.getFont(FontFactory.HELVETICA, 6)));
sublist.add("A");
sublist.add("B");
nestedList.add(sublist); nestedList.add(new ListItem("Item 2")); sublist = new List(true, false, 30);
sublist.setListSymbol(new Chunk("", FontFactory.getFont(FontFactory.HELVETICA, 6)));
sublist.add("C");
sublist.add("D");
nestedList.add(sublist); document.add(nestedList); document.close();
writer.close();
} catch (Exception e)
{
e.printStackTrace();
}

PDF中设置样式/格式化输出

让我们来看一些给PDF文件内容设置样式的例子,例子中包含了字体、章、节的使用。

Font blueFont = FontFactory.getFont(FontFactory.HELVETICA, 8, Font.NORMAL, new CMYKColor(255, 0, 0, 0));
Font redFont = FontFactory.getFont(FontFactory.COURIER, 12, Font.BOLD, new CMYKColor(0, 255, 0, 0));
Font yellowFont = FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD, new CMYKColor(0, 0, 255, 0));
Document document = new Document();
try
{
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("StylingExample.pdf"));
document.open();
//document.add(new Paragraph("Styling Example")); //Paragraph with color and font styles
Paragraph paragraphOne = new Paragraph("Some colored paragraph text", redFont);
document.add(paragraphOne); //Create chapter and sections
Paragraph chapterTitle = new Paragraph("Chapter Title", yellowFont);
Chapter chapter1 = new Chapter(chapterTitle, 1);
chapter1.setNumberDepth(0); Paragraph sectionTitle = new Paragraph("Section Title", redFont);
Section section1 = chapter1.addSection(sectionTitle); Paragraph sectionContent = new Paragraph("Section Text content", blueFont);
section1.add(sectionContent); document.add(chapter1); document.close();
writer.close();
} catch (Exception e)
{
e.printStackTrace();
}

给PDF文件设置密码

接下来,让我们看下如何给pdf文件生产保护密码,如下,使用writer.setEncryption()方法即可给pdf文件设置密码。

private static String USER_PASSWORD = "password";
private static String OWNER_PASSWORD = "lokesh"; public static void main(String[] args) {
try
{
OutputStream file = new FileOutputStream(new File("PasswordProtected.pdf"));
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, file); writer.setEncryption(USER_PASSWORD.getBytes(),
OWNER_PASSWORD.getBytes(), PdfWriter.ALLOW_PRINTING,
PdfWriter.ENCRYPTION_AES_128); document.open();
document.add(new Paragraph("Password Protected pdf example !!"));
document.close();
file.close(); } catch (Exception e)
{
e.printStackTrace();
}
}

给PDF文件设置权限

在这个例子中,我将设置一些权限用于限制其它用户访问PDF文件,如下是一些权限设置值:

 PdfWriter.ALLOW_PRINTING
PdfWriter.ALLOW_ASSEMBLY
PdfWriter.ALLOW_COPY
PdfWriter.ALLOW_DEGRADED_PRINTING
PdfWriter.ALLOW_FILL_IN
PdfWriter.ALLOW_MODIFY_ANNOTATIONS
PdfWriter.ALLOW_MODIFY_CONTENTS
PdfWriter.ALLOW_SCREENREADERS

你可以通过对不同的值执行或操作来实现多权限设置,举个例子:PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY。

    public static void main(String[] args) {
try {
OutputStream file = new FileOutputStream(new File(
"LimitedAccess.pdf"));
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, file); writer.setEncryption("".getBytes(), "".getBytes(),
PdfWriter.ALLOW_PRINTING , //Only printing allowed; Try to copy text !!
PdfWriter.ENCRYPTION_AES_128); document.open();
document.add(new Paragraph("Limited Access File !!"));
document.close();
file.close(); } catch (Exception e) {
e.printStackTrace();
}
}

读取/修改已有的PDF文件

本例子将展示如何使用iText库实现PDF文件的读取和修改。在这个例子中,我将读取一个PDF文件,并往每一页添加一些内容。

public static void main(String[] args) {
try
{
//Read file using PdfReader
PdfReader pdfReader = new PdfReader("HelloWorld.pdf"); //Modify file using PdfReader
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream("HelloWorld-modified.pdf")); Image image = Image.getInstance("temp.jpg");
image.scaleAbsolute(100, 50);
image.setAbsolutePosition(100f, 700f); for(int i=1; i<= pdfReader.getNumberOfPages(); i++)
{
PdfContentByte content = pdfStamper.getUnderContent(i);
content.addImage(image);
} pdfStamper.close(); } catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}

往HTTP response输出流中写入PDF内容

这是本篇文章的最后一个例子,我将会往HttpServletResponse的输出流中写入一些PDF内容。在CS环境中,当你需要将PDF文件转成流的形式的时候,这非常有用。

Document document = new Document();
try{
response.setContentType("application/pdf");
PdfWriter.getInstance(document, response.getOutputStream());
document.open();
document.add(new Paragraph("howtodoinjava.com"));
document.add(new Paragraph(new Date().toString()));
//Add more content here
}catch(Exception e){
e.printStackTrace();
}
document.close();
}

以上就是关于iText 库的所有例子了,如果有什么地方不清楚,或你想增加更多的例子,欢迎留下你的评论。

学习愉快~

译文连接:http://howtodoinjava.com/apache-commons/create-pdf-files-in-java-itext-tutorial/

使用iText库创建PDF文件的更多相关文章

  1. 01.在Java中如何创建PDF文件

    1.简介 在这篇快速文章中,我们将重点介绍基于流行的iText和PdfBox库从头开始创建 PDF 文档. 2. Maven 依赖 <dependency> <groupId> ...

  2. 51单片机创建PDF文件

    PDF文件有特定的格式要求,本以为.TXT与.PDF之间可以相互转换,只需要修改后缀名就可以了,然而事实并非如此. 如下为.PDF文件打开的编码显示. 如果需要创建PDF文件,只需要按照PDF的编码格 ...

  3. 怎么用OCR图文识别软件在MS Office中创建PDF文件

    ABBYY PDF Transformer+是一款可创建.编辑及将PDF文件转换为其他可编辑格式的OCR图文识别软件,不仅可以从纸质文档.图像文件和任何其他流行格式创建PDF文件(相关文章请参考如何从 ...

  4. python从TXT创建PDF文件——reportlab

    使用reportlab创建PDF文件电子书一般都是txt格式的,某些电子阅读器不能读取txt的文档,如DPT-RP1.因此本文从使用python实现txt到pdf的转换,并且支持生成目录,目录能够生成 ...

  5. Java 创建PDF文件包的2种方法

    1. 概述 PDF文件包可方便在仅打开一个窗口的情况下阅读多个文档,通过将多个PDF文档或其他非PDF文档封装在一起,打开文件包后可以随意切换查看文件包中的文档,在需要编辑更改的情况,也可以打开文本包 ...

  6. [itext]Java生成PDF文件

    一.前言 最近在做也导出试卷的功能,刚开始是导出为doc,可是导出来格式都有变化,最后说直接将word转为pdf,可是各种不稳定,各种报错.最后想到直接将文件写入pdf(参考:http://www.c ...

  7. iText C# 合并PDF文件流,以及A5变A4时内容默认放在最底下的问题的解决方法;ASP.NET 实现Base64文件流下载PDF

    /// <summary> 合併PDF檔(集合) </summary> /// <param name="files">欲合併PDF檔之集合(一 ...

  8. 解决部分浏览器不能显示itext生成的PDF文件文本域内容问题

    利用Itext可以实现pdf的高效动态生成,但在实践过程中遇到了一个问题: 即itext利用map中的值设置到pdf模板上建立的文本域中时:能成功生成,但是在部分浏览器上(360,QQ,等浏览器)无法 ...

  9. 利用python第三方库提取PDF文件的表格内容

    小爬最近接到一个棘手任务:需要提取手机话费电子发票PDF文件中的数据.接到这个任务的第一时间,小爬决定搜集各个地区各个时间段的电子发票文件,看看其中的差异点.粗略统计下来,PDF文件的表格框架是统一的 ...

随机推荐

  1. MDI窗体容器 权限设置

    MDI窗体容器:它可以让其它窗体在它的内部打开,无法超出它的范围将某个窗体的属性:IsMdiContainer设置为true - 窗口样式如何将其它窗体在它的内部打开?窗体对象名.MdiParent ...

  2. jquery输入数字随机抽奖特效

    简介:jQuery自定义数值抽奖活动代码是一款点击开始按钮计算机会产生玩家输入范围内的随机数,点击停止按钮,将显示数字最终结果的效果. 效果展示 http://hovertree.com/texiao ...

  3. Nancy 引用源码与NuGet安装差异

    使用NuGet安装Nancy和直接引用源码项目存在一些差异,如序列化,授权验证问题. 如果引用源码的话,自定义JsonSerializer,如下: 注意,需要使用NuGet安装Newtonsoft.J ...

  4. 孙鑫MFC学习笔记19:动态链接库

    1.动态链接库 2.静态库和动态库 3.使用动态链接库的好处 4.动态链接库编译需要导出,使用需要导入 __declspec(dllexport),__declspec(dllimport) 5.动态 ...

  5. 一个java实习生两周八次的面试经历

    以前从来没有因为求职出去面试过,一直觉得面试很可怕,没想到最近两周我也成为了面霸,两周面试八次,我的找工作之路就这样开始了!大概两个星期之前,我看着自己在招聘网站上写好的简历连投出去的勇气都没有,战战 ...

  6. 两个与spring事务相关的问题

    有些spring相关的知识点之前一直没有仔细研究:比如spring的事务,并不是没有使用,也曾经简单的在某些需要事务处理的方法上通过增加事务注解来实现事务功能,仅仅是跟随使用(甚至并未测试过事务的正确 ...

  7. Wami Map Project – 开源的 OSM API 服务

    Wami 地图项目把 OSM 数据分享给所有的人,很容易使用.他们利用 MongoDB 的潜力进行大数据管理来实现从 OSM 数据来源搜索相关的数据.它们的 API 使人们有可能检索不同格式的 POI ...

  8. IKONS – 赞!264 款手工打造的免费矢量图标

    IKONS 是一套免费的矢量图标集,包含264款手工精心制作的可伸缩的矢量图标,分享给网页设计人员和开发人员.这些图标提供了 SVG.AI.ESP.PSD.CSH 和 PNG 格式.所有的图标都可以免 ...

  9. python任务执行之线程,进程,与协程

    一.线程 线程为程序中执行任务的最小单元,由Threading模块提供了相关操作,线程适合于IO操作密集的情况下使用 #!/usr/bin/env python # -*- coding:utf-8 ...

  10. 刷新ALV定位到当前记录行

    如果使用"REFRESH_TABLE_DISPLAY"刷新ALV后,记录会跳到第一行,以下代码可以使记录仍然定位在当前行 DATA ls_stable TYPE lvc_s_stb ...