当前位置: 首页 > news >正文

java使用itext 直接生成pdf

itext 使用

  • 需求背景
  • itext 的使用
    • 依赖
    • 简单示例
    • 基础设置(页面大小、边距、字体等)
    • 段落内部,特殊设置关键字 字体或颜色
    • 生成动态表格
    • 页脚展示页数
    • 其他
      • 设置密码
      • 添加水印(背景图)
      • 目录
      • Header, Footer
      • 分割 PDF
      • 合并 PDF

需求背景

在工作中经常会有生成pdf文件的需求,大多数情况下,我们只需要使用pdf模版添加表单域,就足以胜任了。但是有一些特殊的需求,需要生成较为复杂的文件,如动态数据表格、插入图像等。
这时候,我们就可以使用拼接的方式,将pdf文件内容一段段拼上去,组合成一个pdf文件,来灵活的操纵文件的排版与内存形式。

itext 的使用

依赖

        <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>

简单示例

生成一个内容为“Hello World”的pdf文件

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfWriter;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;/*** 生成一个内容为“Hello World”的pdf文件* @author ym*/
public class HelloWorld {public static void main(String[] args) {String FILE_DIR = "./"; // 项目根目录:盘符:/.../.../项目名称,注意:点号并不表示当前类文件所在的目录,而是项目目录下//Step 1—Create a Document.  Document document = new Document();try {//Step 2—Get a PdfWriter instance.PdfWriter.getInstance(document, new FileOutputStream(FILE_DIR + "createSamplePDF.pdf"));//Step 3—Open the Document.  document.open();//Step 4—Add content.  document.add(new Paragraph("Hello World"));//Step 5—Close the Document.  document.close();} catch (DocumentException ex) {Logger.getLogger(HelloWorld.class.getName()).log(Level.SEVERE, null, ex);} catch (FileNotFoundException ex) {Logger.getLogger(HelloWorld.class.getName()).log(Level.SEVERE, null, ex);}}
}

基础设置(页面大小、边距、字体等)

      //页面大小  Rectangle rect = new Rectangle(PageSize.A4.rotate());//页面背景色  rect.setBackgroundColor(BaseColor.ORANGE);//  page , 外边距 marginLeft marginRight marginTop marginBottomDocument doc = new Document(rect,90, 90, 30, 40);  // 新开一页doc.newPage();/*** 段落设置*/Paragraph titleParagraph = new Paragraph("hello world!", getChineseTitleFont());titleParagraph.setAlignment(Element.ALIGN_CENTER);// 居中titleParagraph.setFirstLineIndent(24);// 首行缩进titleParagraph.setLeading(35f);// 行间距titleParagraph.setSpacingBefore(5f);// 设置上空白titleParagraph.setSpacingAfter(10f);// 设置段落下空白//支持中文 设置字体,字体颜色、大小等public Font getChineseTitleFont() throws RuntimeException {Font ChineseFont = null;try {/***  name – the name of the font or its location on file *  encoding – the encoding to be applied to this font *  embedded – true if the font is to be embedded in the PDF*/BaseFont simpChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);ChineseFont = new Font(simpChinese, 15, Font.BOLD, BaseColor.BLACK);} catch (DocumentException e) {log.error("getChineseFont" ,"字体异常",e);throw new RuntimeException("getChineseFont字体异常",e);} catch (IOException e) {log.error("getChineseFont" ,"字体异常",e);throw new RuntimeException("getChineseFont字体异常",e);}return ChineseFont;}

段落内部,特殊设置关键字 字体或颜色

// 文本内容
String content = "This is a sample text with different colors.";
String[] words = content.split(" "); // 将文本拆分为单词for (String word : words) {Chunk chunk = new Chunk(word); // 创建一个新的 Chunk// 如果单词是 "different",则设置为红色if (word.equals("different")) {chunk.setForegroundColor(BaseColor.RED);}// 如果单词是 "colors.",则设置为蓝色if (word.equals("colors.")) {chunk.setForegroundColor(BaseColor.BLUE);}contentParagraph.add(chunk); // 将 Chunk 添加到段落中contentParagraph.add(" "); // 添加单词之间的空格
}document.add(contentParagraph); // 将段落添加到文档中

生成动态表格

// 创建一个包含5列的表格PdfPTable table = new PdfPTable(5);// 添加表头table.addCell("Header 1");table.addCell("Header 2");table.addCell("Header 3");table.addCell("Header 4");table.addCell("Header 5");// 添加动态数据到表格for (int i = 0; i < 10; i++) {table.addCell("Data " + i + ", 1");table.addCell("Data " + i + ", 2");table.addCell("Data " + i + ", 3");table.addCell("Data " + i + ", 4");table.addCell("Data " + i + ", 5");}document.add(table);/*** 如果需要更精细的控制属性*/cell = new PdfPCell(new Phrase("title1",fontChinese));cell.setColspan(1);//设置所占列数cell.setRowspan(1);//合并行cell.setHorizontalAlignment(Element.ALIGN_CENTER);//设置水平居中cell.setVerticalAlignment(Element.ALIGN_MIDDLE);//设置垂直居中cell.setFixedHeight(30);//设置高度table.addCell(cell);

页脚展示页数

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILE_DIR + "createSamplePDF.pdf"));writer.setPageEvent(new FooterEvent());public  class FooterEvent extends PdfPageEventHelper {//总页数PdfTemplate totalPage;//字体Font font;{try {BaseFont chinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);font = new Font(chinese,10);} catch (DocumentException | IOException e) {e.printStackTrace();}}//打开文档时,创建一个总页数的模版@Overridepublic void onOpenDocument(PdfWriter writer, Document document) {PdfContentByte cb = writer.getDirectContent();totalPage = cb.createTemplate(50, 9);}@Overridepublic void onEndPage(PdfWriter writer, Document document) {//创建一个两列的表格PdfPTable table = new PdfPTable(2);try {table.setTotalWidth(PageSize.A4.getWidth());//总宽度为A4纸张宽度table.setLockedWidth(true);//锁定列宽table.setWidths(new int[]{50, 50});//设置每列宽度PdfPCell cell = new PdfPCell(new Phrase("第"+document.getPageNumber() + " 页,共", font));cell.setHorizontalAlignment(Element.ALIGN_RIGHT);//设置水平右对齐cell.setVerticalAlignment(Element.ALIGN_MIDDLE);//设置垂直居中cell.disableBorderSide(15);//隐藏全部边框table.addCell(cell);PdfPCell cell1 = new PdfPCell(Image.getInstance(totalPage));//共 页cell1.setHorizontalAlignment(Element.ALIGN_LEFT);//设置水平左对齐cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);//设置垂直居中cell1.disableBorderSide(15);//隐藏全部边框table.addCell(cell1);table.writeSelectedRows(0, -1, 0, 30, writer.getDirectContent());} catch (Exception e) {throw new ExceptionConverter(e);}}@Overridepublic void onCloseDocument(PdfWriter writer, Document document) {String text = "" +String.valueOf(writer.getPageNumber()-1) +"页";ColumnText.showTextAligned(totalPage, Element.ALIGN_MIDDLE, new Paragraph(text, font), 0, 0, 0);}}

其他

设置密码

PdfWriter writer = PdfWriter.getInstance(doc, out);  // 设置密码为:"World"  
writer.setEncryption("Hello".getBytes(), "World".getBytes(),  PdfWriter.ALLOW_SCREENREADERS,  PdfWriter.STANDARD_ENCRYPTION_128);  doc.open();  
doc.add(new Paragraph("Hello World"));  

添加水印(背景图)

//图片水印
PdfReader reader = new PdfReader(FILE_DIR + "setWatermark.pdf");  
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(FILE_DIR  + "setWatermark2.pdf"));  Image img = Image.getInstance("resource/watermark.jpg");  
img.setAbsolutePosition(200, 400);  
PdfContentByte under = stamp.getUnderContent(1);  
under.addImage(img);  //文字水印  
PdfContentByte over = stamp.getOverContent(2);  
over.beginText();  
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI,  BaseFont.EMBEDDED);  
over.setFontAndSize(bf, 18);  
over.setTextMatrix(30, 30);  
over.showTextAligned(Element.ALIGN_LEFT, "DUPLICATE", 230, 430, 45);  
over.endText();  //背景图  
Image img2 = Image.getInstance("resource/test.jpg");  
img2.setAbsolutePosition(0, 0);  
PdfContentByte under2 = stamp.getUnderContent(3);  
under2.addImage(img2);  stamp.close();  
reader.close();  

目录

// Code 1  
document.add(new Chunk("Chapter 1").setLocalDestination("1"));  document.newPage();  
document.add(new Chunk("Chapter 2").setLocalDestination("2"));  
document.add(new Paragraph(new Chunk("Sub 2.1").setLocalDestination("2.1")));  
document.add(new Paragraph(new Chunk("Sub 2.2").setLocalDestination("2.2")));  document.newPage();  
document.add(new Chunk("Chapter 3").setLocalDestination("3"));  // Code 2  
PdfContentByte cb = writer.getDirectContent();  
PdfOutline root = cb.getRootOutline();  // Code 3  
@SuppressWarnings("unused")  
PdfOutline oline1 = new PdfOutline(root, PdfAction.gotoLocalPage("1", false), "Chapter 1");  PdfOutline oline2 = new PdfOutline(root, PdfAction.gotoLocalPage("2", false), "Chapter 2");  
oline2.setOpen(false);  @SuppressWarnings("unused")  
PdfOutline oline2_1 = new PdfOutline(oline2, PdfAction.gotoLocalPage("2.1", false), "Sub 2.1");  
@SuppressWarnings("unused")  
PdfOutline oline2_2 = new PdfOutline(oline2, PdfAction.gotoLocalPage("2.2", false), "Sub 2.2");  @SuppressWarnings("unused")  
PdfOutline oline3 = new PdfOutline(root, PdfAction.gotoLocalPage("3", false), "Chapter 3"); 

Header, Footer

PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(FILE_DIR + "setHeaderFooter.pdf"));  writer.setPageEvent(new PdfPageEventHelper() {  public void onEndPage(PdfWriter writer, Document document) {  PdfContentByte cb = writer.getDirectContent();  cb.saveState();  cb.beginText();  BaseFont bf = null;  try {  bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);  } catch (Exception e) {  e.printStackTrace();  }  cb.setFontAndSize(bf, 10);  //Header  float x = document.top(-20);  //左  cb.showTextAligned(PdfContentByte.ALIGN_LEFT,  "H-Left",  document.left(), x, 0);  //中  cb.showTextAligned(PdfContentByte.ALIGN_CENTER,  writer.getPageNumber()+ " page",  (document.right() + document.left())/2,  x, 0);  //右  cb.showTextAligned(PdfContentByte.ALIGN_RIGHT,  "H-Right",  document.right(), x, 0);  //Footer  float y = document.bottom(-20);  //左  cb.showTextAligned(PdfContentByte.ALIGN_LEFT,  "F-Left",  document.left(), y, 0);  //中  cb.showTextAligned(PdfContentByte.ALIGN_CENTER,  writer.getPageNumber()+" page",  (document.right() + document.left())/2,  y, 0);  //右  cb.showTextAligned(PdfContentByte.ALIGN_RIGHT,  "F-Right",  document.right(), y, 0);  cb.endText();  cb.restoreState();  }  
});  doc.open();  
doc.add(new Paragraph("1 page"));          
doc.newPage();  
doc.add(new Paragraph("2 page"));          
doc.newPage();  
doc.add(new Paragraph("3 page"));          
doc.newPage();  
doc.add(new Paragraph("4 page"));  

分割 PDF

FileOutputStream out = new FileOutputStream(FILE_DIR + "splitPDF.pdf");  Document document = new Document();  PdfWriter.getInstance(document, out);  document.open();  
document.add(new Paragraph("1 page"));  document.newPage();  
document.add(new Paragraph("2 page"));  document.newPage();  
document.add(new Paragraph("3 page"));  document.newPage();  
document.add(new Paragraph("4 page"));  document.close();  PdfReader reader = new PdfReader(FILE_DIR + "splitPDF.pdf");  Document dd = new Document();  
PdfWriter writer = PdfWriter.getInstance(dd, new FileOutputStream(FILE_DIR + "splitPDF1.pdf"));  
dd.open();  
PdfContentByte cb = writer.getDirectContent();  
dd.newPage();  
cb.addTemplate(writer.getImportedPage(reader, 1), 0, 0);  
dd.newPage();  
cb.addTemplate(writer.getImportedPage(reader, 2), 0, 0);  
dd.close();  
writer.close();  Document dd2 = new Document();  
PdfWriter writer2 = PdfWriter.getInstance(dd2, new FileOutputStream(FILE_DIR + "splitPDF2.pdf"));  
dd2.open();  
PdfContentByte cb2 = writer2.getDirectContent();  
dd2.newPage();  
cb2.addTemplate(writer2.getImportedPage(reader, 3), 0, 0);  
dd2.newPage();  
cb2.addTemplate(writer2.getImportedPage(reader, 4), 0, 0);  
dd2.close();  
writer2.close();  

合并 PDF

PdfReader reader1 = new PdfReader(FILE_DIR + "splitPDF1.pdf");  
PdfReader reader2 = new PdfReader(FILE_DIR + "splitPDF2.pdf");  FileOutputStream out = new FileOutputStream(FILE_DIR + "mergePDF.pdf");  Document document = new Document();  
PdfWriter writer = PdfWriter.getInstance(document, out);  document.open();  
PdfContentByte cb = writer.getDirectContent();  int totalPages = 0;  
totalPages += reader1.getNumberOfPages();  
totalPages += reader2.getNumberOfPages();  java.util.List<PdfReader> readers = new ArrayList<PdfReader>();  
readers.add(reader1);  
readers.add(reader2);  int pageOfCurrentReaderPDF = 0;  
Iterator<PdfReader> iteratorPDFReader = readers.iterator();  // Loop through the PDF files and add to the output.  
while (iteratorPDFReader.hasNext()) {  PdfReader pdfReader = iteratorPDFReader.next();  // Create a new page in the target for each source page.  while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {  document.newPage();  pageOfCurrentReaderPDF++;  PdfImportedPage page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF);  cb.addTemplate(page, 0, 0);  }  pageOfCurrentReaderPDF = 0;  
}  
out.flush();  
document.close();  
out.close();  

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2025ICASSP Author Guidelines
  • 宠物空气净化器推荐买吗?清除浮毛的效果好吗
  • 改变自己·心情治愈
  • [000-01-030].Zookeeper学习大纲
  • node版本8.x→16.x,前端维护火葬场,问题及解决方案总结
  • 如何将本地组件库上传到npm上
  • 【区块链+金融服务】甘肃股权交易中心企业金融服务平台 | FISCO BCOS应用案例
  • DQL-案例
  • 第10章 无持久存储的文件系统 (3)
  • 【hot100篇-python刷题记录】【和为 K 的子数组】
  • 写一个githubDemo
  • docker 安装minio并配置https域名访问
  • 4款AI 生成 PPT的工具,帮你赶上演示文稿的新趋势!
  • RabbitMQ的核心概念
  • 《九歌· 程序员》
  • Android开源项目规范总结
  • fetch 从初识到应用
  • Java多态
  • OSS Web直传 (文件图片)
  • overflow: hidden IE7无效
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 分类模型——Logistics Regression
  • 分享一份非常强势的Android面试题
  • 每天10道Java面试题,跟我走,offer有!
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 深度学习中的信息论知识详解
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 通过git安装npm私有模块
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 译有关态射的一切
  • 优化 Vue 项目编译文件大小
  • 选择阿里云数据库HBase版十大理由
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (20)docke容器
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (十三)MipMap
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .htaccess 强制https 单独排除某个目录
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET4.0并行计算技术基础(1)
  • .net生成的类,跨工程调用显示注释
  • .net实现客户区延伸至至非客户区
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .NET中GET与SET的用法
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • /usr/bin/env: node: No such file or directory
  • @EnableWebMvc介绍和使用详细demo