JAVA操作Itext向pdf模板中填充数据,图片,复选框!

第一步模板制作:

  • 在word中先把模板画好,另存为pdf,具体步骤为:wps—》工具------》开发工具。如图所示

    图片也是设置为文本域,千万不要设置为图片域,否则图片会被覆盖!

    图片也是设置为文本域,千万不要设置为图片域,否则图片会被覆盖!

    图片也是设置为文本域,千万不要设置为图片域,否则图片会被覆盖!
    在这里插入图片描述

准备好模板后下载adobe2024

获取破解安装包v: yzb328899或v众号 T96虚拟资料吧 发送adobe获取,也可自行下载。
  • 安装好adobe后打开刚刚保存的模板,在adobe中打开准备表单。如下图所示:
    在这里插入图片描述
  • 定义模板中的每一个字段名称,包括样式字段的字体大小颜色和其他的属性如下图所示

    JAVA中的map或者实体对象命名时字段名必须与这里保持一致!

    JAVA中的map或者实体对象命名时字段名必须与这里保持一致!

    JAVA中的map或者实体对象命名时字段名必须与这里保持一致!
    在这里插入图片描述

操作复选框

定义属性,定义选中时的形状

在这里插入图片描述

如何选中复选框?当参数传递“导出值”时即为选中,如下图所示

在这里插入图片描述

JAVA中设置选中,这里要设置为true,否则是相反的,选中为x,只有设置为true时选中才是√。

 form.setField("toggle1", "Y",true);
 form.setField("toggle2", "Yes",true);
 form.setField("toggle3", "On",true);

结果如图所示:

在这里插入图片描述

接下来开始代码实现,直奔主题!!!

  • 添加maven依赖
  <!-- itextpdf的亚洲字体支持 -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <!--itextpdf-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13.3</version>
        </dependency>
       <!--生成二维码-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.1</version> 
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.4.1</version> 
        </dependency>
  • 将准备好的pdf模板放入项目中的resource----》static-------》template目录。
    若没有此目录则自己创建如图所示:
    在这里插入图片描述
  • 表单内容实体类Entity Or Domain

import lombok.Data;

@Data
public class PaymentOrder {

    /**
     * 年
     */
    private String year;

    /**
     *月
     */
    private String month;

    /**
     *日
     */
    private String day;

    /**
     *付款
     */
    private String toggle1;

    /**
     *支票
     */
    private String toggle2;

    /**
     *转账
     */
    private String toggle3;

    /**
     *收款账号
     */
    private String acount;

    /**
     *人民币大写
     */
    private String CNY;

    /**
     *人民币数值
     */
    private String cnyNum;

    /**
     * 二维码
     */
    private String QRCode;

    /**
     * 图片
     */
    private String photo;

    /**
     *备注
     */
    private String remark;
}
  • Controller层代码实现:
    @GetMapping("/test")
    public void generateForm(HttpServletResponse response,PaymentOrder paymentOrder ){
    //此处模拟前端传来的数据,或查询数据库获得的数据
        paymentOrder.setAcount("1111");
        paymentOrder.setCNY("壹佰万");
        paymentOrder.setYear("2024");
        paymentOrder.setMonth("07");
        paymentOrder.setDay("22");
        //图片绝对路径
        paymentOrder.setPhoto("C:\\Users\\Administrator\\Desktop\\goods\\ruoyi-system\\src\\main\\resources\\static\\img.png");
        paymentOrder.setRemark("测试一下");
        paymentOrder.setCnyNum("1000000");
        paymentOrder.setToggle1("Y");
        paymentOrder.setToggle3("Y");
        //二维码内容
        paymentOrder.setQRCode("https://blog.csdn.net/m0_46523467?spm=1000.2115.3001.5343");
        //pdf模板存放路径
        String templatePath="C:\\Users\\Administrator\\Desktop\\goods\\ruoyi-system\\src\\main\\resources\\static\\template\\payment_order_template.pdf";
        //生成后的文件存放路径
        String outPutPath="C:\\Users\\Administrator\\Desktop\\goods\\ruoyi-system\\src\\main\\resources\\static\\payment_order.pdf";
        logisticsService.generateForm(response,paymentOrder,templatePath,outPutPath);
    }
  • service 层
  /**
     * 报表生成
     * @param response
     * @param paymentOrder
     * @param templatePath
     * @param outputPath
     */
    void generateForm(HttpServletResponse response, PaymentOrder paymentOrder,String templatePath,String outputPath);
}
  • serviceImpl
    /**
     * 报表生成
     * @param response
     * @param paymentOrder
     */
    @Override
    public void generateForm(HttpServletResponse response, PaymentOrder paymentOrder,  String template_path, String output_path) {
        //表单中的文本数据map
        Map<String,String> form=new HashMap<>();
        //表单中图片map
        Map<String,String> image=new HashMap<>();
        //表单中二维码图片生成内筒map
        Map<String,String> qrcode=new HashMap<>();
        //表单内容
        form.put("year",paymentOrder.getYear());
        form.put("month",paymentOrder.getMonth());
        form.put("day",paymentOrder.getDay());
        form.put("acount",paymentOrder.getAcount());
        form.put("CNY",paymentOrder.getCNY());
        form.put("toggle1",paymentOrder.getToggle1());
        form.put("toggle2",paymentOrder.getToggle2());
        form.put("toggle3",paymentOrder.getToggle3());
        form.put("cnyNum",paymentOrder.getCnyNum());
        form.put("remark",paymentOrder.getRemark());
        //图片
        image.put("photo", paymentOrder.getPhoto());
        //二维码的内容
        qrcode.put("QRCode",paymentOrder.getQRCode());
        /**填充表单内容,width为二维码的宽,height为二维码的高,如没有二维二维码和图片则传null,宽和高传0。
        *fillPdfTemplate(String templateUrl, String outputFileUrl, Map<String, String> fieldMap,
        *Map<String, String> imageMap, Map<String, String> QRCodeMap,int width,int height)
        */
        PDFUtils.fillPdfTemplate(template_path,output_path,form,image,qrcode,300,300);
  • 自定义PDF工具类
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public final class PDFUtils {
    public static boolean fillPdfTemplate(String templateUrl, String outputFileUrl, Map<String, String> fieldMap, Map<String, String> imageMap, Map<String, String> QRCodeMap,int width,int height) {
        boolean success = true;
        OutputStream os = null;
        PdfStamper ps = null;
        PdfReader reader = null;
        AcroFields form = null;
        
        try {
            os = Files.newOutputStream(new File(outputFileUrl).toPath());
            reader = new PdfReader(templateUrl);
            ps = new PdfStamper(reader, os);
            form = ps.getAcroFields();

            // 添加中文字体支持(可选)
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            form.addSubstitutionFont(bf);
            
            // 填充表单字段
            for (Map.Entry<String, String> entry : fieldMap.entrySet()) {
                if(entry.getValue()!=null){
                    form.setField(entry.getKey(), entry.getValue(),true);
                }
            }
            
            // 插入图片
            for (Map.Entry<String, String> entry : imageMap.entrySet()) {
                if (entry.getValue()!=null){
                    insertImage(form, ps, entry.getKey(), entry.getValue());
                }
            }

            // 插入二维码
            for (Map.Entry<String, String> entry : QRCodeMap.entrySet()) {
                if(width!=0&&height!=0){
                    insertQRCodeImage(form, ps,entry.getKey(), entry.getValue(), width,height);
                }
            }
        } catch (Exception e) {
            success = false;
            e.printStackTrace();  // 可以根据实际情况处理异常
        } finally {
            try {
                if (ps != null) ps.close();
                if (reader != null) reader.close();
                if (os != null) os.close();
            } catch (IOException | DocumentException e) {
                throw new RuntimeException(e);
            } finally {
                System.out.println("文件导出完成!");
            }
        }
        return success;
    }
    //插入图片的函数,fieldName为字段名,imageUrl为图片路径
    private static void insertImage(AcroFields form, PdfStamper ps, String fieldName,String imageUrl) throws IOException, DocumentException {
        if(imageUrl!=null){
            //获取fieldName所在的页码
            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(imageUrl);
            // 获取操作的页面
            PdfContentByte overContent = ps.getOverContent(pageNo);
            // 根据域的大小缩放图片
            image.scaleToFit(signRect.getWidth(), signRect.getHeight());
            // 添加图片
            image.setAbsolutePosition(x, y);
            overContent.addImage(image);
            ps.setFormFlattening(true);
        }

    } 
    
//生成二维码图片并插入图片的函数
    private static void insertQRCodeImage(AcroFields form, PdfStamper ps, String fieldName, String qrCodeUrl,int width,int height) throws IOException, DocumentException {
        if(qrCodeUrl!=null&&!qrCodeUrl.equals("")){
            int pageNo = form.getFieldPositions(fieldName).get(0).page;
            Rectangle signRect = form.getFieldPositions(fieldName).get(0).position;
            float x = signRect.getLeft();
            float y = signRect.getBottom();
            // 生成二维码
            BarcodeQRCode barcodeQRCode=new BarcodeQRCode(qrCodeUrl,width,height,null);
            Image image = barcodeQRCode.getImage();
            // 获取操作的页面
            PdfContentByte overContent = ps.getOverContent(pageNo);
            // 根据域的大小缩放图片
            image.scaleToFit(signRect.getWidth(), signRect.getHeight());
            // 添加二维码图片到pdf中
            image.setAbsolutePosition(x, y);
            overContent.addImage(image);
            ps.setFormFlattening(true);
        }
    }
}

实现结果:

在这里插入图片描述
在这里插入图片描述

使用iTextPDF生成pdf填充自定义数据的步骤如下: 1. 首先,获取需要生成pdf的初始模板,包含格式,但不包含数据。可以使用工具如Adobe Acrobat来编辑pdf模板,在对应区域生成文本域,为每个域设置一个唯一的名称。 2. 在Java代码,使用iTextPDF库来对pdf进行操作。首先,需要获取PdfReader对象,将模板文件加载为PdfReader对象。可以使用以下代码: ```java PdfReader reader = new PdfReader(templatePath); // templatePath是模板pdf文件的路径 ``` 3. 接下来,使用PdfStamper对象来填充数据并生成最终的pdf文件。可以使用以下代码: ```java PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputPath)); // outputPath是生成的pdf文件的路径 AcroFields fields = stamper.getAcroFields(); // 使用fields对象来填充文本域的数据 fields.setField("fieldName1", "fieldValue1"); fields.setField("fieldName2", "fieldValue2"); // 继续填充其他文本域的数据 // 最后,调用stamper的close方法来保存并关闭pdf文件 stamper.close(); ``` 4. 通过上述步骤,你可以使用iTextPDF将自定义数据填充pdf模板,并生成最终的pdf文件。 请注意,以上代码只展示了主要的方法代码,并不是整个流程的逻辑代码。具体的实现可能会根据具体的需求和模板结构有所不同。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [java使用itextpdf生成pdf填充自定义数据](https://blog.csdn.net/qq_34244426/article/details/104833805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值