携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第二十一天,点击查看活动详情
上一章写了在PDF中通过代码添加表格,这一章继续写在adobe生成pdf模板后,用代码填充pdf内容(添加图片与表格等)功能。
在PDF中添加表格或文本域则需要设置文本对应的字体,这一章就是PDF设置字体及通过代码在PDF中添加图片功能。
/**
* 设置PDF中文本的字体
* @param form
* @param dataName 参数名称
* @param data 参数
* @param font 字体大小
*/
public static void setPdfFont(AcroFields form, String dataName, String data, Integer font, int isOut) {
BaseFont bf = null; // 创建字体
String fonts = getChineseFont(isOut);
try {
bf = BaseFont.createFont(fonts, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
form.setFieldProperty(dataName, "textfont", bf, null); // 设置字体
form.setFieldProperty(dataName, "textsize", (float) font, null); // 设置字体大小
//BaseColor red = BaseColor.RED; // 设置字体颜色
//form.setFieldProperty(temp.toString(),"textcolor", red, null);
form.setField(dataName, data);
} catch (Exception e) {
logger.error("设置字体失败", e);
throw new ServiceException("设置字体失败");
}
}
//将对象转为Map
public static <T> Map beanToMap(T bean) {
Map<String, Object> map = new HashMap<>();
BeanMap beanMap = BeanMap.create(bean);
for (Object key : beanMap.keySet()) {
map.put(key + "", beanMap.get(key));
}
return map;
}
/**
* 获取中文字体位置
*
* @return
*/
private static String getChineseFont(int isOut) {
String f = "";
if (isOut == 0) {//黑体
f = "SIMHEI.TTF";
} else {//仿宋
f = "simfang.ttf";
}
//宋体(对应css中的 属性 font-family: SimSun; /*宋体*/)
String font1 = "C:/Windows/Fonts/" + f;
//判断系统类型,加载字体文件
Properties prop = System.getProperties();
String osName = prop.getProperty("os.name").toLowerCase();
if (osName.indexOf("linux") > -1) {
font1 = "/usr/share/fonts/" + f;
}
if (!new File(font1).exists()) {
logger.error("字体文件不存在,影响导出pdf中文显示!" + font1);
throw new ServiceException("字体文件不存在,影响导出pdf中文显示!" + font1);
}
return font1;
}
//通过代码在PDF中添加图片
public void insertImage(AcroFields form,PdfStamper pdfStamper) throws DocumentException, IOException {
/**
* 添加图片 根据模板中图片对应的域名获取图片设置
*/
int page = form.getFieldPositions("image").get(0).page;
Rectangle signReact = form.getFieldPositions("image").get(0).position;
//获取图片的长宽
float x = signReact.getLeft();
float y = signReact.getBottom();
Image image = Image.getInstance(downImg);
PdfContentByte under = pdfStamper.getOverContent(page);
image.scaleToFit(signReact.getWidth(),signReact.getHeight());
image.setAbsolutePosition(x,y);
under.addImage(image);
}
至此,在adobe生成pdf模板后,用代码填充pdf内容(添加图片与表格等)就已经好了,想要实现该功能可以按照代码的流程进行操作。