`
kimmking
  • 浏览: 546133 次
  • 性别: Icon_minigender_1
  • 来自: 中华大丈夫学院
社区版块
存档分类
最新评论

jsPDF介绍与兼容IE的补丁

阅读更多

jsPDF介绍与兼容IE的补丁

KimmKing

2009429

前几天的JavaEye新闻频道介绍了jsPDF开源项目(《使用JavaScript,动态生成PDF)。

jsPDFJames Hall创建的一个在客户端使用纯JavaScript生成pdf文件的开源项目,项目在: http://code.google.com/p/jspdf/。目前只支持Safari,operaFirefox浏览器(奇怪,不支持占据绝对统治地位的IE~~~~)。

    js生成pdf?等等,pdf文件不是二进制的吗?JavaScript的一大遗憾就是不能直接操作二进制。呵呵,还真的勾起了本人对这个项目的兴趣。

    svn下了源码,呵呵,三个js文件:base64.jssprintf.jsjspdf.js。前两个都是开源的js类库。第一个看名字就知道是base64编码解码的函数库。打开文件看看,前两行就说明了出处:http://www.webtoolkit.info/。第二个还真不知道是做什么用的,c里的哪个输出函数?原来webtoolkit上也有,还真是源于c里的,格式化输出字符串的js函数。jspdf.js这个文件里的是生成pdf文件格式的函数。代码页不多,不到300行,短小精悍,使用简单,功能吗,自然也少,就两个功能addPagetextaddPage添加一个新的pdf页面。text则是在当前页面的指定位置写入文本。其实jspdf中实现了字体、长度单位、纸型等常见的参数设置,可惜的是作者没有把这些参数的设置暴露给外部调用的jsPDF对象(源代码分析以后再写吧,如果有机会的话)。可见目前的jsPDF不是一个稳定版本,还在完善中。另外作者写了一个添加图片的空方法未实现,添加图片实在是有一定的难度。

    一个典型的jsPDF应用如下:

jsPDF.init();

jsPDF.addPage();

jsPDF.text(20, 20, 'Hello world!');

jsPDF.text(20, 30, 'This is client-side Javascript, pumping out a PDF.');

jsPDF.addPage();

jsPDF.text(20, 20, 'Do you like that?');

var out = jsPDF.output();

var url = 'data:application/pdf;base64,' + Base64.encode(out);

document.location.href = url;

chrome浏览器中效果如下,呵呵,pdf出来了:

 

 

嚯嚯,看到了啥,没错,“data:application/pdf;base64,,这个东西,传说中的data url scheme,或者简称data协议。就是把数据放在后面,整个作为一个url使用,浏览器根据前缀的文件类型和编码(一般是base64),还原数据并展示,常用的例子比如小图片直接用这种方式编码到css代码中。(The "data" URL scheme: http://www.ietf.org/rfc/rfc2397.txt?number=2397)。可惜的是,IE作为一个特立独行的浏览器,一直没有实现这个标准。data协议在IE下无效。

 

IE下这么办呢?怎么能让jsPDFIE这破玩意儿下跑起来?想想,发挥下聪明才智,继承和发扬下中华民族的传统美德。

JavaScript生成pdf文件,就是说要先生成文件的文本内容,然后在新的页面打开,并让浏览器认为这个文件是pdf类型的。生成新的页面,无外乎:document.writelocation.hrefwindow.open

document.write 写出来的是HTMLJavaScript里还真是没有直接的办法让IE认为一个打开的窗口中的文档是其他的格式的。document.docType标识文档类型,只读。document.write不行,window.open一个空页面,写内容的方式也不可行。

IE不支持Data协议,那么,有没有类似的默认协议或处理方式呢?baidugooglemsdnxxxxxx,没找到。真的没有。IE可以自己定义url协议的,比如qq、迅雷、bt等等,在注册表里注册下自己写的处理程序就成。算了,这个自己写个data协议的处理程序,让用户装程序,意义不大(而且IEurl的长度限制是2083字节,随便什么base64下,都很容易超出来)。url带数据的方式也不太可行。

Data协议一般是把文件base64编码,嵌入到url里。IE下,常用的将文件嵌入到html里的技术,mht!呵呵。IE打开百度,另存为mht文件,再用记事本打开,果然base64的。不过,可惜的是,将pdfbase64写到mht文件,然后用IE打开,IE是不认的。就算IE能够识别mht中的pdf,引发的另一个问题是JavaScript生成mht需要的所有文字后,如何让IE认为这段文本是mht格式的?如果是一个文件或是url,以.mht结尾,IE认为是mht格式的。mht是个鸡肋。

最后一招,只能是写临时文件了,然后跳转到或是打开这个临时文件。base64都免了,直接存pdf文件就成了。JavaScript不支持io的,还好的是万恶又彪悍的ActiveX同学提供了需要的一切,一个系统内置的FileObjectSystem就足够用了。

修改jsPDF的思路如下:

1.   生成pdf文本

2.   判断浏览器类型

3.   IE浏览器还用原来的处理方式

4.   IE浏览器用fso取系统临时文件夹

5.   保存pdf文本为pdf文件

6.   跳转或是打开此pdf文件

需要注意的是,使用ActiveX组件需要降低IE的安全级别。如果是本地测试,需要在“工具”-Internet选项”-“安全”中降低“本地intranet”的安全性。如果是远程的web站点,则可以将站点的url添加到“可信站点”并降低次区域的安全性。运行时,按IE提示允许ActiveX运行即可。

    补丁文件:jspdf.fix.js,提供了一个统一的调用方法openPdf( pdfText, bBlank,  pdfName)pdfText为生成的pdf文本,bBlank为是href还是openpdfName表示IE下生成临时文件的文件名。


修改后的调用方式,(--就一句~~

jsPDF.init();

jsPDF.addPage();

jsPDF.text(20, 20, 'Hello world!');

jsPDF.text(20, 30, 'This is client-side Javascript, pumping out a PDF.');

jsPDF.addPage();

jsPDF.text(20, 20, 'Do you like that?');

var out = jsPDF.output();

qsoft.openPdf(out,false,'test');

IE下的效果:

 

 

 

 

 

 

分享到:
评论
5 楼 kimmking 2009-04-29  
whaosoft 写道
唉 郁闷这俩天写js 写死我了

好恶心 还是flex好

js很郁闷,这两天有个煎熬 “whaosoft”的人写我。
4 楼 whaosoft 2009-04-29  
唉 郁闷这俩天写js 写死我了

好恶心 还是flex好
3 楼 toney_kissinger 2009-04-29  
个为认为,还是服务器端生成PDF才是王道.客户端始终是能做的事情太少了.
2 楼 kimmking 2009-04-29  
<pre name="code" class="js">//  jspdf.fix.js</pre>
<pre name="code" class="js">/**
* jsPDF 0.1 (experimental) fix
* (c) 2009 KimmKing
*
* fix jsPDF for IE~~, based on the ActiveX: FileSystemObject
*/

var __ua__ = navigator.userAgent.toLowerCase();

var qsoft = {
        prefx : 'qsoft',
        isIE : __ua__.indexOf("msie") &gt; -1,
        isIE6 : __ua__.indexOf("msie 6") &gt; -1,
        isIE7 : __ua__.indexOf("msie 7") &gt; -1,
        isSafari : __ua__.indexOf("safari") &gt; -1,
        isChrome : __ua__.indexOf("chrome") &gt; -1,
        //fso:{},
        getTempFolder : function ()
        {
        return qsoft.fso.GetSpecialFolder(2); 
        },
        crTempFile : function (filename)
        {
        return qsoft.fso.CreateTextFile(filename, true);
        },
        openPdf : function (pdfText,bBlank, pdfName)
        {
            var filename ;
           
            if(qsoft.isIE)
            {
if(typeof(qsoft.fso) == 'undefined')
{
alert('调用FSO出错,请降低IE安全设置,刷新页面并重试。');
return ;
}
                var tempFolder = qsoft.getTempFolder();
                var name = pdfName || "qsoft";
                filename = tempFolder + "/" + name + ".pdf" ;
                var f = qsoft.crTempFile(filename);
                f.WriteLine(pdfText);
                f.Close();
            }
            else
            {
               filename =  'data:application/pdf;base64,' + Base64.encode(pdfText);
            }
           
            if(bBlank)
            {
                window.open(filename);
            }
            else
            {
                document.location.href = filename;
            }
           
        }
    }
   

        if(qsoft.isIE)
        {
            try{
                qsoft.fso = new ActiveXObject("Scripting.FileSystemObject");
            }
            catch(e)
            {
                alert("请降低IE的安全级别。");
            }
        }</pre>
<p> </p>
1 楼 Hooopo 2009-04-29  
嚯嚯,,好强大!!

相关推荐

    pdf.js pdf在线预览组件,支持IE,chrome

    3. **跨浏览器兼容**:PDF.js特别注重对不同浏览器的支持,包括对老版本IE的兼容,这通常需要额外的工作来解决浏览器之间的差异。 4. **交互性**:除了预览,PDF.js还提供了下载和打印PDF的功能。下载功能允许用户...

    jspdf 导出页面内容

    在描述中提到了`jspdf`对IE浏览器的兼容性,这很重要,因为IE(Internet Explorer)虽然已经被Microsoft Edge取代,但在某些企业环境中仍然被广泛使用。`jspdf`通过使用polyfills和适当的代码优化来确保在旧版IE浏览...

    jsPDF打印超长内容

    2. 使用第三方插件或库:社区可能已经提供了针对长内容的扩展或补丁,可以集成这些解决方案。 3. 分块渲染:手动分割长内容,每次只渲染一部分到Canvas,然后使用jsPDF的`addImage`方法将每个Canvas图像添加到PDF。 ...

    jspdf.customfonts.rar

    **jsPDF库与自定义字体支持** 在网页开发中,我们常常遇到需要将网页内容导出为PDF的需求,这时jsPDF这个JavaScript库就显得尤为重要。jsPDF是一个轻量级的库,它允许开发者在浏览器端生成PDF文件,使得用户可以...

    html2canvas 与 jspdf 相结合生成 pdf 内容被截断的终极解决方案

    html2canvas 与 jspdf 相结合生成 pdf 内容被截断的终极解决方案,设置背景色为白色,然后转成图片后,获取截断处图片像素点,从截断处往上一行行扫描像素点颜色,碰到这一行颜色都是全白的,代表是从这里开始截断,...

    Vue网页html转换PDF(最低兼容ie10)的思路详解

    页面底层实现——Vue与IE10兼容性** Vue.js是一个流行的前端JavaScript框架,用于构建用户界面。由于IE10及更低版本对某些现代Web技术的支持有限,因此在实现HTML到PDF转换时需要特别关注兼容性问题。为了确保在IE...

    jspdf实现JavaScript显示pdf文档可分页哦

    `jspdf` 尽力兼容大多数现代浏览器,但它可能会在一些旧版浏览器或某些特定环境下表现不佳。为了提高性能,可以使用`html2canvas`库先将HTML元素转换为canvas,然后再转换为PDF。然而,这可能会增加文件大小并消耗...

    jspdf_1.5.3.zip

    - **Fabric.js**:与jsPDF结合,可以更方便地处理canvas中的复杂图形。 5. **最佳实践** - 使用最新的稳定版本,以获取最新特性和修复。 - 在开发阶段使用调试版,方便找出和解决代码问题。 - 在生产环境中使用...

    jsPDF-master.zip

    尽管IE9及以下版本的支持存在限制,但在现代浏览器中,jsPDF的表现通常非常出色。 2. **内容多样性**:jsPDF可以处理文本、图像、图形等多样化的元素,使其适用于生成各种类型的文档,如活动门票、报告、证书等。它...

    jspdf支持分页和清晰度处理DEMO

    《jspdf:实现高效分页与清晰度处理的利器》 在数字时代,PDF文档由于其跨平台性和可打印性,被广泛应用于各种场景。在Web开发中,将网页内容转化为PDF格式的需求日益增长,而jspdf正是这样一个JavaScript库,它...

    jspdf中文乱码解决方法.zip

    这通常是由于字符编码不兼容或缺少字体支持导致的。本教程将详细解释如何解决jspdf中文乱码的问题,帮助开发者顺利导出含有中文内容的PDF。 首先,我们需要理解jspdf的基本工作原理。jspdf是一个JavaScript库,它...

    使用jspdf打印pdf 支持分页

    这个教程将详细介绍如何使用`jspdf`来实现HTML到PDF的转换,并支持分页功能。 首先,`jspdf`库的核心功能是提供了一个在浏览器环境中创建PDF文档的API。它允许开发者使用JavaScript动态创建PDF文件,包括添加文本、...

    JSPDF(解决了全页面截图文图)

    8. **兼容性**:JSPDF适用于现代浏览器,但可能在一些较旧的或者不常见的浏览器上存在问题。开发者需要注意测试和适配不同环境。 9. **示例和文档**:JSPDF官方提供详细的文档和示例代码,帮助开发者快速上手。...

    jspdf html页面生成pdf

    JSPDF 是一个流行的JavaScript库,用于在客户端生成PDF文档。它允许开发者将HTML页面的内容转换为高质量的PDF格式,以便于保存、打印或分享。在Web应用程序中,这种功能尤其有用,因为它提供了从网页直接创建文档的...

    jsPDF-master 使用demo

    **jsPDF介绍** jsPDF是一款JavaScript库,专为在Web浏览器中生成PDF文件而设计。这个库允许开发者在用户端创建、编辑和保存PDF文档,无需服务器端的支持。jsPDF适用于那些希望在网页上提供离线下载或打印功能,或者...

    jsPdf.debug.zip

    9. **兼容性**:jsPdf兼容大部分现代浏览器,但可能在某些旧版本或非主流浏览器上表现不佳,需要注意适配和测试。 10. **社区与扩展**:jsPdf拥有活跃的开发者社区,提供了一些扩展插件,如Autoprint、AddImageWebP...

    pdf生成插件jspdf

    `jspdf`允许开发者通过JavaScript代码生成定制化的PDF文件,包括文字、图片、表格、链接等内容,并且能够保持与网页设计一致的样式。 描述中提到"样式可以自定义",这意味着`jspdf`提供了丰富的API,允许开发者...

    jspdf_font.zip

    `jspdf_font.zip` 是一个与 JSPDF 库相关的压缩包,它包含了用于解决 JSPDF 在处理中文字符时可能出现的乱码问题的字体资源。JSPDF 是一个流行的 JavaScript 库,允许在浏览器环境中生成 PDF 文档。在处理非英文字符...

    jspdf.debug.js下载

    jspdf.debug.js 是基于 HTML5 解析与渲染 PDF 的 JavaScript 库,由 Mozilla 主导开源。用于生成各种用途的 PDF 文档。 jspdf.debug.js 主要用于前端。把相关文件,如html转换成pdf的插件。调用api较简单易上手。...

    jspdf快速组件jspdf快速组件

    **jspdf快速组件详解** `jspdf`是一个流行的JavaScript库,专为在Web浏览器中生成PDF文档而设计。它允许开发者使用纯JavaScript将HTML、文本、图像甚至SVG内容转换为高质量的PDF文件,使得在前端生成PDF变得...

Global site tag (gtag.js) - Google Analytics