实现JAVA在PDF图片域中插入图片,itextpdf

举报
object 发表于 2022/08/27 10:42:54 2022/08/27
【摘要】 本文针对的是 指定文本域的情况,需要事先在pdf模板中添加图片域。需要用到pdf编辑器,我使用的是Adobe Acrobat DC,也可以用其他的。1.源码展示文中使用到的各种图片模板,请自行准备。同时代码只是演示,多页pdf、流的关闭等,请自行注意调整,规范!package com.example.pdf.util;import com.itextpdf.text.DocumentExce...

本文针对的是 指定文本域的情况,需要事先在pdf模板中添加图片域。需要用到pdf编辑器,我使用的是Adobe Acrobat DC,也可以用其他的。

1.源码展示

文中使用到的各种图片模板,请自行准备。

同时代码只是演示,多页pdf、流的关闭等,请自行注意调整,规范!

package com.example.pdf.util;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class PdfAddImage {

    public static void main(String[] args) throws IOException, DocumentException {
        /* todo 重要!当使用这种图片域的方式添加图片,需要注意设置图片域为隐藏或者背景颜色为无
        *  todo 否则会出现生成的pdf仅有图片域的情况,看起来就像添加失败了一样。实际被遮挡了而已
        */
        // 模板文件路径
        String templatePath = "D:\\temp\\PdfAddImage\\addImageTemp.pdf";
        // 生成的文件路径
        String targetPath = "D:\\temp\\PdfAddImage\\target.pdf";
        // 书签名
        String fieldName = "addImageArea";
        // 图片路径
        String imagePath = "D:\\temp\\PdfAddImage\\addImage2.jpeg";
        // 读取模板文件
        InputStream input = new FileInputStream(new File(templatePath));
        PdfReader reader = new PdfReader(input);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(targetPath));
        // 提取pdf中的表单
        AcroFields form = stamper.getAcroFields();
        form.addSubstitutionFont(BaseFont.createFont(
                "STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED));
        // 通过域名获取所在页和坐标,左下角为起点
        int pageNo = form.getFieldPositions(fieldName).get(0).page;
        Rectangle signRect = form.getFieldPositions(fieldName).get(0).position;
        float x = signRect.getLeft();
        float y = signRect.getBottom();
        // 读图片
        Image image = Image.getInstance(imagePath);
        // 获取操作的页面
        PdfContentByte under = stamper.getOverContent(pageNo);
        // 根据域的大小缩放图片
        image.scaleToFit(signRect.getWidth(), signRect.getHeight());
        // image.scaleToFit(200, 200);
        // 添加图片
        image.setAbsolutePosition(x, y);
        under.addImage(image);
        stamper.close();
        reader.close();
    }
}

2.文本域设置

使用软件打开后,旁边后一个准备表单

需要注意图片域的名字一定要和代码中的匹配。设置匹配后,保存即可。就可以直接运行了。

3.采坑点

需要将图片域设置为隐藏或者北京颜色为无。否则会出现图片插入被遮挡的情况,展示效果就像插入失败一样。两个选择其中一个设置就可以了。

设置隐藏:

右键图片域,点击属性,一般-表单域-隐藏

设置无背景:

右键图片域,点击属性,外观-外框和颜色-外框颜色和填充颜色-无

设置完以后,保存即可。运行程序,就能在设置的图片域中添加图片了。

效果展示:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。