itext7填充PDF模板(二)填充pdf模板

本篇文章主要讲解的是如何采用itext7进行模板填充。

  • 创建PdfReader PdfWriter,构造函数支持路径已经流的形式。
  • 创建PDFDocument
  • 创建并设置中文字体
  • 获取文本域的信息
  • 判断文本框长度是否够单行显示
  • 填充信息
  • 设置模板不可编辑
    private static void fillParam(PdfReader pdfReader, PdfWriter pdfWriter,
            Map<String, Object> map, List<PdfPositon> pdfPositons) throws MalformedURLException {

        //1、创建pdf文件
        PdfDocument pdf = new PdfDocument(pdfReader, pdfWriter);

        //2、创建中文字体
        PdfFont f2 = null;
        try {
            f2 = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", true);
        } catch (IOException e) {
            logger.error("create Font Error");
        }
        pdf.addFont(f2);

        //3、获取pdf模板中的域值信息
        PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
        Map<String, PdfFormField> fieldMap = form.getFormFields();
        Iterator<String> paramIterator = map.keySet().iterator();
        while (paramIterator.hasNext()) {
            String key = paramIterator.next();
            String value = map.get(key).toString();
            PdfFormField formField = fieldMap.get(key);
            if (formField == null) {
                continue;
            }

            //4、判断文本域是否超出宽度   且文本域是单行
            if (!compareWidth(f2, formField, value) && !formField.isMultiline()) {
                logger.error("value width was out of text width fieldName:{}", key);
            }

            //5、填充信息
            formField.setValue(value);
        }

        //6、设置文本不可编辑
        form.flattenFields();

        pdf.close();

    }

注意点:

  1. 需要设置中文字体否则填充中文信息时可能无法显示
  2. 需要对单行的文本域进行宽度判断,目前代码中是打印了异常日志
  3. 如果未设置文本不可编辑的话,会出现生成的文件仍然可以修改的情况

下面来梳理一下如何判断文本值超出文本框的最大长度(Adobe 默认是不展示的,而实际使用过程中肯定是要提示一下用户的)

实际比较对象是文本值的宽度和文本域的宽度,但是计算文本值的宽度是需要知道字体以及字体大小。

    /**
     * 1、获取文本框的宽度   注意要减去左右的padding值   值为:PdfFormField.X_OFFSET 2、获取字符串宽度注意字体   需使用中文字体
     *
     * @param pdfFont 字体
     * @param formField 文本域
     * @param value 文本值
     * @return textWidth >= valueWidth return true else false
     */
    public static boolean compareWidth(PdfFont pdfFont, PdfFormField formField, String value) {
        //获取当前文本字体大小
        float fontSize = getFontSize(formField);
        PdfArray position = formField.getWidgets().get(0).getRectangle();
        float width = (float) (position.getAsNumber(2).getValue() - position.getAsNumber(0).getValue())
                - PdfFormField.X_OFFSET * 2;

        //获取当前文本值的宽度
        float strWidth = pdfFont.getWidth(value, fontSize);
        return width >= strWidth;
    }

    /**
     * 获取adobe中设置的字体大小
     * @param formField
     * @return
     */
    private static float getFontSize(PdfFormField formField) {

        String defaultAppearance = formField.getDefaultAppearance().toString();
        String[] daTable = defaultAppearance.split(" ");
        return Float.valueOf(daTable[PdfFormField.DA_SIZE]);

    }

注意:实际文本域的边框和字之间还是存在间隙了,类似于html中的padding,所以文本框的实际宽度还要减去两边的padding值

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用itextpdf填充pdf模板的步骤如下: 1. 首先,创建一个Word文件,并设置好需要填充的位置和样式,然后将其另存为pdf格式。 2. 打开Adobe Acrobat Pro DC软件,点击文件->创建->创建表单,导入刚刚生成的pdf文件。 3. 在表单编辑页面,双击需要填充的字段,将其名称改为你想要的名称,并记住这个名称,后面会用到。 4. 设置好所有需要填充的字段后,保存表单。 5. 在代码中导入所需的itextpdf依赖,并编写代码来填充pdf模板。可以使用itextpdf的API来读取pdf模板,找到需要填充的字段,并将其值设置为你想要的值。 6. 将需要使用的字体文件放置在resources目录下。 7. 进行测试,查看填充后的pdf效果。 如果你觉得使用pdf模板的方式不方便,也可以参考itextpdf的其他方法,例如使用固定段落Paragraph来指定段落位置进行填充。 需要注意的是,如果在填充pdf模板时遇到问题,可以参考其他开发者的解决方案,例如引入itext-asian依赖来解决导出的pdf没有值的问题。 #### 引用[.reference_title] - *1* *2* [java使用itext填充pdf模板,超简单教学,有手就行](https://blog.csdn.net/weixin_42596407/article/details/120035922)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值