PDF生成,从模板到代码

项目有生成PDF的需求,虽然做过,但是再次遇到了还是会卡壳,特此记录全过程。

一、模板的创建

首先定义好一个docx文档,然后转成PDF格式输出保存

然后用 Adobe Acrobat 工具将 PDF放进去加入表单域

具体操作如下

 点击后会有一个创建选项,创建选项里有一个创建表单选项,点进去

 选择一个文件,选择导出的PDF模板

红标标注的文本域,可以手动确定范围。

选择的文件,在默认空着的地方会自动生成的,如果需要值要改一下名就好,大小写敏感,推荐用驼峰命名规则。

这样一个模板就定义好了,直接找个地方,能访问到的地方就好了。

二、代码部分

导入依赖


<!-- PDF导出的maven依赖 -->
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<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>

主要代码

@Override
    public String OtherInOrOut(Long otherHeadId, HttpServletResponse response) throws UnsupportedEncodingException {

        HlOtherDepotHead hlOtherDepotHead = hlOtherDepotHeadService.selectHlOtherDepotHeadByOtherHeadId(otherHeadId);
        HlSupplierInfo hlSupplierInfo = null;
        HlCustomerInfo hlCustomerInfo = null;
        if (hlOtherDepotHead.getType() == 0) {
            hlSupplierInfo = hlSupplierInfoService.selectHlSupplierInfoBySupplierInfoId(hlOtherDepotHead.getComefromInfoId());
        }
        if (hlOtherDepotHead.getType() == 1) {
            hlCustomerInfo = hlCustomerInfoService.selectHlCustomerInfoByCustomerId(hlOtherDepotHead.getComefromInfoId());
        }
        
        // 使用哪套简历模板
        String pathFileName = "static/template/noeOtherInOrOut.pdf";

        String fileName = "泓ERP";

        // 导出格式
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment;fileName="+fileName+".pdf"
                + URLEncoder.encode(pathFileName, "UTF-8"));

        try {
            OutputStream os = response.getOutputStream();
            // 2 读入pdf表单
            PdfReader reader = new PdfReader(pathFileName);
            // 3 根据表单生成一个新的pdf                                  w
            PdfStamper ps = new PdfStamper(reader, os);
            // 4 获取pdf表单
            AcroFields form = ps.getAcroFields();
            // 5给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
//            BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); // win
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); // linux
            form.addSubstitutionFont(bf);

            Map<String, String> map = setMsaBusinessToForm(corresponding(hlOtherDepotHead, hlSupplierInfo, hlCustomerInfo));
            for (String key : map.keySet()) {
                String value = (String) map.get(key);
                form.setFieldProperty(key,"textfont", bf,null);
                form.setField(key, value); // 为字段赋值,注意字段名称是区分大小写的
            }
            ps.setFormFlattening(true);
            System.out.println("*******************PDF导出成功***********************");
        } catch (Exception e) {
            System.out.println("*******************PDF导出失败***********************");
            e.printStackTrace();
        } finally {
            try {
                ps.close();
                reader.close();
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;

    }
setMsaBusinessToForm方法详情
public Map<String, String> setMsaBusinessToForm(OtherInOrOutDto dto) throws DocumentException, IOException {
        Map<String, String> data = new HashMap<String, String>();
        // key必须和模板中定义的key名对应上,value是要替换key的数据, value必须为String
        data.put("模板的key", value); 
        
        List<OtherInOrOutItemDto> itemDtos = dto.getItemDtos();
        int i = 1;
        //如果是list的话
        for (OtherInOrOutItemDto itemDto : itemDtos) {
            data.put("index" + i, itemDto.getIndex().toString());//序号
            i++;
        }
        return data;
    }

corresponding 方法详情

public OtherInOrOutDto corresponding(HlOtherDepotHead hlOtherDepotHead, HlSupplierInfo hlSupplierInfo, HlCustomerInfo hlCustomerInfo){
        OtherInOrOutDto dto = new OtherInOrOutDto();
        
        //这个方法里是处理业务的逻辑,单独拿出来了
        
        //查询的数据
        String deptName = deptService.getParentDeptName();
        //数据存入实体
        dto.setDeptName(deptName);
        //返回
        return dto;

}

corresponding 负责处理数据,将处理好的数据交给 setMsaBusinessToForm 方法

setMsaBusinessToForm方法将数据放入map中,将map返回给上层调用者,进行如下处理

//循环map的key
for (String key : map.keySet()) {
     String value = (String) map.get(key);
     form.setFieldProperty(key,"textfont", bf,null);
     form.setField(key, value); // 为字段赋值,注意字段名称是区分大小写的
}

//导出操作
ps.setFormFlattening(true);

最后勿忘关闭资源

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 触摸屏界面设计模板PDF是一种用于设计触摸屏界面的文件格式,它可以提供标准化的布局和样式,使得开发人员能够更加高效地设计和实现用户界面。 在使用触摸屏界面设计模板PDF时,设计师可以根据自己的需求选择合适的模板,然后将其应用于实际的界面设计中。这些模板通常包含各种元素,如按钮、文本输入框、下拉菜单等,设计师可以根据需要对其进行调整和定制。 使用触摸屏界面设计模板PDF的好处之一是它能够提高设计的一致性和可用性。通过使用标准化的设计元素和布局,用户可以更轻松地理解并操作界面。同时,由于模板已经经过测试和验证,所以设计师可以更加放心地使用它们,而不必自己从头开始设计。 此外,触摸屏界面设计模板PDF还可以节省设计时间和成本。设计师可以直接使用现有的模板,而不必从零开始设计每个界面。这样可以大大提高开发效率,缩短产品上市时间,并减少项目成本。 总而言之,触摸屏界面设计模板PDF是一种非常实用和高效的工具,它可以帮助设计师更快地创建高质量的触摸屏界面。通过使用模板,设计师可以提高设计的一致性和可用性,节省设计时间和成本,从而提供更好的用户体验。 ### 回答2: 触摸屏界面设计模板PDF可以帮助设计师快速创建高质量的触摸屏界面设计。这些模板提供了常见的界面元素,如按钮、文本框、下拉菜单等,设计师可以根据需要选择合适的元素进行组合和排列。通过使用模板,设计师可以节省大量的时间和精力,同时确保设计的一致性和美观性。 触摸屏界面设计模板PDF的好处是多方面的。首先,它提供了一个标准化的设计框架,使得不同设计师在设计过程中可以遵循相同的规范,从而提高团队的协作效率。其次,模板提供了各种常用的交互元素,设计师可以在此基础上进行修改和创新,以满足产品的特定需求。此外,模板也提供了一些常见的设计原则和最佳实践,设计师可以参考这些指导,以提高设计的质量和用户体验。 使用触摸屏界面设计模板PDF需要一些基本的设计软件知识和技巧。设计师可以使用常见的设计软件,如Adobe Illustrator、Sketch等,打开模板文件并进行编辑。设计师可以调整元素的大小、颜色和位置等,以适应产品的要求。一些模板还提供了交互效果的展示,设计师可以在模板中预览和调整这些效果,从而提供更好的用户体验。 总的来说,触摸屏界面设计模板PDF是一个有价值的工具,可以帮助设计师快速创建高质量的触摸屏界面设计。它提供了标准化的设计框架和常用的交互元素,同时也提供了一些设计原则和最佳实践。通过使用模板,设计师可以提高工作效率,保持设计一致性,并提供更好的用户体验。 ### 回答3: 触摸屏界面设计模板PDF是一种用于设计触摸屏界面的模板文件,它通常以PDF格式提供。这种设计模板的目的是为设计师提供一个参考和指导,使其能够更加高效、准确地设计触摸屏界面。 触摸屏界面设计模板PDF通常包含了不同尺寸的屏幕布局,如手机、平板电脑等,并提供了一些常见的界面元素,比如按钮、输入框、菜单等。设计师可以根据项目需求选择适合的布局和元素,然后在模板上进行修改和定制。 此外,模板还包括了一些示例界面,以帮助设计师了解如何布置和组织界面元素,使其符合用户体验和界面美观的要求。这些示例界面还可以作为设计灵感的来源,帮助设计师更好地创作出独特的触摸屏界面。 触摸屏界面设计模板PDF的使用可以带来许多好处。首先,它可以帮助设计师快速入手,提高工作效率。其次,它可以确保界面元素的一致性和规范性,提高用户界面的易用性和可访问性。最后,它可以减少设计过程中的错误和重复工作,降低项目成本和风险。 总的来说,触摸屏界面设计模板PDF是一种有益的工具,它为设计师提供了一个基础框架和创作指南,帮助他们设计出优秀的触摸屏界面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值