ITextPDF
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
<!-- 输出中文 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!-- pdf文件密码 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.64</version>
</dependency>
0、Springboot
@GetMapping("/pdf/{name}")
public void getPdf(HttpServletResponse response, @PathVariable("name") String name) throws FileNotFoundException {
// 模板路径
String templatePath = ResourceUtils.getURL("classpath:").getPath() + "template.pdf";
// pdf 输出流
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
FileOutputStream fileOutputStream = null;
ServletOutputStream outputStream = null ;
try {
// 读取 pdf 模板文件
PdfReader pdfReader = new PdfReader(templatePath);
//修改器
PdfStamper pdfStamper = new PdfStamper(pdfReader,byteArrayOutputStream);
//中文字体,解决中文不能显示问题
BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
AcroFields acroFields = pdfStamper.getAcroFields();
acroFields.setField("name",name);
acroFields.setField("xuehao","123456789");
acroFields.setField("pname","设岗研究项目名称设岗研究项目名称");
// 解决字体缺少的问题
acroFields.addSubstitutionFont(bfChinese);
// true代表生成的 PDF 文件不可编辑
pdfStamper.setFormFlattening(true);
pdfStamper.close();
pdfReader.close();
// 输出文件路径
String outFile = System.getProperty("user.dir")+"\\report\\"+System.currentTimeMillis()+".pdf";
System.out.println(outFile);
// 保存到文件
File dateDir = new File(outFile);
File parentFile = dateDir.getParentFile();
if(!parentFile.exists()){
parentFile.mkdirs();
}
dateDir.createNewFile();
// 保存把数据保存到文件中
fileOutputStream = new FileOutputStream(dateDir);
fileOutputStream.write(byteArrayOutputStream.toByteArray());
// 写给前端
outputStream = response.getOutputStream();
outputStream.write(byteArrayOutputStream.toByteArray());
} catch (IOException | DocumentException e) {
e.printStackTrace();
} finally {
try {
if(fileOutputStream != null){
fileOutputStream.flush();
fileOutputStream.close();
}
if(outputStream != null){
outputStream.flush();
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
1、根据模板填充 pdf 文件
// 模板路径
String templatePath = "E:\\pdftest\\template.pdf";
// 输出文件路径
String outFile = "E:\\pdftest\\temp.pdf";
// 读取 模板文件
PdfReader pdfReader = new PdfReader(templatePath);
//修改器
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFile));
// acroFields 里面的 key 就是 pdf 的键, value 就是往里面要放的值
//中文字体,解决中文不能显示问题
BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
AcroFields acroFields = pdfStamper.getAcroFields();
acroFields.setField("name","这是一个名字");
acroFields.setField("xuehao","123456789");
// 解决字体缺少的问题
acroFields.addSubstitutionFont(bfChinese);
//true代表生成的PDF文件不可编辑
pdfStamper.setFormFlattening(true);
pdfStamper.close();
2、写入字符串
// 1.新建document对象
Document document = new Document(PageSize.A4);
try {
// 2.建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。
PdfWriter.getInstance(document, new FileOutputStream(filename));
// 3.打开文档
document.open();
// 4.添加一个内容段落
document.addTitle("example of PDF");
document.addHeader("hander","this is a header");
document.addAuthor("au");
document.add(new Paragraph("Hello World!"));
} catch (FileNotFoundException | DocumentException e) {
e.printStackTrace();
} finally {
// 5.关闭文档
document.close();
}
3、表格
//创建文件
Document document = new Document();
//建立一个书写器
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
//打开文件
document.open();
//添加内容
document.add(new Paragraph("HD content here"));
// 3列的表.
PdfPTable table = new PdfPTable(3);
table.setWidthPercentage(100); // 宽度100%填充
table.setSpacingBefore(10f); // 前间距
table.setSpacingAfter(10f); // 后间距
List<PdfPRow> listRow = table.getRows();
//设置列宽
float[] columnWidths = { 1f, 2f, 3f };
table.setWidths(columnWidths);
//行1
PdfPCell[] cells1 = new PdfPCell[3];
PdfPRow row1 = new PdfPRow(cells1);
//单元格
cells1[0] = new PdfPCell(new Paragraph("111"));//单元格内容
cells1[0].setBorderColor(BaseColor.BLUE);//边框验证
cells1[0].setPaddingLeft(20);//左填充20
cells1[0].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
cells1[0].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
cells1[1] = new PdfPCell(new Paragraph("222"));
cells1[2] = new PdfPCell(new Paragraph("333"));
//行2
PdfPCell[] cells2 = new PdfPCell[3];
PdfPRow row2 = new PdfPRow(cells2);
cells2[0] = new PdfPCell(new Paragraph("444"));
//把第一行添加到集合
listRow.add(row1);
listRow.add(row2);
//把表格添加到文件中
document.add(table);
//关闭文档
document.close();
//关闭书写器
writer.close();
4、图片
//创建文件
Document document = new Document();
//建立一个书写器
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
//打开文件
document.open();
//添加内容
document.add(new Paragraph("HD content here"));
//图片1
Image image1 = Image.getInstance(img1);
//设置图片位置的x轴和y轴
image1.setAbsolutePosition(100f, 550f);
//设置图片的宽度和高度
image1.scaleAbsolute(500, 500);
//将图片1添加到pdf文件中
document.add(image1);
// 图片2
// Image image2 = Image.getInstance(new URL(""));
Image image2 = Image.getInstance(img1);
//将图片2添加到pdf文件中
document.add(image2);
//关闭文档
document.close();
//关闭书写器
writer.close();
5、列表
//创建文件
Document document = new Document();
//建立一个书写器
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
//打开文件
document.open();
//添加内容
document.add(new Paragraph("HD content here"));
//添加有序列表
com.itextpdf.text.List orderedList = new com.itextpdf.text.List(com.itextpdf.text.List.ORDERED);
orderedList.add(new ListItem("Item one"));
orderedList.add(new ListItem("Item two"));
orderedList.add(new ListItem("Item three"));
document.add(orderedList);
//关闭文档
document.close();
//关闭书写器
writer.close();
6、设置字体样式
//创建文件
Document document = new Document();
//建立一个书写器
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
//打开文件
document.open();
//中文字体,解决中文不能显示问题
BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
//蓝色字体
Font blueFont = new Font(bfChinese);
blueFont.setColor(BaseColor.BLUE);
//段落文本
Paragraph paragraphBlue = new Paragraph("paragraphOne blue front", blueFont);
document.add(paragraphBlue);
//绿色字体
Font greenFont = new Font(bfChinese);
greenFont.setColor(BaseColor.GREEN);
//创建章节
Paragraph chapterTitle = new Paragraph("段落标题xxxx", greenFont);
Chapter chapter1 = new Chapter(chapterTitle, 1);
chapter1.setNumberDepth(0);
Paragraph sectionTitle = new Paragraph("部分标题", greenFont);
Section section1 = chapter1.addSection(sectionTitle);
Paragraph sectionContent = new Paragraph("部分内容", blueFont);
section1.add(sectionContent);
//将章节添加到文章中
document.add(chapter1);
//关闭文档
document.close();
//关闭书写器
writer.close();
7、修改文件
//读取pdf文件
PdfReader pdfReader = new PdfReader(sourceFile);
//修改器
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFile));
Image image = Image.getInstance("E:/pdftest/test1.jpg");
image.scaleAbsolute(200, 200);
image.setAbsolutePosition(200, 300);
for(int i=1; i<= pdfReader.getNumberOfPages(); i++) {
PdfContentByte content = pdfStamper.getUnderContent(i);
content.addImage(image);
}
pdfStamper.close();
1、根据模板填充 pdf 文件
// 创建文件
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
//用户密码,打卡文件需要密码
String userPassword = "123456";
//拥有者密码,编辑文件需要密码
String ownerPassword = "123456";
// 只读权限
writer.setEncryption(userPassword.getBytes(), ownerPassword.getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
// 打开文件
document.open();
// 添加内容
document.add(new Paragraph("password !!!!"));
// 关闭文档
document.close();
// 关闭书写器
writer.close();