将html页面保存成图片,图片写入pdf的实现方法(推荐)


Posted in Javascript onSeptember 17, 2016

需求是一个导出pdf的功能,多方奔走终于实现了,走了不少弯路,而且怀疑现在这个方法仍是弯的。

有个jsPDF 插件可以在前端直接生成pdf,很简便,但不支持IE。

前端:

首先引入  html2canvas.js

html2canvas(document.body, { //截图对象
     //此处可配置详细参数
     onrendered: function(canvas) { //渲染完成回调canvas
       canvas.id = "mycanvas"; 
       // 生成base64图片数据
       var dataUrl = canvas.toDataURL('image/png');  //指定格式,也可不带参数
       var formData = new FormData(); //模拟表单对象
       formData.append("imgData", convertBase64UrlToBlob(dataUrl), "123.png"); //写入数据
       var xhr = new XMLHttpRequest(); //数据传输方法
       xhr.open("POST", "../bulletin/exportPdf"); //配置传输方式及地址
       xhr.send(formData);
       xhr.onreadystatechange = function(){ //回调函数
         if(xhr.readyState == 4){
            if (xhr.status == 200) {
               var back = JSON.parse(xhr.responseText);
               if(back.success == true){
                 alertBox({content: 'Pdf导出成功!',lock: true,drag: false,ok: true});
               }else{
                 alertBox({content: 'Pdf导出失败!',lock: true,drag: false,ok: true});
               }
            }
         }
       };
     }
}); 
  
//将以base64的图片url数据转换为Blob
function convertBase64UrlToBlob(urlData){
  //去掉url的头,并转换为byte
  var bytes=window.atob(urlData.split(',')[1]);    
  //处理异常,将ascii码小于0的转换为大于0
  var ab = new ArrayBuffer(bytes.length);
  var ia = new Uint8Array(ab);
  for (var i = 0; i < bytes.length; i++) {
    ia[i] = bytes.charCodeAt(i);
  }
  return new Blob( [ab] , {type : 'image/png'});
}

兼容性:Firefox 3.5+, Chrome, Opera, IE10+

不支持:iframe,浏览器插件,Flash

跨域图片需要在跨域服务器header加上允许跨域请求

access-control-allow-origin: *  access-control-allow-credentials: true

svg图片不能直接支持,已经有补丁包了,不过我没有试过。

IE9不支持FormData数据格式,也不支持Blob,这种情况下将canvas生成的64base字符串去掉url头之后直接传给后台,后台接收之后:

String base64 = Img.split(",")[1];
BASE64Decoder decode = new BASE64Decoder(); 
byte[] imgByte = decode.decodeBuffer(base64);

后端:

导入 itext jar包

 

@RequestMapping("/exportPdf")
public @ResponseBody void exportPdf(MultipartHttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
  ResultData result = new ResultData();  //自定义结果格式
  String filePath = "c:\\exportPdf2.pdf";
  String imagePath = "c:\\exportImg2.bmp";
  Document document = new Document(); 
  try{
    Map getMap = request.getFileMap();
    MultipartFile mfile = (MultipartFile) getMap.get("imgData"); //获取数据
    InputStream file = mfile.getInputStream();
    byte[] fileByte = FileCopyUtils.copyToByteArray(file);
      
    FileImageOutputStream imageOutput = new FileImageOutputStream(new File(imagePath));//打开输入流
    imageOutput.write(fileByte, 0, fileByte.length);//生成本地图片文件
    imageOutput.close();
      
    PdfWriter.getInstance(document, new FileOutputStream(filePath)); //itextpdf文件
//    document.setPageSize(PageSize.A2);
    document.open();
    document.add(new Paragraph("JUST TEST ..."));
    Image image = Image.getInstance(imagePath); //itext-pdf-image
    float heigth = image.getHeight(); 
        float width = image.getWidth(); 
        int percent = getPercent2(heigth, width);  //按比例缩小图片
        image.setAlignment(Image.MIDDLE); 
        image.scalePercent(percent+3);
    document.add(image);
    document.close();
  
    result.setSuccess(true);
    operatelogService.addOperateLogInfo(request, "导出成功:成功导出简报Pdf");
  }catch (DocumentException de) {
    System.err.println(de.getMessage());
  }
  catch (Exception e) {
    e.printStackTrace();
    result.setSuccess(false);
    result.setErrorMessage(e.toString());
    try {
      operatelogService.addOperateLogError(request, "导出失败:服务器异常");
    } catch (Exception e1) {
      e1.printStackTrace();
    }
  }
  response.getWriter().print(JSONObject.fromObject(result).toString());
}

private static int getPercent2(float h, float w) {
  int p = 0;
  float p2 = 0.0f;
  p2 = 530 / w * 100;
  p = Math.round(p2);
  return p;
}

 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。

处理速度快,支持很多PDF"高级"特性。

但是itext出错的时候不会报错,直接跳过去,回头看pdf文档损坏,找不到出错原因,真是急死人。

最后感谢网络上有关的博文和贴子以及百度搜索。

以上这篇将html页面保存成图片,图片写入pdf的实现方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Convert Seconds To Hours
Jun 16 Javascript
JavaScript中出现乱码的处理心得
Dec 24 Javascript
jquery easyui 结合jsp简单展现table数据示例
Apr 18 Javascript
JavaScript实现给按钮加上双重动作的方法
Aug 14 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
Dec 04 Javascript
javascript每日必学之多态
Feb 23 Javascript
jQuery插件imgAreaSelect基础讲解
May 26 jQuery
bootstrap table服务端实现分页效果
Aug 10 Javascript
详解Vue如何支持JSX语法
Nov 10 Javascript
用Cordova打包Vue项目的方法步骤
Feb 02 Javascript
微信小程序3D轮播实现代码
Sep 19 Javascript
原生js拖拽功能制作滑动条实例代码
Feb 05 Javascript
jquery遍历标签中自定义的属性方法
Sep 17 #Javascript
jquery属性,遍历,HTML操作方法详解
Sep 17 #Javascript
详解Angular2中的编程对象Observable
Sep 17 #Javascript
详细总结Javascript中的焦点管理
Sep 17 #Javascript
js变量提升深入理解
Sep 16 #Javascript
再谈javascript常见错误及解决方法
Sep 16 #Javascript
使用JQuery中的trim()方法去掉前后空格
Sep 16 #Javascript
You might like
帅气的琦玉老师
2020/03/02 日漫
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
PHP令牌 Token改进版
2008/07/18 PHP
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
Prototype使用指南之range.js
2007/01/10 Javascript
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
详解Nodejs 通过 fs.createWriteStream 保存文件
2017/10/10 NodeJs
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
python爬取哈尔滨天气信息
2018/07/14 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
python中几种自动微分库解析
2019/08/29 Python
python 如何区分return和yield
2020/09/22 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
python eventlet绿化和patch原理
2020/11/21 Python
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
后勤人员岗位职责
2013/12/17 职场文书
环保专业大学生职业规划设计
2014/01/10 职场文书
校园摄影活动策划方案
2014/02/05 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
语文高效课堂实施方案
2014/05/03 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
2014年作风建设剖析材料
2014/10/23 职场文书
工程合作意向书范本
2015/05/09 职场文书
七夕情人节问候语
2015/11/11 职场文书