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
    评论
要根据Word模板生成PDF,可以使用Apache POI和Apache PDFBox这两个Java库。POI用于读取Word文档,PDFBox用于将生成的内容转换为PDF格式。 以下是一个简单的示例代码,可以根据Word模板生成PDF: ```java import java.io.*; import org.apache.poi.xwpf.usermodel.*; import org.apache.poi.xwpf.converter.pdf.*; import org.apache.poi.util.IOUtils; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; public class WordToPDFConverter { public static void main(String[] args) throws Exception { // 读取 Word 模板 InputStream in = new FileInputStream(new File("template.docx")); XWPFDocument document = new XWPFDocument(in); // 将 Word 转换为 PDF ByteArrayOutputStream out = new ByteArrayOutputStream(); PdfOptions options = PdfOptions.create(); PdfConverter.getInstance().convert(document, out, options); // 保存为 PDF 文件 FileOutputStream fos = new FileOutputStream(new File("output.pdf")); fos.write(out.toByteArray()); fos.close(); // 关闭输入输出流 IOUtils.closeQuietly(in); IOUtils.closeQuietly(out); System.out.println("Done!"); } } ``` 在上面的示例代码中,我们首先读取了Word模板文件,然后使用Apache PDFBox将其转换为PDF格式,并将生成PDF保存到磁盘上。最后,我们关闭了所有输入输出流。 请注意,要运行此代码,您需要在CLASSPATH中添加以下两个库: - Apache POI: 用于读取Word文档 - Apache PDFBox: 用于将内容转换为PDF格式 希望这可以帮助到您!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值