springmvc 生成pdf,并下载

  目前生成pdf,word,excel文档,基本上就是两种套路:

  1.直接有程序生成,直接用代码控制每一行,每一列的生成。这种主要适用于需求是不确定要生成的文档的具体的样子,而是根据数据库数据动态生成。这种需求比较麻烦。主要是控制每一行,每一列实在是很麻烦,行高,列宽。还得考虑显示像素和实际打印出的文档的区别。而且那些操作文档的开源api,有可能也没有提供你想要的那种效果的接口,那时候就gg了。个人感觉除非是非用不可,要不然一般都不建议使用

 2.第二种就是事先手动生成一个模板文件,动态的数据内容利用程序直接把内容填在里面,就像是在做填空题。感觉基本上大家都是在用这种方法。比较简单。


好,现在就是生成pdf的具体实现了。

 第一步,原料与工具, 

      1,生成pdf模板的工具,Adobe Acrobat 这是adobe公司的软件,可以操作pdf文件,在里面添加表单,就是制作填空题的那个空。

      2,iText-5.0.6.jar 这是操作pdf的jar包,在项目中导入它,就能对pdf的内容进行操作了


第二步,制作模板,生成文件并下载

   1 利用word制作好需要的报表,然后导出为pdf。

   2 利用Adobe Acrobat 打开pdf,在需要填写内容的地方添加一个表单文本域,给文本域取一个名字,这是一个标识,其实和html的input是一样一样的额,比如这样,

然后保存好pdf,

3 读取文件,将数据填入相应的文本域中,然后导出,代码好像也是在csdn找的,自己改了一下

  1. public class pdfUtil {  
  2.  /** 
  3.   * 根据pdf模板填充相应的值: 1,如果是根据excel填充的话,在用Acrobat生成PDF模板前, 
  4.   * Excel单元格格式最好设置成文本,否则pdf填充值时可能中文无法显示 
  5.   */  
  6.  public static byte[] fromPDFTempletToPdfWithValue(Map<String,String> map) {  
  7.      ByteArrayOutputStream bos=null;  
  8.      PdfStamper ps=null;  
  9.      Document document=null;  
  10.      byte[] result=null;  
  11.       try {  
  12.        PdfReader reader = new PdfReader(PropertyConfig.TEMPLET_PATH);  
  13.         bos = new ByteArrayOutputStream();  
  14.         ps = new PdfStamper(reader, bos);  
  15.        /** 
  16.         * 使用中文字体 如果是利用 AcroFields填充值的不需要在程序中设置字体,在模板文件中设置字体为中文字体就行了 
  17.         */  
  18.     //   BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",  
  19.     //     BaseFont.NOT_EMBEDDED);  
  20.     //   Font font = new Font(bf, 12, Font.NORMAL);  
  21.        AcroFields s = ps.getAcroFields(); //读取文本域  
  22.        Set<String> keys=map.keySet();//map里保存要填入的数据,key和文本域的name一样  
  23.        for(String key:keys ){  
  24.            s.setField(key, map.get(key));  
  25.        }  
  26.        document = new Document();  
  27.        document.open();   
  28.        ps.setFormFlattening(true);  
  29.        ps.close();  
  30.        result=bos.toByteArray();  
  31.        bos.close();  
  32.       } catch (FileNotFoundException e) {  
  33.        e.printStackTrace();  
  34.       } catch (Exception e) {  
  35.        e.printStackTrace();  
  36.       } finally {  
  37.         document.close();  
  38.          try {  
  39.             ps.close();  
  40.             bos.close();  
  41.         } catch (DocumentException e) {  
  42.             // TODO Auto-generated catch block  
  43.             e.printStackTrace();  
  44.         } catch (IOException e) {  
  45.             // TODO Auto-generated catch block  
  46.             e.printStackTrace();  
  47.         }  
  48.       }     
  49.       return result;//返回一个直接数组  
  50.  }  
  51. public static byte[] reFileToByteArray() {  
  52.     // TODO Auto-generated method stub  
  53.     return null;  
  54. }  
  55. }  



下面是springmvc的一个方法,提供下载的接口,代码好像也是在csdn找的。。。。。。。
  1. /** 
  2.      * 下载pdf报告 
  3.      * @param session 
  4.      * @return 
  5.      */  
  6.     @RequestMapping("download")  
  7.     public ResponseEntity<byte[]> dowload1(HttpSession session){   
  8.         JSONObject O=(JSONObject)session.getAttribute("export");  
  9.         Map<String,String> map=new HashMap<String, String>();  
  10.         Set<String> keys=O.keySet();  
  11.         for(String key:keys){  
  12.             map.put(key, O.getString(key));  
  13.         }  
  14.         HttpHeaders headers = new HttpHeaders();      
  15.         String fileName = null;  
  16.         try {  
  17.             fileName = new String(("xxx报告-"+O.getString("name").trim()+".pdf").getBytes("gb2312"),"iso-8859-1");//解决中文乱码  
  18.         } catch (UnsupportedEncodingException e) {  
  19.             // TODO Auto-generated catch block  
  20.             e.printStackTrace();  
  21.         }//为了解决中文名称乱码问题    
  22.         headers.setContentDispositionFormData("attachment", fileName);     
  23.         headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);     
  24.         return new ResponseEntity<byte[]>(pdfUtil.fromPDFTempletToPdfWithValue(map),headers, HttpStatus.OK);  
  25.     }  

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值