package com.boss.fiscal.report.utils;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import org.apache.commons.lang.StringUtils;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class PDFUtils {
/**
* 拿到数据直接转换输出pdf
* @param data
* @return
*/
public Map dataPdf(Map<String, String> data) {
Map<String, Object> result = new HashMap<>();
try {
String path = data.get("path");
String fileName = data.get("fileName");
if (StringUtils.isEmpty(path)) {
path = "D:/fiscal/";
File file = new File(path);
if (!file.exists()) {// 判断目录是否存在
file.mkdir();
}
path = "D:/fiscal/" + fileName + "/";
file = new File(path);
if (!file.exists()) {// 判断目录是否存在
file.mkdir();
}
}
if (StringUtils.isEmpty(fileName)) {
throw new RuntimeException("fileName 不可为空");
}
//读取pdf
PdfReader reader = new PdfReader(path + fileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//将要生成的目标PDF文件名称
PdfStamper ps = new PdfStamper(reader, bos);
//PdfContentByte under = ps.getUnderContent(1);
//设置中文字体
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf);
//取出报表模板中的所有字段
AcroFields fields = ps.getAcroFields();
fields.setSubstitutionFonts(fontList);
//对表单数据进行赋值
fillData(fields, ps, data);
//必须要调用这个,否则文档不会生成的
ps.setFormFlattening(true);
ps.close();
String outPath = data.get("outPath");
OutputStream fos = new FileOutputStream(outPath + fileName);
fos.write(bos.toByteArray());
fos.flush();
fos.close();
bos.close();
result.put("code","100000");
result.put("data",outPath+fileName);
result.put("result","转化成功");
} catch (Exception e) {
result.put("code","118000");
result.put("result","转化失败");
result.put("data",e.getMessage());
}
return result;
}
public void fillData(AcroFields fields, PdfStamper ps, Map<String, String> data) throws IOException, DocumentException {
// 为字段赋值,注意字段名称是区分大小写的
for (String key : data.keySet()) {
if (key.equals("image")) {
/**
* 添加图片
*/
String imgpath = data.get(key);
int pageNo = fields.getFieldPositions(key).get(0).page;
Rectangle signRect = fields.getFieldPositions(key).get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// 读图片
Image image = Image.getInstance(imgpath);
// 获取操作的页面
PdfContentByte under = ps.getOverContent(pageNo);
// 根据域的大小缩放图片
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
} else {
String value = data.get(key);
fields.setField(key, value);
}
}
}
}
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>