您的位置:首页 > 编程语言 > Java开发

java读取生成PDF,iText操作PDF

2014-01-20 15:36 417 查看
package com.lbl.itext;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;

import com.itextpdf.text.Anchor;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chapter;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.Section;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;

/**
* iText是一个PDF的类库
* <p>
* iText是提供了一组API,允许开发人员做一下的事情:(不仅仅局限以下、还有更多可以做的):
* <p>
* <ui>
* <li>从xml或者数据库生成文档或者报表
* <li>制作绘图和书籍,开拓很多PDF中的交互特性
* <li>在现有的PDF中增加书签,页码,水印,和其他特性
* <li>切分或者整合存在的PDF文件
* <li>填写互动表格
* <li>在WEB浏览器中提供动态生成和操作PDF的服务
* </ui>
*
* @author liubenlong
*
*/
public class ITextTest{

@Test
public void myFirstPdf(){
//新建一个文档
Document document = new Document();
try {
//建立一个书写器(Writer)与document对象关联
PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf"));
//打开一个文档
document.open();
//向文档中添加一段文字:hello world!
document.add(new Paragraph("hello world!"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}finally{
document.close();
}

}

/**
* 给文档设置背景颜色、边框、外边距
*/
@Test
public void myFirstPdfWithSimpleStyle(){
//定义一个A4大小的矩形组件(Rectangle:矩形)
Rectangle rect = new Rectangle(PageSize.A4);
//设置背景色为浅灰色
rect.setBackgroundColor(BaseColor.LIGHT_GRAY);
//设置border类型为box(四周都有)
rect.setBorder(Rectangle.BOX);
//设置border颜色为深灰色
rect.setBorderColor(BaseColor.RED);
//设置border宽度为5
rect.setBorderWidth(5);
//创建一个文档,将rect作为预设的样式传入,后面的10,10,10,10是文档的外边距
Document document = new Document(rect,10,10,10,10);
try {
PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf"));
document.open();
document.add(new Paragraph("hello world!"));

//如果你希望一些块有下划线或删除线
Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));
chunk1.setBackground(new BaseColor(0xFF, 0xFF, 0x00));
document.add(new Paragraph(chunk1));
Chunk chunk2 = new Chunk("This font is of type ITALIC | STRIKETHRU", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.ITALIC | Font.STRIKETHRU));
document.add(new Paragraph(chunk2));

Paragraph p1 = new Paragraph(new Chunk("This is my first paragraph.", FontFactory.getFont(FontFactory.HELVETICA, 12)));//块
Paragraph p2 = new Paragraph(new Phrase("This is my second paragraph.", FontFactory.getFont(FontFactory.HELVETICA, 12)));//短句
Paragraph p3 = new Paragraph("This is my third paragraph.", FontFactory.getFont(FontFactory.HELVETICA, 12));//段落

document.add(p1);
document.add(p2);
document.add(p3);

Anchor anchor = new Anchor("baidu", FontFactory.getFont(FontFactory.HELVETICA, 12f, Font.UNDERLINE, new BaseColor(0, 0, 255)));
anchor.setReference("http://www.baidu.com");
document.add(anchor);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}finally{
document.close();
}
}

/**
* 设置阅读器的参数
* <p>
* <b>设置阅读器参数的一些静态变量含义</b>
* <table width="500" border="1">
* <tr>
* <td>类型</td>
* <td>静态变量名</td>
* <td>作用</td>
* </tr>
* <tr>
* <td rowspan="4">页面布局</td>
* <td>PdfWriter.PageLayoutSinglePage</td>
* <td>同时只显示一个页面</td>
* </tr>
* <tr>
* <td>PdfWriter.PageLayoutOneColumn </td>
* <td>单列显示</td>
* </tr>
* <tr>
* <td>PdfWriter.PageLayoutTwoColumnLeft</td>
* <td>双列显示,奇数页在左</td>
* </tr>
* <tr>
* <td>PdfWriter.PageLayoutTwoColumnRight</td>
* <td>同时只显示一个页面</td>
* </tr>
* <tr>
* <td rowspan="9">页面模式</td>
* <td>PdfWriter.PageModeUseNone</td>
* <td>既不显示大钢也不显示缩略图</td>
* </tr>
* <tr>
* <td>PdfWriter.PageModeUseOutlines </td>
* <td>显示大纲</td>
* </tr>
<tr>
<td>PdfWriter.PageModeUseThumbs</td>
<td>显示缩略图</td>
</tr>
<tr>
<td>PdfWriter.PageModeFullScreen </td>
<td>全屏模式,没有菜单、windows控件或者其他任何windows可见控件</td>
</tr>
<tr>
<td>PdfWriter.HideToolbar</td>
<td>当文档激活时,是否隐藏阅读程序(如Adobe Reader)的工具条</td>
</tr>
<tr>
<td>PdfWriter.HideMenubar</td>
<td>当文档激活时,是否隐藏阅读程序的菜单</td>
</tr>
<tr>
<td>PdfWriter.HideWindowUI </td>
<td>当文档激活时,是否隐藏阅读程序的界面元素,如滚动条、导航条等,而仅仅保留文档显示</td>
</tr>
<tr>
<td>PdfWriter.FitWindow	</td>
<td>是否调整文档窗口尺寸以适合显示第一页</td>
</tr>
<tr>
<td>PdfWriter.CenterWindow</td>
<td>是否将文档窗口放到屏幕中央</td>
</tr>
<tr>
<td rowspan="3">全屏模式下页面布局</td>
<td>PdfWriter.NonFullScreenPageModeUseNone</td>
<td>既不显示大钢也不显示缩略图</td>
</tr>
<tr>
<td>PdfWriter.NonFullScreenPageModeUseOutlines</td>
<td>显示大钢</td>
</tr>
<tr>
<td>PdfWriter.NonFullScreenPageModeUseThumbs</td>
<td>显示缩略图</td>
</tr>
</table>
*/
@Test
public void myFirstPdfWithParam(){
Document document = new Document();
try {
PdfWriter pdf = PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf"));
/**
* PdfWriter.PageModeUseThumbs:显示缩略图
* PdfWriter.PageLayoutTwoColumnLeft:双列显示,奇数页在左
* PdfWriter.HideMenubar:隐藏阅读程序的菜单
*/
pdf.setViewerPreferences(PdfWriter.PageModeUseThumbs|PdfWriter.PageLayoutTwoColumnLeft|PdfWriter.HideMenubar);
document.open();
for (int i = 0; i < 50; i++) {
document.add(new Paragraph("hello world!"));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}finally{
document.close();
}
}

/**
* 设置文档密码权限
* 注意:这里需要添加包:bcprov-jdk15on-147.jar否则会报下面这个错误
* java.lang.ClassNotFoundException: org.bouncycastle.asn1.ASN1Primitive
*
* 但是bcprov-jdk16-1.44不行,原因待查
* <p>
* <b>设置文档权限相关静态变量含义</b>
* <p>
* 下列表列出了文档许可参数设置的含义,不过要注意,如果你用40bit进行加密,那么标注为128bit的会自动的被禁止,如果你想要取消这些许可,你必须用128bit进行加密,显而易见,用128bit进行加密提供了更高的安全级别。
* <table width="500" border="1">
* <tr>
* 	<td>静态变量名</td>
* 	<td>作用</td>
* 	<td>标注</td>
* </tr>
* <tr>
* 	<td>PdfWriter. ALLOW_ASSEMBLY</td>
* 	<td>插入、删除、旋转页面、加入书签的允许。内容不能被改变、除非PdfWriter. ALLOW_MODIFY_CONTENTS设置了许可</td>
* 	<td>128bit</td>
* </tr>
* <tr>
* 	<td>PdfWriter. ALLOW_COPY</td>
* 	<td>拷贝或者提取文本或者图像的许可</td>
* 	<td></td>
* </tr>
* <tr>
* 	<td>PdfWriter. ALLOW_DEGRADED_PRINTING</td>
* 	<td>Printing the document, but not with the quality offered by PdfWriter.Allow-Printing.</td>
* 	<td>128bit</td>
* </tr>
* <tr>
* 	<td>PdfWriter. ALLOW_FILL_IN</td>
* 	<td>填充表单域许可</td>
* 	<td>128bit</td>
* </tr>
* <tr>
* 	<td>PdfWriter. ALLOW_MODIFY_ANNOTATIONS</td>
* 	<td>填写注释许可</td>
* 	<td></td>
* </tr>
* <tr>
* 	<td>PdfWriter. ALLOW_MODIFY_CONTENTS</td>
* 	<td>修改内容许可,比如改变页面内容、或者插入删除页面</td>
* 	<td></td>
* </tr>
* <tr>
* 	<td>PdfWriter. ALLOW_PRINTING</td>
* 	<td>允许打印文档</td>
* 	<td></td>
* </tr>
* <tr>
* 	<td>PdfWriter. ALLOW_SCREENREADERS</td>
* 	<td>Extracting text and graphics for use by accessibility devices.</td>
* 	<td>128bit</td>
* </tr>
* </table>
* <p>
* 如果你想取消拷贝或者保存PDF文件的许可,这样是很难做到的,你不能使abode reader的Save(Save as)命令取消,这不是iText的bug,而是PDF本身带来的安全问题,如果你真想这么做的话,你必须利用digital rights management(数字版权加密保护技术)作为解决方案,有许多这样的技术提供者,但是这些工具是相当昂贵的
*/
@Test
public void myFirstPdfWithPassword(){
Document document = new Document();
try {
PdfWriter pdf = PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf"));
/**
* 第一个参数是设置userPassword为123
* 第二个参数是设置ownerPassword为1234
* 第三个参数设置user的权限可以复制、可以打印
* 第四个参数设置加密类型
*/
pdf.setEncryption(
new byte[]{'1','2','3'},
new byte[]{'1','2','3','4'},
PdfWriter.ALLOW_COPY|PdfWriter.ALLOW_PRINTING ,
PdfWriter.STANDARD_ENCRYPTION_40);
document.open();
document.add(new Paragraph("hello world!"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}finally{
if(document.isOpen())document.close();
}
}

/**
* 中文PDF
* 由于itext默认是不支持亚洲文字的,如果要想使用中文,则必须在应用中应用亚洲语言包(itext-asian.jar)
*/
@Test
public void myFirstPdfWithChinese(){
Document document = new Document();
try {
PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf"));
BaseFont base = null;
Font fontChinese = null;
try {
//创建一个简体中文的基本字体、UniGB-UCS2-H为简体中文
base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.EMBEDDED);
fontChinese = new Font(base, 12, Font.NORMAL);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
document.open();
//设置文档中文字为简体中文
document.add(new Paragraph("大家好!",fontChinese));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}finally{
System.out.println(document.isOpen());
document.close();
}

}

public static void main(String[] args) {
try {
/** *//**
* 首先,创建一个document。
* document是PDF文档中所有元素的容器。
* 第一个参数表示页的大小,其后的参数分别表示左、右、上、下的边距。
*/
Document document = new Document(PageSize.A4, 50, 50, 50, 50);

/** *//**
* 此处创建的write定义了上面创建的document的类型。
* 除了PdfWriter以为,还有HtmlWriter, RtfWriter, XmlWriter和一些别的类型。
* 第一个参数引用document对象,第二个参数指定了输出文件的绝对路径。
* 接着,我们open这个document往里边写入数据。
*/
PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream("c:/ITextTest.pdf"));
writer.setViewerPreferences(PdfWriter.HideMenubar | PdfWriter.HideToolbar); // 隐藏菜单栏和工具栏
document.open();

/** *//**
* 现在,我们往document的第一页中加入一些文本内容。
* 所有的文本都要使用com.lowagie.text.Paragraph才能添加。
* 可以创建一个默认的paragraph,使用默认的字体,颜色,尺寸等属性,也可使使用自己定义的字体。
* 下面分别进行了这两种操作。
*/
document.add(new Paragraph("First page of the document."));
document.add(new Paragraph(
"Some more text on the first page with different color and font type.",
FontFactory.getFont(FontFactory.COURIER, 14f,Font.BOLD, new BaseColor(255, 150, 200))));

/** *//**
* 接下来,我们往document中添加一些复杂的元素。
* 让我们从创建一个新的chapter开始。
* chapter是一个特殊的部分,它将从新的一页开始,默认显示数字序号。
*/
Paragraph title1 = new Paragraph(
"Chapter 1",
FontFactory.getFont(FontFactory.HELVETICA, 18f, Font.BOLDITALIC, new BaseColor(0, 0,255)));
Chapter chapter1 = new Chapter(title1, 1);
chapter1.setNumberDepth(0);

/** *//**
* Section是chapter的一个子元素。
* 在下面的代码中我们创建了一个题为"This is Section 1 in Chapter 1" 的Section。
* 为了在Section下添加文本,我们再创建一个Paragraph对象,将其增加到Section对象中。
*/
Paragraph title11 = new Paragraph("This is Section 1 in Chapter 1",
FontFactory.getFont(FontFactory.HELVETICA, 16f, Font.BOLD,
new BaseColor(255, 0, 0)));
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);

//            /** *//**
//             * 接着,再创建一个表格(table)对象。
//             * 表格中含有一个行和列的矩阵。
//             * 一行中的单元格(cell)可以延伸到多列。
//             * 同样的,一列中的单元格可以延伸到多行。
//             * 因此,一个3x2的表格不需要6个单元格。
//             */
//            Table t = new Table(3, 2);
//            //设置边框颜色。如果颜色和背景色一样,则边框不会显示出来
//            t.setBorderColor(Color.white);
//            //设置单元格内文本的间距
//            t.setPadding(5);
//            //设置相邻单元格的间距
//            t.setSpacing(5);
//            t.setBorderWidth(1);
//
//            /** *//**
//             * 然后,创建3个单元格对象,包含不同的内容。
//             * 依次将其放入表格中。
//             * 先放在第一行第一列,再放在同一行的下一列中,……
//             * 当一行填满之后,下一个单元格将放在下一行的第一列中。
//             * 只给定单元格的内容(不新建单元格)也可以新增一个单元格,比如t.addCell("1.1");。
//             * 最后,将表格添加到Section对象中。
//             */
//            Cell c1 = new Cell("Header1");
//            //设置单元格边框颜色,设置方法和表格边框一样
//            c1.setBorderColor(Color.WHITE);
//            t.addCell(c1);
//            c1 = new Cell("Header2");
//            t.addCell(c1);
//            c1 = new Cell("Header3");
//            t.addCell(c1);
//            t.addCell("1.1");
//            t.addCell("1.2");
//            t.addCell("1.3");
//            section1.add(t);

/** *//**
* 接下来,往PDF文档中添加一个列表(List)。
* 一个列表包含许多列表项(ListItem)。
* 列表可以编号也可以不编号。
* 将List的第一个参数置true表示创建的是一个编号的列表;
* 第二个参数表示是否使用字母编号,true为使用字母,false为使用数字
* 第三个参数为缩进值。
*/
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);

/** *//**
* 将chapter放入document中。
* 关闭document。
*/
document.add(chapter1);
document.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}

 

需要导入的包:



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java iText