H5+pdfJS的实现


H5页面上传PDF文档时候可以使用pdfJS插件,这里以笔记形式记录H5引入pdfJS的步骤。

一、下载pdfJS插件;

官网网址:http://mozilla.github.io/pdf.js/getting_started/#download

下载解压后的结构:

其中build中pdf.jspdf.worker.js文件。

二、html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/common/jquery-2.0.3.js"></script>
    <script src="build/pdf.js"></script>
</head>
<body>
<h1>PDF.js Previous/Next example</h1>
<div>
    <input id="upload" type="file" accept="application/pdf"  /> <br>
    <button id="save" οnclick="savePdf()">Save</button>
</div>
<div>
    <button id="prev" οnclick="goPrevious()">Previous</button>
    <button id="next" οnclick="goNext()">Next</button>
    <span>Page: <span id="page_num"></span> / <span id="page_count"></span></span>
</div>
<canvas id="the-canvas"></canvas>
</body>
<script src="js/pdfjs.js"></script>
</html>


三、js文件:



//引入pdf.js之后
var url = 'web/09.pdf';
//加载核心文件
PDFJS.workerSrc = 'build/pdf.worker.js';
//
// Disable workers to avoid yet another cross-origin issue (workers need the URL of
// the script to be loaded, and currently do not allow cross-origin scripts)
//

if(window.File && window.FileList && window.FileReader && window.Blob) {
    document.getElementById('upload').addEventListener('change', selectedFile, false);
} else {
    document.write('您的浏览器不支持File Api');
}

PDFJS.disableWorker = true;

var pdfDoc = null,
    pageNum = 1,
    scale = 1,
    canvas = document.getElementById('the-canvas'),
    ctx = canvas.getContext('2d');

//
// Get page info from document, resize canvas accordingly, and render page
//
function renderPage(num) {
    // Using promise to fetch the page
    pdfDoc.getPage(num).then(function(page) {
        var viewport = page.getViewport(scale);
        canvas.height = viewport.height;
        canvas.width = viewport.width;

        // Render PDF page into canvas context
        var renderContext = {
            canvasContext: ctx,
            viewport: viewport
        };
        page.render(renderContext);
    });

    // Update page counters
    document.getElementById('page_num').textContent = pageNum;
    document.getElementById('page_count').textContent = pdfDoc.numPages;
}

//
// Go to previous page
//
function goPrevious() {
    if (pageNum <= 1)
        return;
    pageNum--;
    renderPage(pageNum);
}

//
// Go to next page
//
function goNext() {
    if (pageNum >= pdfDoc.numPages)
        return;
    pageNum++;
    renderPage(pageNum);
}

//
// Asynchronously download PDF as an ArrayBuffer
//
PDFJS.getDocument(url).then(function getPdfHelloWorld(_pdfDoc) {
    pdfDoc = _pdfDoc;
    renderPage(pageNum);
});


//文件选择
function selectedFile(event) {
    //将本地pdf变成数据流
    event = event || window.event;
    var oFile = event.target.files[0];
    if (window.FileReader) {
        var reader = new FileReader();
        reader.readAsDataURL(oFile);
        //监听文件读取结束后事件
        reader.onloadend = function (e) { 
            url = e.target.result;
        }; 
    }

}


function savePdf(){
    PDFJS.getDocument(url).then(function getPdfHelloWorld(_pdfDoc) {
        pdfDoc = _pdfDoc;
        renderPage(pageNum);
    });
}

四、运行结果:

但是运行结果中pdf需要上下翻页,达不到加载全部,页面滚动条浏览的效果,进行如下修改

一、html页面:

<!DOCTYPE html>

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/common/jquery-2.0.3.js"></script>
    <script src="build/pdf.js"></script>
    <style>
        .pdfClass{
            border:1px solid black;
        }
    </style>
</head>
<body>
<h1>全部显示</h1> 
<div>
    <input id="upload" type="file" accept="application/pdf" οnchange="selectedFile(event)"  /> <br>
    <button id="save" οnclick="savePdf()">Save</button>
</div>
<div class="wrapper" id="pdf-container"></div>

</body>

<script src="js/pdfJS-2.js"></script>
</html>
二、JS页面
var url = 'web/09.pdf';

//文件选择
function selectedFile(event) {
    //将本地pdf变成数据流
    event = event || window.event;
    var oFile = event.target.files[0];
    if (window.FileReader) {
        var reader = new FileReader();
        reader.readAsDataURL(oFile);
        //监听文件读取结束后事件
        reader.onloadend = function (e) {
            // $(".img").attr("src",e.target.result);    //e.target.result就是最后的路径地址 
            url = e.target.result;
        };
    }

}



function createPdfContainer(id,className) {
    var pdfContainer = document.getElementById('pdf-container');
    var canvasNew =document.createElement('canvas');
    canvasNew.id = id;
    canvasNew.className = className;
    var br =document.createElement('br');  //添加上br元素,防止页面变大时候pdf并排显示
    pdfContainer.appendChild(br);
    pdfContainer.appendChild(canvasNew);
};

//渲染pdf
//建议给定pdf宽度
function renderPDF(pdf,i,id) {
    pdf.getPage(i).then(function(page) {

        var scale = 0.5;   //pdf大的放大倍数
        var viewport = page.getViewport(scale);

        //
        //  准备用于渲染的 canvas 元素
        //

        var canvas = document.getElementById(id);
        var context = canvas.getContext('2d');
        canvas.height = viewport.height;
        canvas.width = viewport.width;

        //
        // 将 PDF 页面渲染到 canvas 上下文中
        //
        var renderContext = {
            canvasContext: context,
            viewport: viewport
        };
        page.render(renderContext);
    });
};
//创建和pdf页数等同的canvas数
function createSeriesCanvas(num,template) {
    var id = '';
    for(var j = 1; j <= num; j++){
        id = template + j;
        createPdfContainer(id,'pdfClass');
    }
}
//读取pdf文件,并加载到页面中
function loadPDF(fileURL) {
    //清除所有元素 
    var pdfContainer = document.getElementById('pdf-container');
    var childs = pdfContainer.childNodes;
    for(var i = childs.length - 1; i >= 0; i--) {
        pdfContainer.removeChild(childs[i]);
    }
    // pdfContainer.clear;
    PDFJS.getDocument(fileURL).then(function(pdf) {
        //用 promise 获取页面
        var id = '';
        var idTemplate = 'cw-pdf-';
        var pageNum = pdf.numPages;
        console.log("页码:"+pageNum)
        //根据页码创建画布
        createSeriesCanvas(pageNum,idTemplate);
        //将pdf渲染到画布上去
        for (var i = 1; i <= pageNum; i++) {
            id = idTemplate + i;
            renderPDF(pdf,i,id);
        }

    });
}

function savePdf(){ 
    loadPDF(url);
}

function fsubmit() {
    var form=document.getElementById("form1");
    var fd =new FormData(form); 
    $.ajax({
        url: "server.php",
        type: "POST",
        data: fd,
        processData: false,  // 告诉jQuery不要去处理发送的数据
        contentType: false,   // 告诉jQuery不要去设置Content-Type请求头
        success: function(response,status,xhr){
            console.log(xhr);
            var json=$.parseJSON(response);
            var result = '';
            result +="个人信息:<br/>name:"+json['name']+"<br/>gender:"+json['gender']+"<br/>number:"+json['number'];
            result += '<br/>头像:<img src="' + json['photo'] + '" height="100" style="border-radius: 50%;" />';
            $('#result').html(result);
        }
    });
    return false;
}

三、运行结果:





  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值