mg老虎机官网将HTML导出生成word文书档案,

作者:信息技术

应用 canvas 完结数据压缩

2016/03/15 · HTML5 · 1 评论 · Canvas

原来的小说出处: EtherDream   

前面三个达成 SVG 转 PNG

2015/11/16 · JavaScript · PNG, SVG

初藳出处: 百度FEX - zhangbobell   

将HTML导出生成word文书档案,

 

前言

HTTP 帮衬 GZip 压缩,可节约数不尽传输能源。但遗憾的是,唯有下载才有,上传并不扶植。

假若上传也能减弱,那就宏观了。特别适合多量文书提交的场合,比如和讯,正是很好的例证。

即便正规不帮忙「上传压缩」,但还是可以够友善来落到实处。

前言

svg 是意气风发种矢量图形,在 web 上运用很布满,不过众多时候由于使用的场景,平时须要将 svg 转为 png 格式,下载到本地等。随着浏览器对 HTML 5 的支撑度越来越高,大家得以把 svg 转为 png 的行事交给浏览器来产生。

前言:

品类支出中相见了索要将HTML页面包车型大巴源委导出为八个word文档,所以有了那边小说。

道理当然是那样的,项目花费又时间有个别急切,第有时间想到的是用插件,所以百度了下。上面就介绍五个导出word文书档案的诀要。

Flash

首推方案当然是 Flash,终归它提供了压缩 API。除了 zip 格式,还援助 lzma 这种拔尖压缩。

因为是原生接口,所以质量相当的高。并且对应的 swf 文件,也非常小。

貌似方法

  1. 创建 imageimage,src = xxx.svg;
  2. 创设 canvas,dragImage 将图片贴到 canvas 上;
  3. 接受 toDataUrl 函数,将 canvas 的代表为 url;
  4. new image, src = url, download = download.png;

只是,在改变的时候有的时候有的时候会遇上如下的如下的七个难题:

法一:通过jquery.wordexport.js导出word

备注:兼容IE9以上

概略浏览了下jquery.wordexport.js插件的代码,精晓到了经过该插件能够导出文本和图片,而图片首先通过canvas的样式

绘图,文本则必要再信任FileSaver.js插件,FileSaver.js插件则根本透过H5的文本操作新天性new Blob()和new FileReader()

来落实公文的导出。

插件源码:

FileSaver.js

mg老虎机官网 1 1 /* FileSaver.js 2 * A saveAs() FileSaver implementation. 3 * 1.3.2 4 * 2016-06-16 18:25:19 5 * 6 * By Eli Grey, 7 * License: MIT 8 * See 9 */ 10 11 /*global self */ 12 /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */ 13 14 /*! @source */ 15 16 var saveAs = saveAs || (function(view) { 17 "use strict"; 18 // IE <10 is explicitly unsupported 19 if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]./.test(navigator.userAgent)) { 20 return; 21 } 22 var 23 doc = view.document 24 // only get URL when necessary in case Blob.js hasn't overridden it yet 25 , get_URL = function() { 26 return view.URL || view.webkitURL || view; 27 } 28 , save_link = doc.createElementNS("", "a") 29 , can_use_save_link = "download" in save_link 30 , click = function(node) { 31 var event = new MouseEvent("click"); 32 node.dispatchEvent(event); 33 } 34 , is_safari = /constructor/i.test(view.HTMLElement) 35 , is_chrome_ios =/CriOS/[d]+/.test(navigator.userAgent) 36 , throw_outside = function(ex) { 37 (view.setImmediate || view.setTimeout)(function() { 38 throw ex; 39 }, 0); 40 } 41 , force_saveable_type = "application/octet-stream" 42 // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to 43 , arbitrary_revoke_timeout = 1000 * 40 // in ms 44 , revoke = function(file) { 45 var revoker = function() { 46 if (typeof file === "string") { // file is an object URL 47 get_URL().revokeObjectURL(file); 48 } else { // file is a File 49 file.remove(); 50 } 51 }; 52 setTimeout(revoker, arbitrary_revoke_timeout); 53 } 54 , dispatch = function(filesaver, event_types, event) { 55 event_types = [].concat(event_types); 56 var i = event_types.length; 57 while (i--) { 58 var listener = filesaver["on" + event_types[i]]; 59 if (typeof listener === "function") { 60 try { 61 listener.call(filesaver, event || filesaver); 62 } catch (ex) { 63 throw_outside(ex); 64 } 65 } 66 } 67 } 68 , auto_bom = function(blob) { 69 // prepend BOM for UTF-8 XML and text/* types (including HTML) 70 // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF 71 if (/^s*(?:text/S*|application/xml|S*/S*+xml)s*;.*charsets*=s*utf-8/i.test(blob.type)) { 72 return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type}); 73 } 74 return blob; 75 } 76 , FileSaver = function(blob, name, no_auto_bom) { 77 if (!no_auto_bom) { 78 blob = auto_bom(blob); 79 } 80 // First try a.download, then web filesystem, then object URLs 81 var 82 filesaver = this 83 , type = blob.type 84 , force = type === force_saveable_type 85 , object_url 86 , dispatch_all = function() { 87 dispatch(filesaver, "writestart progress write writeend".split(" ")); 88 } 89 // on any filesys errors revert to saving with object URLs 90 , fs_error = function() { 91 if ((is_chrome_ios || (force && is_safari)) && view.FileReader) { 92 // Safari doesn't allow downloading of blob urls 93 var reader = new FileReader(); 94 reader.onloadend = function() { 95 var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;'); 96 var popup = view.open(url, '_blank'); 97 if(!popup) view.location.href = url; 98 url=undefined; // release reference before dispatching 99 filesaver.readyState = filesaver.DONE; 100 dispatch_all(); 101 }; 102 reader.readAsDataURL(blob); 103 filesaver.readyState = filesaver.INIT; 104 return; 105 } 106 // don't create more object URLs than needed 107 if (!object_url) { 108 object_url = get_URL().createObjectURL(blob); 109 } 110 if (force) { 111 view.location.href = object_url; 112 } else { 113 var opened = view.open(object_url, "_blank"); 114 if (!opened) { 115 // Apple does not allow window.open, see 116 view.location.href = object_url; 117 } 118 } 119 filesaver.readyState = filesaver.DONE; 120 dispatch_all(); 121 revoke(object_url); 122 } 123 ; 124 filesaver.readyState = filesaver.INIT; 125 126 if (can_use_save_link) { 127 object_url = get_URL().createObjectURL(blob); 128 setTimeout(function() { 129 save_link.href = object_url; 130 save_link.download = name; 131 click(save_link); 132 dispatch_all(); 133 revoke(object_url); 134 filesaver.readyState = filesaver.DONE; 135 }); 136 return; 137 } 138 139 fs_error(); 140 } 141 , FS_proto = FileSaver.prototype 142 , saveAs = function(blob, name, no_auto_bom) { 143 return new FileSaver(blob, name || blob.name || "download", no_auto_bom); 144 } 145 ; 146 // IE 10+ (native saveAs) 147 if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) { 148 return function(blob, name, no_auto_bom) { 149 name = name || blob.name || "download"; 150 151 if (!no_auto_bom) { 152 blob = auto_bom(blob); 153 } 154 return navigator.msSaveOrOpenBlob(blob, name); 155 }; 156 } 157 158 FS_proto.abort = function(){}; 159 FS_proto.readyState = FS_proto.INIT = 0; 160 FS_proto.WRITING = 1; 161 FS_proto.DONE = 2; 162 163 FS_proto.error = 164 FS_proto.onwritestart = 165 FS_proto.onprogress = 166 FS_proto.onwrite = 167 FS_proto.onabort = 168 FS_proto.onerror = 169 FS_proto.onwriteend = 170 null; 171 172 return saveAs; 173 }( 174 typeof self !== "undefined" && self 175 || typeof window !== "undefined" && window 176 || this.content 177 )); 178 // `self` is undefined in Firefox for Android content script context 179 // while `this` is nsIContentFrameMessageManager 180 // with an attribute `content` that corresponds to the window 181 182 if (typeof module !== "undefined" && module.exports) { 183 module.exports.saveAs = saveAs; 184 } else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) { 185 define([], function() { 186 return saveAs; 187 }); 188 } View Code

jquery.wordexport.js

mg老虎机官网 2 1 if (typeof jQuery !== "undefined" && typeof saveAs !== "undefined") { 2 (function($) { 3 $.fn.wordExport = function(fileName) { 4 fileName = typeof fileName !== 'undefined' ? fileName : "jQuery-Word-Export"; 5 var static = { 6 mhtml: { 7 top: "Mime-Version: 1.0nContent-Base: " + location.href + "nContent-Type: Multipart/related; boundary="NEXT.ITEM-BOUNDARY";type="text/html"nn--NEXT.ITEM-BOUNDARYnContent-Type: text/html; charset="utf-8"nContent-Location: " + location.href + "nn<!DOCTYPE html>n<html>n_html_</html>", 8 head: "<head>n<meta http-equiv="Content-Type" content="text/html; charset=utf-8">n<style>n_styles_n</style>n</head>n", 9 body: "<body>_body_</body>" 10 } 11 }; 12 var options = { 13 maxWidth: 624 14 }; 15 // Clone selected element before manipulating it 16 var markup = $(this).clone(); 17 18 // Remove hidden elements from the output 19 markup.each(function() { 20 var self = $(this); 21 if (self.is(':hidden')) 22 self.remove(); 23 }); 24 25 // Embed all images using Data URLs 26 var images = Array(); 27 var img = markup.find('img'); 28 for (var i = 0; i < img.length; i++) { 29 // Calculate dimensions of output image 30 var w = Math.min(img[i].width, options.maxWidth); 31 var h = img[i].height * (w / img[i].width); 32 // Create canvas for converting image to data URL 33 var canvas = document.createElement("CANVAS"); 34 canvas.width = w; 35 canvas.height = h; 36 // Draw image to canvas 37 var context = canvas.getContext('2d'); 38 context.drawImage(img[i], 0, 0, w, h); 39 // Get data URL encoding of image 40 var uri = canvas.toDataURL("image/png/jpg"); 41 $(img[i]).attr("src", img[i].src); 42 img[i].width = w; 43 img[i].height = h; 44 // Save encoded image to array 45 images[i] = { 46 type: uri.substring(uri.indexOf(":") + 1, uri.indexOf(";")), 47 encoding: uri.substring(uri.indexOf(";") + 1, uri.indexOf(",")), 48 location: $(img[i]).attr("src"), 49 data: uri.substring(uri.indexOf(",") + 1) 50 }; 51 } 52 53 // Prepare bottom of mhtml file with image data 54 var mhtmlBottom = "n"; 55 for (var i = 0; i < images.length; i++) { 56 mhtmlBottom += "--NEXT.ITEM-BOUNDARYn"; 57 mhtmlBottom += "Content-Location: " + images[i].location + "n"; 58 mhtmlBottom += "Content-Type: " + images[i].type + "n"; 59 mhtmlBottom += "Content-Transfer-Encoding: " + images[i].encoding + "nn"; 60 mhtmlBottom += images[i].data + "nn"; 61 } 62 mhtmlBottom += "--NEXT.ITEM-BOUNDARY--"; 63 64 //TODO: load css from included stylesheet 65 66 //var styles=' /* Font Definitions */@font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 680460288 22 0 262145 0;} @font-face{font-family:"Cambria Math";panose-1:2 4 5 3 5 4 6 3 2 4;mso-font-charset:1;mso-generic-font-family:roman;mso-font-format:other;mso-font-pitch:variable;mso-font-signature:0 0 0 0 0 0;} @font-face{font-family:"@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 680460288 22 0 262145 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-unhide:no;mso-style-qformat:yes;mso-style-parent:"";margin:0cm;margin-bottom:.0001pt;mso-pagination:widow-orphan;font-size:14.0pt;font-family:行书;mso-bidi-font-family:行草;}p.MsoHeader, li.MsoHeader, div.MsoHeader{mso-style-noshow:yes;mso-style-priority:99;mso-style-link:"页眉 Char";margin:0cm;margin-bottom:.0001pt;text-align:center;mso-pagination:widow-orphan;layout-grid-mode:char;font-size:9.0pt;font-family:黑体;mso-bidi-font-family:石籀文;}p.MsoFooter, li.MsoFooter, div.MsoFooter{mso-style-noshow:yes;mso-style-priority:99;mso-style-link:"页脚 Char";margin:0cm;margin-bottom:.0001pt;mso-pagination:widow-orphan;layout-grid-mode:char;font-size:9.0pt;font-family:陶文;mso-bidi-font-family:石籀文;}p.MsoAcetate, li.MsoAcetate, div.MsoAcetate{mso-style-noshow:yes;mso-style-priority:99;mso-style-link:"批注框文本 Char";margin:0cm;margin-bottom:.0001pt;mso-pagination:widow-orphan;font-size:9.0pt;font-family:小篆;mso-bidi-font-family:黑体;}span.Char{mso-style-name:"页眉 Char";mso-style-noshow:yes;mso-style-priority:99;mso-style-unhide:no;mso-style-locked:yes;mso-style-link:页眉;font-family:陶文;mso-ascii-font-family:草书;mso-fareast-font-family:大篆;mso-hansi-font-family:行书;}span.Char0{mso-style-name:"页脚 Char";mso-style-noshow:yes;mso-style-priority:99;mso-style-unhide:no;mso-style-locked:yes;mso-style-link:页脚;font-family:甲骨文;mso-ascii-font-family:甲骨文;mso-fareast-font-family:黑体;mso-hansi-font-family:黑体;}span.Char1{mso-style-name:"教学框文本 Char";mso-style-noshow:yes;mso-style-priority:99;mso-style-unhide:no;mso-style-locked:yes;mso-style-link:传授框文本;font-family:行书;mso-ascii-font-family:燕书;mso-fareast-font-family:钟鼓文;mso-hansi-font-family:燕书;}p.msochpdefault, li.msochpdefault, div.msochpdefault{mso-style-name:msochpdefault;mso-style-unhide:no;mso-margin-top-alt:auto;margin-right:0cm;mso-margin-bottom-alt:auto;margin-left:0cm;mso-pagination:widow-orphan;font-size:10.0pt;font-family:楷体;mso-bidi-font-family:燕书;}span.msonormal0{mso-style-name:msonormal;mso-style-unhide:no;}.MsoChpDefault{mso-style-type:export-only;mso-default-props:yes;font-size:10.0pt;mso-ansi-font-size:10.0pt;mso-bidi-font-size:10.0pt;mso-ascii-font-family:"提姆es New 罗曼";mso-hansi-font-family:"Times New 罗曼";mso-font-kerning:0pt;}/* Page Definitions */ @page WordSection1{size:595.3pt 841.9pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;mso-header-margin:42.55pt;mso-footer-margin:49.6pt;mso-paper-source:0;}div.WordSection1{page:WordSection1;}'; 67 68 var styles=""; 69 70 // Aggregate parts of the file together 71 var fileContent = static.mhtml.top.replace("_html_", static.mhtml.head.replace("_styles_", styles) + static.mhtml.body.replace("_body_", markup.html())) + mhtmlBottom; 72 73 // Create a Blob with the file contents 74 var blob = new Blob([fileContent], { 75 type: "application/msword;charset=utf-8" 76 }); 77 saveAs(blob, fileName + ".doc"); 78 }; 79 })(jQuery); 80 } else { 81 if (typeof jQuery === "undefined") { 82 console.error("jQuery Word Export: missing dependency (jQuery)"); 83 } 84 if (typeof saveAs === "undefined") { 85 console.error("jQuery Word Export: missing dependency (FileSaver.js)"); 86 } 87 } View Code

插件调用:

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title>生成word文档</title>
 6 </head>
 7 <body lang=ZH-CN style='tab-interval:21.0pt'>
 8 <div class="word">
 9     <p align="center">10 </div>
11 <input type="button" value="导出word">
12 <script src="http://www.yimaiyuju.com/uploads/allimg/191126/151JRH0-2.jpg"></script>
13 <script type="text/javascript" src="js/FileSaver.js"></script>
14 <script type="text/javascript" src="js/jquery.wordexport.js"></script>
15 <script>
16     $(function(){
17         $("input[type='button']").click(function(event) {
18             $(".word").wordExport('生成word文档');
19         });
20     })
21 </script>
22 </body>
23 </html>

直白调用wordExport()接口就足以导出word文书档案,传的参数为导出的word文件名。

补充:

因而大家不荒谬写的外联样式设置样式是对事情没有什么益处的,通过个人的举办发掘需求写内联样式才具奏效,而单位也急需坚决守护word的安插

单位pt设置。

而jquery.wordexport.js插件是要陈设了个style样式让我们补充样式设置的:

mg老虎机官网 3

而是个人奉行了下,设置的样式却力不能及生效,只可以通过内联设置才生效。

截图:

mg老虎机官网 4mg老虎机官网 5

JavaScript

Flash 逐步淘汰,但取代的 HTML5,却未有提供压缩 API。只好和煦用 JS 达成。

那即便平价,但运营速度就慢多了,而且相应的 JS 也非常的大。

生机勃勃经代码有 50kb,而数据压缩后只小 10kb,那就不足了。除非量大,才有意义。

题目 1 :浏览器对 canvas 约束

Canvas 的 W3C 的正统上尚无聊到 canvas 的最大高/宽度和面积,不过每一个商家的浏览器出于浏览器品质的设想,在不相同的平台上设置了最大的高/宽度或然是渲染面积,超过了这些阈值渲染的结果会是赤手。测量试验了三种浏览器的 canvas 质量如下:

  • chrome (版本 46.0.2490.80 (64-bit))
    • 最大范围:268, 435, 456 px^2 = 16, 384 px * 16, 384 px
    • 最大宽/高:32, 767 px
  • firefox (版本 42.0)
    • 最大规模:32, 767 px * 16, 384 px
    • 最大宽/高:32, 767px
  • safari (版本 9.0.1 (11601.2.7.2))
    • 最大规模: 268, 435, 456 px^2 = 16, 384 px * 16, 384 px
  • ie 10(版本 10.0.9200.17414)
    • 最大宽/高: 8, 192px * 8, 192px

在平日的 web 应用中,可能非常少会超越这几个节制。可是,假如当先了那一个限定,则 会招致导出为空白可能是因为内部存储器败露招致浏览器崩溃。

何况从一方面来讲, 导出 png 也是大器晚成项很成本内部存款和储蓄器的操作,粗略测度一下,导出 16, 384 px * 16, 384 px 的 svg 会消耗 16384 * 16384 * 4 / 1024 / 1024 = 1024 M 的内部存储器。所以,在近似那么些极限值的时候,浏览器也会 反应变慢,能还是不可能导出成功也跟系统的可用内存大小等等都有涉及。

对于这几个标题,好似下三种缓和方式:

  1. 将数据发送给后端,在后端达成 转变;
  2. 前端将 svg 切分成四个图片导出;

首先种方法能够使用 PhantomJS、inkscape、ImageMagick 等工具,相对来讲比较轻巧,这里大家最主要探寻第两种缓慢解决措施。

法二:通过百度js模板引擎生成word文书档案

重大是经过js模板设置相应的标签,然后XDoc.to(baidu.template())导出word,而由此百度js模板引擎的益处是也足以导出PDF文件。

完整demo:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="UTF-8">
 5     <script type="text/javascript" src="http://www.xdocin.com/xdoc.js"></script>
 6     <script type="text/javascript" src="http://www.xdocin.com/baiduTemplate.js"></script>
 7     <style>
 8         .head{
 9             font-size: 29px;
10             display: block;
11         }
12         .content{
13             display: block;
14         }
15     </style>
16 </head>
17 <body>
18 <input type="button" onclick="gen('pdf')" value="生成PDF"/>
19 <input type="button" onclick="gen('docx')" value="生成Word"/>
20 <br/>
21 <script id="tmpl" type="text/html">
22     <xdoc version="A.3.0">
23         <body>
24         <para heading="1" lineSpacing="28">
25             <text class="head" valign="center" fontName="标宋" fontSize="29"><%=title%></text>
26         </para>
27         <para>
28             <img  src="<%=img%>" sizeType="autosize"/>
29         </para>
30         <para lineSpacing="9">
31             <text class="content" fontName="仿宋" fontSize="18"><%=content%></text>
32         </para>
33         </body>
34     </xdoc>
35 </script>
36 <script src="http://www.yimaiyuju.com/uploads/allimg/191126/151JRH0-2.jpg"></script>
37 <script type="text/javascript">
38     var type="docx";//pdf
39     var data = {
40         title: "导出"+type+"文件",
41         img: "http://www.wordlm.com/uploads/allimg/130101/1_130101000405_1.jpg",
42         content: "我这样就可以导出"+type+"格式的文件了,是不是很方便",
43     };
44     function renderTemplate(){
45         var template=$("#tmpl").html();
46         var html=template.replace(/<%=title%>/,data.title)
47                 .replace(/<%=img%>/,data.img)
48                 .replace(/<%=content%>/,data.content);
49         $("body").append(html);
50     }
51     renderTemplate();
52     function gen(type) {
53         XDoc.to(baidu.template('tmpl', data), type, {}, "_blank");
54     }
55     console.log('http://www.xdocin.com/xml.html');
56 </script>
57 </body>
58 </html>  

这里作者经过renderTemplate函数叫js模板渲染到HTML中,完毕了文件的来得和导出内容的结合。而因为此处导出的word文书档案是急需极其设置样式的,所以在页面样式浮现下我们得以经过增多.class的不二等秘书技设置。

附部分导出word文书档案样式设置:

mg老虎机官网 6

 

截图:

mg老虎机官网 7mg老虎机官网 8

 

更加多仿照效法:

FileSave.js:

百度导出文书档案模板:

 

前言: 项目支出中蒙受了特需将HTML页面包车型客车内容导出为八个word文书档案,所以有了此间小说。 当然,项目成本又时间有...

本文由杏彩发布,转载请注明来源

关键词: