如果是先将PDF 转换成wrod后编辑完再转换成 PDF 会改变原格式,而且会很慢,这边介绍一直直接操作 PDF的方法,先使用PDF 编辑器将需要填充数据的地方编辑出文本据,这样就可以使用 itextpdf 直接修改 PDF 了

一、使用PDFelement制作pdf模板(数据域的名称对应后面插入的key)

java 更改pdf文件内容 java修改pdf_java

二、导入maven依赖

<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

三、插入数据和图片到pdf模板

Map<String, Object> data;//要插入的数据
        //初始化itext
        //设置编码
        BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
        PdfReader pdfReader=new PdfReader(“pdf模板文件路径”);
        PdfStamper pdfStamper=new PdfStamper(pdfReader, new FileOutputStream(“输出pdf文件路径”));
        AcroFields form = pdfStamper.getAcroFields();
        form.addSubstitutionFont(baseFont);

        //写入数据
        for(String key:data.keySet()){
            String value=data.get(key).toString();
            //key对应模板数据域的名称
            form.setField(key,value);
        }

        //添加图片
        int pageNo = form.getFieldPositions("img").get(0).page;
        Rectangle signRect = form.getFieldPositions("img").get(0).position;
        float x = signRect.getLeft();
        float y = signRect.getBottom();
        Image image = Image.getInstance("图片路径");
        PdfContentByte under = pdfStamper.getOverContent(pageNo);
        //设置图片大小
        image.scaleAbsolute(signRect.getWidth(), signRect.getHeight());
        //设置图片位置
        image.setAbsolutePosition(x, y);
        under.addImage(image);

        //设置不可编辑
        pdfStamper.setFormFlattening(true);
        pdfStamper.close();

itextpdf 没有修改字体大小的api,而是设置一个属性值,如果需要修改字体大小,可以参考以下链接
第53行代码