版权声明:本文为博主原创文章,未经博主允许不得转载。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 Yimage.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");  }}

Java iText生成PDF文档相关推荐

  1. java pdf 首行缩进_java使用iText生成pdf文档的对齐方式

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

  2. java使用iText生成pdf文档的对齐方式

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

  3. Java:iText生成pdf文档

    依赖 <!-- pdf:start --> <dependency><groupId>com.itextpdf</groupId><artifac ...

  4. java pdf_Java 生成 PDF 文档

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持 iText,生成PDF文档,还支持将XM ...

  5. 手把手教你使用 Java 在线生成 pdf 文档

    一.介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票.订单的库存打印单.各种电子签署合同等等,以方便用户查 ...

  6. itext生成pdf文档加载中文字体解决方法

    最近接手一个任务,在网页中通过用户的输入的信息生成一个pdf文档并且下载到用户本地.iText是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML. ...

  7. 【PDF】java使用Itext生成pdf文档--详解

    [API接口] 一.Itext简介 API地址:javadoc/index.html:如 D:/MyJAR/原JAR包/PDF/itext-5.5.3/itextpdf-5.5.3-javadoc/i ...

  8. java itext 生成word文档

    /**       *  创建word文档 步骤:          * 1,建立文档          * 2,创建一个书写器          * 3,打开文档          * 4,向文档中 ...

  9. itext生成pdf文档时给文档添加背景图片

    像往常一样将图片加载到文档即可,只不过,要将图片缩放到整个文档,换句话说,图片的初始位置是 0,0大小就是文档的大小,比如你创建A4纸大的文档,图片就应该缩放到大小(595,842),其他的纸张可以去 ...

最新文章

  1. Mob统计分析数据模型理解
  2. 阿里巴巴Java“代码反潜机”P3C喜提首届中国优秀开源项目二等奖!
  3. apache目录的访问控制
  4. Nginx 配置文件详细说明
  5. python处理期货数据_用Python下载并分析期货持仓数据
  6. if函数判断单元格颜色_IF条件函数10大用法完整版,全会是高手,配合SUMIF,VLOOKUP更逆天...
  7. 面试题:赛马最快N匹
  8. 【游戏开发实战】权游红袍女在火中看到了什么,我看到了...(Unity | 粒子系统 | 火焰特效 | ParticleSystem | 手把手制作)
  9. linux 网络配置 nm_controlled,[转帖]NM_CONTROLLED的含义以及网卡配置参数
  10. ios android 跨平台工具,15个很优秀的跨平台的移动开发工具
  11. 使用graphviz画树
  12. 牛客多校第九场K-The Flee Plan of Groundhog(树形DP)
  13. Chrome谷歌浏览器关闭弹出Chrome版本太旧提示框
  14. 汽车电子行业英文缩写大全(不断更新)
  15. linux中分隔符IFS
  16. 如何用成长型思维赋能敏捷
  17. shell之读取/etc/passwd中user及其id
  18. 裴蜀定理(或 贝祖定理 )
  19. tab切换组件nz-tab
  20. 如何实现水泥窑分散点信号集中控制?

热门文章

  1. 【电力电子技术课程设计】单相交流调压电路Simulink仿真
  2. qt android usb开发,QT5检测USB设备
  3. 开发新人有必要考虑在工作一年后跳槽
  4. [转帖]希捷硬盘的命名规范
  5. 意派epub360 html 代码,《意派H5模板使用修改通用教程》
  6. 推荐大家一个寄快递便宜的平台!
  7. python关键词_python与seo,Python批量挖掘百度凤巢关键词
  8. 【React】redux和React-redux
  9. 用python求几个整数的和_python里面整数
  10. 超级计算机summit存储容量,天河3号超级计算机 我国正在开发超级计算机 将比”天河一号”快200倍...