在adobe生成pdf模板后,用代码填充pdf内容(添加图片与表格等)(三)

308 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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内容(添加图片与表格等)就已经好了,想要实现该功能可以按照代码的流程进行操作。