iText是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF文档,而且可以将Html文件转化为PDF文件。

导入依赖

com.itextpdfitextpdf5.5.13com.itextpdfitext-asian5.2.0com.itextpdf.toolxmlworker5.5.13

生成PDF文件

//创建文本对象Document document = new Document(PageSize.A4);File attachPdfFile = new File(filePath);attachPdfFile.createNewFile();//PdfWriter是iText编辑PDF文档的编辑器// 为该Document创建一个Writer实例PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(attachPdfFile));//打开documentdocument.open();//插入段落文字Paragraph textgraph = new Paragraph(text);textgraph.setAlignment(Element.ALIGN_CENTER);textgraph.setSpacingBefore(40f);document.add(textgraph);//关闭 documentdocument.close();

合并PDF文件

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outputPath));//打开docuemntdocument.open();for (String pdfPath : pdfList) {PdfReader reader = new PdfReader(pdfPath);for (int i = 1; i <= reader.getNumberOfPages(); i++) {PdfImportedPage page = writer.getImportedPage(reader, i);Image image = Image.getInstance(page);image.setAlignment(Image.ALIGN_CENTER);image.scalePercent(80); //依照比例缩放document.add(image);document.newPage();}}//关闭documentdocument.close();

HTML转PDF文件

// 为该Document创建一个Writer实例PdfWriter pdfwriter = PdfWriter.getInstance(document, new FileOutputStream(pdfFile));pdfwriter.setViewerPreferences(PdfWriter.HideToolbar);// 打开documentdocument.open();XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);fontImp.register(fontFilePath);byte b[] = content.getBytes(StandardCharsets.UTF_8); //这里是必须要设置编码的,不然导出中文就会乱码。ByteArrayInputStream bais = new ByteArrayInputStream(b);//将字节数组包装到流中XMLWorkerHelper.getInstance().parseXHtml(pdfwriter, document, bais, Charset.forName("UTF-8"), fontImp);bais.close();//关闭documentdocument.close();

Document:文档对象

构造方法:

Document(Rectangle pageSize, float marginLeft, float marginRight, float marginTop, float marginBottom)

指定PDF的页面大小,页边距。

默认 Document()为:A4,36,36,36,36

属性信息:

//为pdf添加属性信息document.addAuthor("作者");document.addTitle("标题");document.addSubject("主题");document.addKeywords("关键字");document.addCreator("创建者");

添加文字段落:

//创建一个文字段落Paragraph graph = new Paragraph(text);//把段落加入到文档中document.add(graph);

添加空页面:

//添加新的一页document.newPage();document.add(new Paragraph(text));

是否显示空白页:

//显示空内容的页writer.setPageEmpty(false);

设置页面边距

//页边空白document.setMargins(10, 20, 30, 40);

Rectangle:页面对象

构造方法:

Rectangle(float llx, float lly, float urx, float ury)

llx 为Left ,lly 为Bottom, urx 为Right,ury 为Top

指定页面属性:

// 页面的属性// 页面大小// A4,PageSize封装了大量常用的Rectangle数据Rectangle tRectangle = PageSize.A4;// 长宽Rectangle tRectangle = new Rectangle(800, 600);// 等于上面Rectangle tRectangle = new Rectangle(0, 0, 800, 600);// 横向tRectangle = tRectangle.rotate();// 其它页面属性,不能和PageSize封装的静态一起使用// 页面背景色tRectangle.setBackgroundColor(BaseColor.ORANGE);// 边框tRectangle.setBorder(1220);// 边框颜色tRectangle.setBorderColor(BaseColor.BLUE);// 边框宽度tRectangle.setBorderWidth(15.2f);//创建文本对象Document document = new Document(tRectangle);

也可以直接使用PageSize来获取常用的Rectangle页面对象

//默认PageSize.A4, 36, 36, 36, 36Document document = new Document();//A4,等效于上面Document document = new Document(PageSize.A4);//横向A4Document document = new Document(PageSize.A4.rotate());//A4,页边距50Document document = new Document(PageSize.A4, 50, 50, 50, 50);

Font:字体对象

  • BaseFont:确认支持中文
  • Font:字体的设置,如颜色,字体,大小等
Font fontChinese = null;try {// 不同字体(这里定义为同一种字体:包含不同字号、不同style)BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);fontChinese = new Font(bfChinese, 18, Font.BOLD);} catch (Exception e) {e.printStackTrace();}

Paragraph:段落对象

Paragraph tParagraph = new Paragraph(text, getChineseFont());tParagraph.setAlignment(Element.ALIGN_JUSTIFIED);// 对齐方式tParagraph.setIndentationLeft(12);// 左缩进tParagraph.setIndentationRight(12);// 右缩进tParagraph.setFirstLineIndent(24);// 首行缩进tParagraph.setLeading(20f);// 行间距tParagraph.setSpacingBefore(5f);// 设置段落上空白tParagraph.setSpacingAfter(10f);// 设置段落下空白document.add(tParagraph);

Image:图像对象

Image继承自Rectangle

初始化方式:

Image img = Image.getInstance(imagePath)

向PDF中插入图片

// 图片Image对象Image img = Image.getInstance("source/imag/bage.png");img.setAlignment(Image.LEFT);//图片对齐方式img.setBorder(Image.BOX);//边框类型img.setBorderWidth(10);//边框宽度img.setBorderColor(BaseColor.WHITE);//边框颜色img.scaleToFit(1000, 72);// 大小img.setRotationDegrees(-30);// 旋转img.setAbsolutePosition(0, 0);//设置图片绝对位置document.add(img);

Anchor:锚点、超链接

超链接:

// 超链接Paragraph graph = new Paragraph();Anchor dest = new Anchor("超链接", font);dest.setReference("http://www.baidu.com");//超链接graph.add(dest);document.add(graph);

锚点:

// 锚点Paragraph dstgraph = new Paragraph();Anchor dest = new Anchor("我是锚点A", font);dest.setName("TOM"); //设置锚点A的名字dstgraph.add(dest);document.add(dstgraph);Paragraph srcgraph = new Paragraph();Anchor src = new Anchor("我是锚点B,链接到锚点A", font);src.setReference("#TOM");//取到锚点Asrcgraph.add(src);document.add(srcgraph);

PdfContentByte:层对象

PDF有四层结构,一、四层可操作;二、三层Itext内部处理。

可以通过PdfContentByte 实现添加水印、背景、添加内容到绝对位置、合并PDF等

操作方式:

PdfWriter 对象:

第 1 层操作:PdfWriter. getDirectContent(),//默认当前页
第 2 层操作:getDirectContentUnder()。

PdfStamper 对象:

第 1 层操作: PdfStamper. getUnderContent(1),//可以加页数
第 2 层操作: PdfStamper .getOverContent(1)。

添加文字水印:

PdfStamper方式:

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(outPdfPath)));PdfReader reader = new PdfReader(inPdfPath);PdfStamper stamper = new PdfStamper(reader, bos);int total = reader.getNumberOfPages();PdfContentByte content;//参数:字体参数,字体编码格式,是否将字体信息嵌入到pdf中(一般不需要嵌入),字体大小BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);//设置水印透明度PdfGState gs = new PdfGState();// 设置填充字体不透明度为0.4fgs.setFillOpacity(0.45f);for (int i = 1; i <= total; i++) {//content = stamper.getOverContent(i);//在内容上方加水印content = stamper.getUnderContent(i);//在内容下方加水印//设置水印透明度content.setGState(gs);//开始写入content.beginText();//水印颜色content.setColorFill(Color.LIGHT_GRAY);//设置字体和大小content.setFontAndSize(bf, 50);//设置文字输出位置content.setTextMatrix(70, 200);// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度content.showTextAligned(Element.ALIGN_CENTER, waterMarkText, 300, 350, 50);//结束写入content.endText();}stamper.close();

showTextAligned参数分别是:文字对齐方式,位置内容,输出水印X轴位置,Y轴位置,旋转角度。

PdfWriter方式:

PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath));// 打开文档document.open();// 获取当前页的第二层PdfContentByte content = pdfWriter.getDirectContentUnder();// 开始写入content.beginText();// 设置水印透明度PdfGState gs = new PdfGState();// 设置填充字体不透明度为0.4fgs.setFillOpacity(0.4f);//参数:字体参数,字体编码格式,是否将字体信息嵌入到pdf中(一般不需要嵌入),字体大小BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);try {// 设置水印字体及大小 content.setFontAndSize(bf, 50);// 设置透明度content.setGState(gs);// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度content.showTextAligned(Element.ALIGN_RIGHT, waterMarkText, 300, 350, 50);// 设置水印颜色content.setColorFill(BaseColor.GRAY);//结束设置content.endText();content.stroke();} catch (IOException e) {e.printStackTrace();}// 加入文档内容document.add(new Paragraph("hello world"));// 关闭文档document.close();pdfWriter.close();

添加图片水印:

// 加入水印PdfContentByte content = pdfWriter.getDirectContentUnder();// 开始设置水印content.beginText();// 设置水印透明度PdfGState gs = new PdfGState();// 设置笔触字体不透明度为0.4fgs.setStrokeOpacity(0.4f);Image image = Image.getInstance(imageFilePath);// 设置坐标 绝对位置 X Yimage.setAbsolutePosition(200, 300);// 设置旋转弧度image.setRotation(30);// 旋转 弧度// 设置旋转角度image.setRotationDegrees(45);// 旋转 角度// 设置等比缩放image.scalePercent(90);// 依照比例缩放// image.scaleAbsolute(200,100);//自定义大小// 设置透明度content.setGState(gs);// 添加水印图片content.addImage(image);// 结束设置content.endText();content.stroke();

常见错误:​​​​​​​

1、使用PdfReader读取Pdf文件时报错:

java.lang.ClassNotFoundException: org.bouncycastle.crypto.engines.AESFastEng

报错原因:pdf文件被用户加密了。

解决办法:引入org.bouncycastle依赖

org.bouncycastlebcprov-jdk15on1.70

2、使用PdfReader读取Pdf文件时报错:

PdfReader not opened with owner password

报错原因:pdf文件被用户加密了。

解决办法:在创建pdfReader实例后,加一行代码:

PdfReader.unethicalreading = true;