将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 相关文章推荐
jQuery Ajax使用 全解析
Dec 15 Javascript
jquery的attr方法禁用表单元素禁用输入内容
Jun 23 Javascript
jquery中show()、hide()和toggle()用法实例
Jan 15 Javascript
jQuery中ajax的load()与post()方法实例详解
Jan 05 Javascript
div实现自适应高度的textarea实现angular双向绑定
Jan 08 Javascript
Vue.js父与子组件之间传参示例
Feb 28 Javascript
原生js实现吸顶效果
Mar 13 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
Jul 04 jQuery
利用jQuery异步上传文件的插件用法详解
Jul 19 jQuery
详解Vue单元测试Karma+Mocha学习笔记
Jan 31 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
May 30 jQuery
使用Cargo工具高效创建Rust项目
Aug 14 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
360通用php防护代码(使用操作详解)
2013/06/18 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP中使用BigMap实例
2015/03/30 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
解决node.js安装包失败的几种方法
2016/09/02 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
微信小程序开发摇一摇功能
2019/11/22 Javascript
python中dir函数用法分析
2015/04/17 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
python处理二进制数据的方法
2015/06/03 Python
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
2017/10/15 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
Python用SSH连接到网络设备
2021/02/18 Python
高中政治教学反思
2014/01/18 职场文书
天鹅湖观后感
2015/06/09 职场文书
检讨书怎么写?
2019/06/21 职场文书
亲情作文之母爱
2019/09/25 职场文书
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis
MySQL数据管理操作示例讲解
2022/12/24 MySQL