版权声明:本文为博主原创文章,未经博主允许不得转载。https://mp.csdn.net/mdeditor/83963600#
1、简介
iText是一个非常著名的能够快速产生PDF文件的Java类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合。iText的安装非常方便,在http://itextpdf.com/ 网站上下载itextpdf.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。
2、生成一个PDF文档基本步骤
2.1建立com.itextpdf.text.Document对象的实例。
Document document = new Document();
2.2建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
PdfWriter writer=PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF"));
writer.setViewerPreferences(PdfWriter.PageModeUseThumbs);
//通过public Rectangle(float llx, float lly, float urx, float ury)可以随意改变左下角的位置。。
Rectangle rect = new Rectangle(36,36,559,788);
rect.setBorderColor(BaseColor.BLACK);
writer.setBoxSize("art", rect);
HeaderFooter header=new HeaderFooter();
//Itext提供了一个很实用的类PageSize,它的作用就是返回static final Rectangle对象的集合。提供了标准化的页面大小。如下所示即为A4页面大小。
document.setPageSize(PageSize.A4);
如果想横向打印 则设置如下:其中函数rotate()即为控制横向显示函数。
Document document = new Document(PageSize.A4.rotate());
2.3、打开文档:
document.open();
2.4、把内容写入文档:
document.add(new Paragraph("Hello World"));
2.5关闭文档:
document.close();
3、iText创建文本
iText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。
文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为10、带下划线的字符串:
Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));
短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块 (Chunk)无效。通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中, 如:
Phrase phr=new Phrase();
phr.add(chunk);
段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成,相当于WORD文档中的段落概念,同样可以设定段落 的字体大小、颜色等属性。另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。通过函数setAlignment可以设定段落的对齐方 式,setAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。
基本代码实例如下:
document.add(new Paragraph("\r\n\r\n\r\n\r\n"));
//创建段落
Paragraph p=new Paragraph();
//设置段落字体大小
p.setFont(TestPdf.bigmaxfont);
//设置段落水平居中显示
p.setAlignment(Element.ALIGN_CENTER);
//添加段落文字
p.add("Helloworld pdf !");
//设置行间距
p.setLeading(20.0f);
//添加到Document对象的实例中。
document.add(p);
4、iText创建表格
iText中处理表格有点复杂,下面我们先介绍一下表格创建的基本流程,创建代码如下所示:
//创建表格实例对象,其中6为表格的列数。
PdfPTable table = new PdfPTable(6);
//设置表格宽度。
table .setTotalWidth(495);
PdfPCell cell = new PdfPCell();
//设置边框色
cellsetBorderColor(color);
//设置单元格的最小高度
cell.setMinimumHeight(FixedHeight);
//设置垂直居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//设置水平居中
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
//设置单元格占几列,此处主要为表格中合并单元格使用,可用setRowspan设置单元格占的行数。
cell.setColspan(colspan);
//设置字体
cell.setPhrase(new com.itextpdf.text.Phrase(value,font));
//设置单元格的Padding值
cell.setPaddingLeft(1);
cell.setPaddingRight(1);
cell.setPaddingTop(5.0f);
cell.setPaddingBottom(5.0f);
//设置行间距。fixedLeading,multipliedLeading
cell.setLeading(1f,1f );
//将PdfPCell对象添加到表格中。
table.addCell(cell)
值得注意的注意的在我们使用 cell.setColspan(colspan)或cell.setRowspan(colspan)合并单元格时,当一行合并出错时,下面的行列将全部出错,这时我们只需要修正出错行即可。
5、图片处理
iText中处理图片的类为com.itextpdf.text.Image,目前iText支持的图像格式有:GIF, Jpeg, PNG, wmf等格式,对于不同的图像格式,iText用同样的构造函数自动识别图像格式。通过下面的代码分别获得gif、jpg、png图像的实例。
Image img = Image.getInstance(imgfilepath);//imgfilepath可以是GIF, Jpeg, PNG, wmf等格式的图片
5.1、图像的位置
图像的位置主要是指图像在文档中的对齐方式、图像和文本的位置关系。IText中通过函数public void setAlignment(int alignment)进行处理,参数alignment为Image.RIGHT、Image.MIDDLE、Image.LEFT分别指右对齐、居中、 左对齐;当参数alignment为Image.TEXTWRAP、Image.UNDERLYING分别指文字绕图形显示、图形作为文字的背景显示。这 两种参数可以结合以达到预期的效果,如setAlignment(Image.RIGHT|Image.TEXTWRAP)显示的效果为图像右对齐,文字 围绕图像显示。
5.2、图像的尺寸和旋转
如果图像在文档中不按原尺寸显示,可以通过下面的函数进行设定:
public void scaleAbsolute(int newWidth, int newHeight)
public void scalePercent(int percent)
public void scalePercent(int percentX, int percentY)
函数public void scaleAbsolute(int newWidth, int newHeight)直接设定显示尺寸;函数public void scalePercent(int percent)设定显示比例,如scalePercent(50)表示显示的大小为原尺寸的50%;而函数scalePercent(int percentX, int percentY)则图像高宽的显示比例。
如果图像需要旋转一定角度之后在文档中显示,可以通过函数public void setRotation(double r)设定,参数r为弧度,如果旋转角度为30度,则参数r= Math.PI / 6。
6、iText水印
在iText添加水印时可有两种方式,第一种是文本水印;第二种是图片水印。
6.1、iText文本水印
添加文本水印的代码如下所示:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfWriter;
public class pdfDemo {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
//创建实例实现A4纸页面
Document document = new Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance(document,new FileOutputStream("d:/demo.pdf"));
document.open();
// 加入水印
PdfContentByte waterMar = pdfWriter.getDirectContentUnder();
// 开始设置水印
waterMar.beginText();
// 设置水印透明度
PdfGState gs = new PdfGState();
// 设置填充字体不透明度为0.4f
gs.setFillOpacity(0.4f);
try {
// 设置水印字体参数及大小 (字体参数,字体编码格式,是否将字体信息嵌入到pdf中(一般不需要嵌入),字体大小)
waterMar.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED), 80);
// 设置透明度
waterMar.setGState(gs);
// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
waterMar.showTextAligned(Element.ALIGN_RIGHT, "www.itextpdf.com" , 500, 500, 50);
// 设置水印颜色
waterMar.setColorFill(BaseColor.GRAY);
//结束设置
waterMar.endText();
waterMar.stroke();
} catch (IOException e) {
e.printStackTrace();
}finally {
waterMar = null;
gs = null;
}
// 关闭文档
document.close();
pdfWriter.close();
}
}
6.2、iText图片水印
图片水印与文本水印有些相似,具体操作代码如下所示:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfWriter;
public class pdfDemo{
public static void main(String[] args) throws FileNotFoundException, DocumentException {
Document document = new Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance(document,new FileOutputStream("d:/demo.pdf"));
// 打开文档
document.open();
document.newPage();
// 加入水印
PdfContentByte waterMar = pdfWriter.getDirectContentUnder();
// 开始设置水印
waterMar.beginText();
// 设置水印透明度
PdfGState gs = new PdfGState();
// 设置字体不透明度为0.4f
gs.setStrokeOpacity(0.4f);
try {
Image image = Image.getInstance("d:/demo.jpg");
// 设置坐标 绝对位置 X Y
image.setAbsolutePosition(300, 300);
// 设置旋转弧度
image.setRotation(30);
// 旋转 弧度 // 设置旋转角度
image.setRotationDegrees(50);
// 旋转 角度 // 设置等比缩放
image.scalePercent(90);
// 依照比例缩放
// image.scaleAbsolute(200,200);
//自定义大小 // 设置透明度
waterMar.setGState(gs);
// 添加水印图片
waterMar.addImage(image);
// 设置透明度
waterMar.setGState(gs);
//结束设置
waterMar.endText();
waterMar.stroke();
} catch (IOException e) {
e.printStackTrace();
}finally {
waterMar = null;
gs = null;
}
// 关闭文档
document.close();
pdfWriter.close();
}
}
6.3、添加水印并铺满全页
在实际需求中有时候我们还会遇到另外一种情况:添加水印并铺满全页。处理示例如下所示:
import java.io.FileOutputStream;
import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
public class TestwaterMark {
private static int interval = -5;
public static void waterMark(String inputFile,
String outputFile, String waterMarkName) {
try {
PdfReader reader = new PdfReader(inputFile);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
outputFile));
BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
Rectangle pageRect = null;
// 设置水印透明度
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.3f);
// 设置字体不透明度为0.4f
gs.setStrokeOpacity(0.4f);
//文档页数。
int total = reader.getNumberOfPages() + 1;
//水印最大高度
int textH =30;
int textW =30;
PdfContentByte under;
for (int i = 1; i < total; i++) {
pageRect = reader.getPageSizeWithRotation(i);
under = stamper.getOverContent(i);
under.saveState();
under.setGState(gs);
under.beginText();
under.setFontAndSize(base, 20);
// 水印文字成30度角倾斜
//你可以随心所欲的改你自己想要的角度
for (int height = interval + textH; height < pageRect.getHeight();
height = height + textH*3) {
for (int width = interval + textW; width < pageRect.getWidth() + textW;
width = width + textW*2) {
under.showTextAligned(Element.ALIGN_LEFT
, waterMarkName, width - textW,
height - textH, 30);
}
}
// 添加水印文字
under.endText();
}
stamper.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
waterMark("c:/test.pdf", "c:/test1.pdf", "test");
}
}