整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

通过html2canvas+jspdf将html页面生成PDF下载

里讲一种实现起来比较简单的html转pdf下载的实现。

依赖插件

html2canvas jspdf

思路

通过html2canvas,我们可以将指定的一个dom元素,渲染到canvas中,然后从canva中获得该图片,并将图片通过jspdf来生成。

代码

function createPdf (selector,pagesize,direction,title){
    var key = pagesize +''+direction;
    var settings = {
        '00' : {
            pdf : {orientation : 'portrait',format : 'a4',unit : 'px'},
            width : 448,
            height : 632.5
        },
        '01' : {
            pdf : {orientation : 'landscape',format : 'a4',unit : 'px'},
            width : 632.5,
            height : 448
        },
        '10' : {
            pdf : {orientation : 'portrait',format : 'a3',unit : 'px'},
            width : 632.5,
            height : 894.2
        },
        '11' : {
            pdf : {orientation : 'landscape',format : 'a3',unit : 'px'},
            width : 894.2,
            height : 632.5
        }
    };
    var set = settings[key];
    var doc = new jsPDF(set.pdf);
    var arr = [];//根据顺序保存
    var $arr = $(selector);
    function tempCreate(){
        if($arr.length == 0){//没有啦
            //执行生成
            tempPdf();
        }else{
            var $dom = $arr.splice(0,1);
            html2canvas($dom[0]).then(canvas => {
                var dataurl = canvas.toDataURL('image/png');
                arr.push(dataurl);
                tempCreate();
            });
        }
    }
    function tempPdf(){
        arr.forEach((item,i)=>{
            if(i !== 0){
                doc.addPage();
            }
            doc.addImage(item,'png',-1,-1,set.width,set.height);//根据不同的宽高写入
        })
        //根据当前的作业名称
        doc.save(title+'.pdf');
    }
    tempCreate();
}

需要指定容器(依赖jquery),然后指定纸张A4或 A3,以及横纵向。

//调用
createPdf('.single-page',0,0,'test')

当然,如果是数据量很大的话,就不建议在前台生成了,最好还是放在后端去做。个人测试过,做A4的图片生成PDF,当数量大约在100左右的时候,浏览器就崩溃了,如果只是几页的数据的话,这个方式还是很方便的。

Ps:浏览器要是现代浏览器哈。

参考资料

html2canvas : http://html2canvas.hertzen.com/ jspdf :https://github.com/MrRio/jsPDF

载PDF或excel有很多方法,Excel很简单,但是PDF通常在CSS和其他很多方面有问题。我对此做了更多的研究,发现使用CutyCapt.exe将网页捕获为PDF或图像更方便。

CutyCapt是什么?

CutyCapt是一个小型的跨平台命令行工具,用于捕获WebKit将web页面呈现为各种矢量和位图格式的方法,包括SVG、PDF、PS、PNG、JPEG、TIFF、GIF和BMP。请参阅IECapt以获取基于Internet Explorer的类似工具。

要求

  1. 创建PDF的过程是使用一个名为CutyCapt.exe的可执行文件来完成的,下载exe并将其添加到解决方案中。
  2. 如果我们使用ASP.NET创建项目时,可在重定向页面上调用exe,这个页面将是空白的,在页面加载中有以下代码。

实现

  1. 创建一个文件名和路径:为了使文件名唯一,我更推荐使用GUID(这是开发人员根据需求和逻辑做出的选择),然后将文件URL添加到一个字符串中。
string filename = Guid.NewGuid() + ".pdf"; //unique file name  
// url of the pdf file name   
string url = “http://example.org” +"/CutyCapt/" + filename; 
  1. 可执行文件的位置:cutycap.exe的位置被分配给一个字符串。
//location of Executable  
string cutycaptLocation = "D:\\CutyCapt";  
  1. 命令创建:用于在ASP中创建命令。NET中,我们使用ProcessStartInfo对象。将不同的参数作为属性赋给对象,如下所示:

a. CreateNoWindow
b. WorkingDirectory
c. FileName
d. Arguments
- 需要转换成PDF格式的网页链接
- 目标文件夹
e. UseShellExecute

// Command for execution   
System.Diagnostics.ProcessStartInfo pi = new System.Diagnostics.ProcessStartInfo();  
pi.CreateNoWindow = false;  
pi.WorkingDirectory = cutycaptLocation;  
pi.FileName = cutycaptLocation + "\\CutyCapt.exe";  
pi.Arguments = "--url=" + link + " --out-format=pdf -out=" + System.IO.Path.GetFullPath(Server.MapPath("~/CutyCapt")) + "\\" + filename;  
pi.UseShellExecute = false;
  1. 进程执行:ASP中的进程对象.Net用于执行进程,以获取创建的信息。
try {  
    // Start the process with the info we specified.   
    // Call WaitForExit and then the using statement will close.   
    using(System.Diagnostics.Process exeProcess = System.Diagnostics.Process.Start(pi)) {  
        exeProcess.WaitForExit();  
    }  
}   
catch (Exception ex)   
{  
    Response.Write(ex.Message);  
}
  1. 重定向到PDF:创建PDF后,浏览器会重定向到加载创建的PDF的PDF链接。
Response.Redirect(url); 

何下载网页图片

用过天猫,图虫的人都知道,网页中的图片是无法下载的。即使你打开网页,进入图片,长按是没法显示“保存图片”一类的提示。

图虫网页也一样,长按图片没有任何显示

为什么会出现这种情况,我搜索相关资料得知,原来是网站为了防止盗图或者保护版权就在网页中嵌入了一个名为“ javascript”的脚本。这种脚本能禁止读者在平板电脑、pc、手机端预览图片的时候禁止保存,无法下载到本地。

怎么解决这个问题?搜索了很多资料,像审核元素、qq截图、 DownloadbyNetAnts、 WebCatcher。基本都是pc端用的,有的软件这是针对电脑开发。现在这个时代,手机能用的就不需要电脑,对于普通用户来说根本没有用,或者说不好用难以上手。

方法还是有的,电脑上都是使用360浏览器和谷歌chrome浏览器可以解决网页不能下载图片的问题。但是360和chrome占用内存太大,不推荐使用。这里推荐比较实在的浏览器…………qq浏览器国际版,手机乐园和酷安都有。

依次下载qq浏览器play版和uc浏览器,之所以推荐这两个浏览器是因为uc最好用、最顺手。qq浏览器国际版运行速度快,网速最快。两者配合基本上用不着其他第三方浏览器了。

安装完毕后,先打开uc浏览器,这里先以阿里巴巴旗下的天猫为主。因为天猫的有图评论就没法保存图片,先去天猫找到你要下载的图片地址,按住地址栏把图片地址复制下来。

需要注意的是,先把uc浏览器的ua改成chrome或者电脑模式,刷新后,再进入天猫复制那张要保存的图片地址。

进入qq浏览器同样先把ua改成电脑版,我说的是电脑模式而不是iPad。因为iPad模式和电脑模式的排版不一样,有的功能用不上,所以用电脑模式保险。

在qq浏览器国际版的地址栏,把刚才复制下来的图片地址粘贴上去刷新网页。找到你要下载的图片,点击展示原图,长按图片有没有看到出现了“查看图片”和“保存图片”两个选项。

图虫网页能正常显示也能下载图片了

接下来,去快图浏览或者系统自带图库找到“图片收藏”的文件,这个就是qq浏览器国际版保存在本地图片的目录。

此方法亲自测试有用。看图: