Html转PDF(使用html2canvas )跨域图片PDF文件上无法显示问题记录

Html转PDF(使用html2canvas )跨域图片PDF文件上无法显示问题记录

代码实现

引用Js文件

<script type="text/javascript" src="/js/jquery-1.8.3.js"></script>
<script src="https://cdn.jsdelivr.net/bluebird/latest/bluebird.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.0.272/jspdf.debug.js"></script>

js 实现部分代码

<script type="text/javascript">
    var dId = getQueryVariable("dId");
    //声明img
    var img = new Image()
    img.crossOrigin = "Anonymous";//解决跨域图片问题
    img.src = "图片服务器地址/fileName.jpg";
    //加载图片成功
    img.onload = function () {
        var canvas = document.createElement("canvas");
        var ctx = canvas.getContext("2d");

        var width = img.width;
        var height = img.height;

        canvas.width = width;
        canvas.height = height;
        //绘制到canvas上
        ctx.drawImage(img, 0, 0, width, height);
        document.getElementById("imagebox").appendChild(canvas);
    }
    
    function jsPdfDownload(){
        let dName = decodeURI(getQueryVariable("dName"));
        let pdfName = dName +"居民满意度调查通知";
        let id ="pdf-wrapper";
        var target = document.getElementById(id);
        target.style.background = "#FFFFFF";
        if(pdfName==''||pdfName==undefined) pdfName= getNowFormatDate();

        html2canvas(target, {
            useCORS: true, // 【重要】开启跨域配置
            allowTaint: true,//允许跨域图片
            taintTest: false,//是否在渲染前测试图片
            // height: target.offsetHeight, // 下面解决当页面滚动之后生成图片出现白边问题
            // width: target.offsetWidth,
            // windowWidth: document.body.scrollWidth,
            // windowHeight: document.body.scrollHeight,
            x: 0,
            y: 0,
            dpi: window.devicePixelRatio * 2, // 解决图片不清晰问题
            //scale: 2,
            onrendered:function(canvas) {
                var contentWidth = canvas.width;
                var contentHeight = canvas.height;

                //一页pdf显示html页面生成的canvas高度;
                var pageHeight = contentWidth / 592.28 * 841.89;
                //未生成pdf的html页面高度
                var leftHeight = contentHeight;
                //页面偏移
                var position = 0;
                //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
                // var imgWidth = 515.28;//595.28//左右边距40
                // var imgHeight = 512.28/contentWidth * contentHeight;//左右边距40
                var imgWidth = 595.28;
                var imgHeight = 595.28/contentWidth * contentHeight;

                var pageData = canvas.toDataURL('image/jpeg', 1.0);

                var pdf = new jsPDF('', 'pt', 'a4');

                //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
                //当内容未超过pdf一页显示的范围,无需分页
                if (leftHeight < pageHeight) {
                    pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight );//左右边距0
                } else {
                    while(leftHeight > 0) {
                        pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)//左右边距0
                        leftHeight -= pageHeight;
                        position -= 841.89;
                        //避免添加空白页
                        if(leftHeight > 0) {
                            pdf.addPage();
                        }
                    }
                }
                pdf.save(pdfName+".pdf");
            }
        })
    }
</script >

Html页面主要代码

<body>
<div style="text-align:center ">
    <button class="btn" onclick="jsPdfDownload()">下载pdf</button>
</div>
<div class="textcontent" id="pdf-wrapper" >
    <div class="toptitle" id="dName">小区名称</div>
    <div class="toptitle">关于居民满意度调查使用方法</div>

    <div class="content">

    <div class="lefttoptitle">居民朋友:</div>
    <p class="middlecontent"> 您好,为了解小区服务站向广大居民提供的服务情况,请各位居民扫描下方二维码,<br>对小区的服务进行评分(每人仅限评分一次),谢谢配合。</p>
    
    <!--小区二维码-->
    <div class="imagebox" id="imagebox">

    </div>
    
    <div class="lefttoptitle">具体流程如下:</div>
    <div class="leftbottomtitle">1、扫描二维码</div>
    <div class="righttext"> 通过微信扫描上方“居民满意度调查问卷二维码”。</div>
    <div class="leftbottomtitle">2、关注公众号</div>
    <div class="righttext"> 扫码后关注“XXXXXXX”公众号。</div>
    <div class="leftbottomtitle">3、开始答题</div>
    <div class="righttext"> 关注后,进入答题页面,开始答题。</div>
    <div class="leftbottomtitle">4、提交问卷</div>
    <div class="righttext"> 根据问卷内容进行填写,填写完毕后提交结果,完成答题。</div>

    </div>

    <ul>
        <li>XXXXX</li>
        <li id ="currentDate">2020111</li>
    </ul>
    <div class="box"></div>
</div>
</body>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值