参考帖子:
这位大佬的帖子必读,因为涉及到pdf创建表单的教程
:
java使用itext填充pdf模板,超简单教学,有手就行
以下是学习当中参考的帖子
:
java pdf域插入img_java实现在pdf模板的指定位置插入图片
java 使用 itextpdf 为 PDF 添加图片
依赖
<!--pdf生成-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
代码部分
package com.pdfCeShi.ceShi1;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 给定几个地址功能,传入参数和图片生成pdf
*
* @author zihao
* @version 1.0
* @BelongsPackage com.pdfCeShi.ceShi1
* @CreateTime 2023-01-10
* @Description:
*/
public class PdfCeShi {
private static int blank = 1;
public static void main(String[] args) {
// 模板文件路径
String inputFileName = "E:\\未标题-1(带表单).pdf";
// 生成的文件路径
String outputFileName = "E:\\test.pdf";
String image = "E:\\透明印章.png";
String phoneImage = "C:\\Users\\Administrator\\Pictures\\微信截图.jpg";
//旧的pdf流
OutputStream os = null;
//旧的pdf表单信息
PdfReader reader = null;
//新的pdf
PdfStamper ps = null;
try {
os = new FileOutputStream(new File(outputFileName));
// 2. 读入pdf表单
reader = new PdfReader(inputFileName);
// 3. 根据表单生成一个新的pdf
ps = new PdfStamper(reader, os);
// 4. 获取pdf表单
AcroFields form = ps.getAcroFields();
/* ---文字部分--- */
// 5. 给表单添加中文字体
BaseFont bf = BaseFont.createFont("src/main/resources/Font/FZLTHJW.TTF", BaseFont.IDENTITY_H,
BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(bf);
// 6. 查询数据================================================
Map<String, Object> data = new HashMap<String, Object>();
data.put("projectName", "李四");
data.put("productMarking", "张三");
// 7.遍历data 给pdf表单表格赋值
for (String key : data.keySet()) {
form.setField(key, data.get(key).toString());
}
ps.setFormFlattening(true);
PdfContentByte under =null;
/* ---拍照图片部分(这部分内容是根据图片域的大小插入自适应大小的图片)--- */
// 通过域名获取所在页和坐标,左下角为起点
// int pageNo = form.getFieldPositions("field").get(0).page;
// Rectangle signRect = form.getFieldPositions("field").get(0).position;
// float x = signRect.getLeft();
// float y = signRect.getBottom();
// // 读图片
// Image image1 = Image.getInstance(phoneImage);
// // 获取操作的页面
// under = ps.getOverContent(pageNo);
// // 根据域的大小缩放图片
// image1.scaleToFit(signRect.getWidth(), signRect.getHeight());
// // 添加图片
// image1.setAbsolutePosition(x, y);
// under.addImage(image1);
/* ---印章图片部分--- */
// 获取PDF文档信息
Map<String, Object> pdfMsg = getPdfMsg(inputFileName);
// 开始计算图片起始位置 * PDF文档宽度 - (所有图片的宽度 + 每张图片右侧加5 个单位的空白 )
float startAddress = Float.parseFloat(pdfMsg.get("width").toString());
startAddress -= (Double.parseDouble(getImgMsg(image).get("width").toString()) + blank);
// 插入水印
Image img = Image.getInstance(image);
//图片缩放,值越小图片越小
img.scalePercent((float) 48 );
// 设置图片水印的位置,第一个数值越大越靠右,第二个数值越大图片越往上。
img.setAbsolutePosition(startAddress+140, 350);
img.getTop();
// 开始水印 如果需要每一页都加图片,这里添加循环即可,getOverContent是显示在上,getUnderContent是显示在下
under = ps.getOverContent(Integer.parseInt(pdfMsg.get("pageSize").toString()));
under.addImage(img);
startAddress += Float.parseFloat(getImgMsg(image).get("width").toString()) + blank;
System.out.println("===============PDF导出成功=============");
} catch (Exception e) {
System.out.println("===============PDF导出失败=============");
e.printStackTrace();
} finally {
try {
ps.close();
reader.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 获取PDF共有几页,宽高,页面高度
*
* @param filePath pdf路径
* @return java.util.Map<java.lang.String, java.lang.Object>
* @author ZiHao
* @create 2023/1/11 0011
**/
public static Map<String, Object> getPdfMsg(String filePath) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
try {
// 获取PDF共有几页
PdfReader pdfReader = new PdfReader(new FileInputStream(filePath));
int pages = pdfReader.getNumberOfPages();
// System.err.println(pages);
map.put("pageSize", pages);
// 获取PDF 的宽高
PdfReader pdfreader = new PdfReader(filePath);
Document document = new Document(pdfreader.getPageSize(pages));
float widths = document.getPageSize().getWidth();
// 获取页面高度
float heights = document.getPageSize().getHeight();
// System.out.println("widths = " + widths + ", heights = " + heights);
map.put("width", widths);
map.put("height", heights);
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
/**
* 获取源图宽度,源图高度
*
* @param imgPath 图片路径
* @return java.util.Map<java.lang.String, java.lang.Object>
* @author ZiHao
* @create 2023/1/11 0011
**/
public static Map<String, Object> getImgMsg(String imgPath) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
try {
File picture = new File(imgPath);
BufferedImage sourceImg = ImageIO.read(new FileInputStream(picture));
// System.out.println("=源图宽度===>"+sourceImg.getWidth()); // 源图宽度
// System.out.println("=源图高度===>"+sourceImg.getHeight()); // 源图高度
map.put("width", sourceImg.getWidth());
map.put("height", sourceImg.getHeight());
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}
== 注意:pdf图片域需要设置不显示,那样你的图片才能在最顶层,不然图片会被域遮挡==