添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本篇文章主要讲解的是如何采用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值

本篇文章主要讲解的是如何采用itext7进行模板填充。创建PdfReader PdfWriter,构造函数支持路径已经流的形式。 创建PDFDocument 创建并设置中文字体 获取文本域的信息 判断文本框长度是否够单行显示 填充信息 设置模板不可编辑 private static void fillParam(PdfReader pdfReader, PdfWriter... 日常开发中,通常会有动态填充Pdf表单的需求,程序可根据用户的输入或后台数据库的内容,动态、批量向Pdf模板填充内容。 这里简单介绍一下Pdf模板的制作,以及通过iTextPdf组件给pdf Form表单进行内容填充Pdf模板制作 1、word中制作表格 使用Office word 或 WPS word,制作出一个表格,通过表格底色,颜色、字体设置、对齐等方式美化一下表格。 效果图如下: 2、word导出为pdf 可以使用WPS的另存为功能,将word导出为pdf文件 导出完的pdf文件,效果
iTextPdf填写Pdf表格出现Field空白现象 最近在帮客户做一个简单的report。用户提供了一个pdf文件作为模板,需要从特定的文件中读取数据然后填写到模板中。 很简单的一个程序使用iTextPdf就能实现。但是就在我给客户email一个样板的时候,发现在我的机子上,填写的内容是正常的显示,但是通过email传输之后内容全都不见了。Debug没有出现任何错误。 code: public void fillDateInPDfFile(ReportData reportData, String o
对itext的使用也是从itext 5开始,一点一点的拼凑出来的。做到后面发现业务上需要对图片进行处理,一直没有找到比较好的解决办法,最后入了itext 7的坑。 先说一说 itext 7的优点吧。代码量比较少,很简洁。对于图片的处理也比较优雅。哈哈哈哈哈哈哈哈说的太闷骚了 废话不多说,开干吧。刚吧嘚 首先pom导入itext 7大礼包: <dependencies> <dependency> <groupId>com.itextpdf</groupId
最近工作中用到了pdf模板填充的功能,主要的应用场景是生成各种协议已经合同,需要对文件中进行一些已知信息的填充以及加盖印章。本章节主要讲解是如何使用Adobe Acrobat Pro DC设置模板文件,已经其中的一些注意事项。整个流程分为3大步骤: 采用Adobe Acrobat Pro DC 设置合同模板 填充已经设置好的模板 设置印章位置 第一步、使用Adobe Acrobat Pro ...
直接开始需要两个jar包 itext-asian-5.2.0.jar和 itextpdf-5.5.6.jar ,我的业务逻辑可能比较复杂,在这里我就简单的提供一个demo ,需要的人自己按照自己的业务逻辑来改。 首先我们要用 Adobe Acrobat 来编辑pdf 简单讲讲思路 1 .读取到要填充pdf 地址 2. 然后转成PdfReader对象,代表一个pdf 3. 然后转成PdfStam...
项目中有个需求,对于已有的数据生成对应的发票pdf或者合同pdf,这些pdf具有一些特性,就是pdf有固定的格式,类似于表格,我们只要往表格里面填充数据即可。当然,也会涉及到签章,维码等需求。 总体思路: 1.得到需要生成的pdf的初始模板,包含格式,只是不含数据 2.使用工具Adobe Acrobat,编辑pdf模板,在对应区域生成文本域,每个域都有自己的name 3.java中使用itext...
用word导出pdf文件格式 在线生成pdf模板文件表单,网址:https://www.pdfescape.com上传刚刚保存的pdf文件在下拉中选择自己需要的类型选中文本框点击鼠标右键选择 object Properties 在name框中输入你要填充的字段名称,其他请根据自身需要选择,做完表单模板后点击 下载该模板。 3. 使用iText来填充表单,在pom文件中加入
iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 下面简单的整理几个操作pdf相关实例。 1.PDF模版填充 首先需要有一个pdf文件作为模版,可以用如adobe acrobat等工具,添加几个文本域在pdf中,下面就是模...
之前我写的第一篇文章就是关于我给客户开发一个自动生成pdf报表的程序,之后得到的报表在我的电脑上一切如常,但是用email发给他之后,所有填充的数据就木有了。我之后从iTextPdf从5升级到了7,然后发给我自己的邮箱进行测试。觉得问题解决了,完全木有问题。但是客户休假回来,看到了我发的报表,一句开头的sorry,我的心就又悬起来啦,他还是只收到了没有数据的pdf template。 到底是什么问题,经过我发邮件给几个同事做实验,我发现用新版的MS E’dge,Chrome,或是teams直接打开都没有问题
java使用itext填充pdf模板1、先去建一个Word文件,设置好想要填充的地方,留好位置,设置好下划线2、将Word另存为pdf3、打开电脑中的Adobe Acrobat pro DC(这个应该win10 都有,搜索一下就出来了),点击 文件→创建→创建表单4、然后导入刚刚生成的pdf会出来这个页面双击这个阴影部分,将名称改成你要设置的名称,后面要根据这个名称来给他赋值全部设置好以后就可以另存为了5、前期的pdf模板准备好了,就开始上代码!1、首先导入我们所需要的依赖 1、先去建一个Word文件,设