PDFRender - JavaScript渲染pdf
关于一个pdf渲染的业务需求
关于pdf.js的使用
目前找到的好多pdfjs的使用方法都是一些模块开发类
关于原生js的使用方法很少
所以抽空写了一个pdf渲染的方法
依赖于《pdf.js》《pdf.worker.js》
首先页面引用下《pdf.js》《pdf.worker.js》
/**
* Author: HuangChaoHui
* Date: 2023-03-14
* PDFRender
* 渲染pdf至页面(无其他额外操作)
* @param { Object } config - 文件地址和需要渲染到的DomId
* {
* file: "./file.pdf", // pdf文件的路径
* PDFView: "PDFView", // pdf渲染到的domId
* scale: 1.5, // 缩放倍数 默认为1
* }
*/
class PDFRender {
constructor(config) {
this.file = config.file;
this.scale = config.scale || 1;
this.PDFViewId = config.PDFViewId;
this.PDFView = document.getElementById(config.PDFViewId);
this._init()
}
_init() {
// 判断是否存在pdf.js 如果不存在提醒用户引入
if (typeof pdfjsLib === "undefined") {
console.log("%c项目依赖于 《pdf.js》 《pdf.worker.js》", "color:orange;")
console.log("%c在您的项目中似乎没有找到这个 请引入后再试一次", "color:orange;")
return
}
let _self = this
// 解析pdf
this.PDFContent = pdfjsLib.getDocument(this.file);
// 获取到解析pdf后的值
this.PDFContent.promise.then(function (pdf) {
_self._render(pdf)
_self._addClass()
});
}
_render(pdf) {
// 获取PDF的页数
let pageNum = pdf.numPages;
// 设置展示比例
let scale = this.scale;
for (let i = 0; i < pageNum; i++) {
let nowNum = i + 1
let el = document.createElement("canvas");
let canvasId = "NovchCanvas" + nowNum
el.id = canvasId
this.PDFView.appendChild(el)
pdf.getPage(nowNum).then(function (page) {
// 设置pdf渲染的倍数
let viewport = page.getViewport({ scale });
// 获取需要渲染的元素
let canvas = document.getElementById(canvasId);
let context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
let renderContext = {
canvasContext: context,
viewport: viewport
};
page.render(renderContext);
});
}
}
_addClass() {
let style = document.createElement("style")
let styleStr = `
#${this.PDFViewId} {
width: 100%;
display: flex;
flex-wrap: wrap;
justify-content: center;
}
`
style.innerHTML = styleStr
document.getElementsByTagName("head")[0].appendChild(style)
}
}
具体的内容看附件吧
PDF渲染.zip