原理

使用pdf.js预览图片,pdf.js将pdf通过canvas将每一页渲染出来,然后我们通过canvas的toDataURL方法保存为jpg或png格式。

pdf.js是Mozilla开源的一个js库,无需任何本地支持就可以在浏览器上显示pdf文档。唯一的要求就是浏览器必须支持HTML5。

依赖

需要pdf.min.js和pdf.worker.min.js两个js文件

全部代码实现

pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.bootcss.com/pdf.js/2.2.228/pdf.worker.min.js';

const preview = document.getElementById('preview');

const page_num = document.getElementById('page_num');

const out_type = document.getElementById('out_type');

let pdfFile, pdf, pageNum, context = preview.getContext('2d');

out_type.querySelectorAll('.button').forEach(function (btn) {

btn.onclick = function () {

out_type.querySelector('.primary').classList.remove('primary');

btn.classList.add('primary');

}

});

// 加载PDF文件

function loadPDF(file) {

pdfFile = file;

file_name.innerHTML = file.name;

let reader = new FileReader();

reader.onload = (e) => showPDF(e.target.result);

reader.readAsDataURL(file);

}

// 预览PDF

function showPDF(url) {

let loadingTask = pdfjsLib.getDocument(url);

loadingTask.promise.then(function (doc) {

pdf = doc;

pageNum = 1;

preview.hidden = false;

readerPage()

}, function (reason) {

alert(reason)

});

}

// 预览上一页

function prevPage() {

if (pageNum <= 1) {

return;

}

pageNum--;

readerPage()

}

//预览下一页

function nextPage() {

if (pageNum >= pdf.numPages) {

return;

}

pageNum++;

readerPage()

}

//渲染页面

function readerPage(callback) {

pdf.getPage(pageNum).then(function (page) {

let scale = 1.5;

let viewport = page.getViewport({scale: scale});

preview.height = viewport.height;

preview.width = viewport.width;

let renderContext = {

canvasContext: context,

viewport: viewport

};

page.render(renderContext).promise.then(callback);

});

page_num.innerText = `页码 : ${pageNum} / ${pdf.numPages}`;

}

// 保存当前页

function save() {

let a = document.createElement('a');

let event = new MouseEvent('click');

let type = out_type.querySelector('.primary').innerText.toLowerCase();

a.download = pdfFile.name + '-' + pageNum + '.' + type;

a.href = preview.toDataURL(type === 'png' ? 'image/png' : 'image/jpeg');

a.dispatchEvent(event)

}

//保存全部页面

function saveAll() {

pageNum = 1;

savePage()

}

function savePage() {

if (pageNum > pdf.numPages) {

alert('全部保存成功');

return

}

readerPage(function () {

save();

pageNum++;

savePage();

});

}

预览:

pdfjs转图片_PDF转图片,PDF转JPG/PNG,完全由JS实现-阿里云开发者社区相关推荐

  1. swift 将图片保存到本地_swift 图片存储到本地文件的搜索结果-阿里云开发者社区...

    iOS - UIImageView 前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIImageView : UIView @available(iOS 2.0, ...

  2. oss子账号_【最佳实践】授权子账号进行OSS图片样式设置-阿里云开发者社区

    1.引子:如何授权子账号在控制台针对指定的Bucket设置图片样式呢? [使用场景]:某企业内部有众多Bucket,并且不同的Bucket分别指定了Bucket的管理员.目前Bucket A的管理员期 ...

  3. python将excel转换成图片_python-尝试将Excel文件保存为图片并加上水印-阿里云开发者社区...

    python-尝试将Excel文件保存为图片并加上水印 场景:并不是将 excel 的 chart 生成图片,而是将整个表格内容生成图片. 1. 准备工作 目前搜索不到已有的方法,只能自己尝试写一个, ...

  4. c#如何wmf图片转换成png图片_【C#】使用fo-dicom完成BMP,JPG,PNG图片转换为DICOM文件-阿里云开发者社区...

    最近研究了一下DICOM和BMP文件转换的问题,也是很头大.度娘了很久,也在CSDN等论坛看到一些断断续续的文件,最主要的是代码只是片断,不是完整的实现.头大了. 首先,了解一下BMP文件格式,BMP ...

  5. android 照片拼接长图_Android拼接合并图片生成长图-阿里云开发者社区

    Android拼接合并图片生成长图 代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放. 假设根目录的Pict ...

  6. html读取oss_oss获取图片链接的搜索结果-阿里云开发者社区

    OSS 图片处理 作者:张医博 背景 针对 OSS case 的基础排查,以及如果查看图片基础原始参数进行故障定位 必要信息 处理图片的需求请描述清楚 图片处理的原图链接 图片处理后的链接 查看图片原 ...

  7. qgraphicsview鼠标移动图片_交互式QGraphicsView(平移/缩放/旋转)-阿里云开发者社区...

    简述 Graphics View提供了一个平台用于大量自定义 2D 图元的管理与交互框架包括一个事件传播架构支持场景 Scene 中的图元 Item 进行精确的双精度交互功能.Item 可以处理键盘事 ...

  8. itext设置pdf的尺寸_如何获取pdf文档iText 7的页面大小-问答-阿里云开发者社区-阿里云...

    我在iText 7中有一个Java程序,可以接收JSON数据并生成一个PDF文档(带有页眉和页脚),该文档可以很好地处理clientData注释中的变量中的数据,但是当在无注释clientData中使 ...

  9. java xsl转换pdf_Java 生成PDF文档-阿里云开发者社区

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持 iText,生成PDF文档,还支持将XM ...

  10. .net pdf转图片_PDF转图片要怎么转?两分钟解决!

    PDF转图片要怎么转?在我们的实际工作当中,很多时候会碰到这样的问题:如何把我的PDF文档转换成图片进行分享呢? 有些小伙伴会用截图的方式把PDF文件存为图片,但是这样图片的质量不高,在手机里很难看清 ...

最新文章

  1. 2019年末,10 位院士对 AI 的深度把脉(上)
  2. 德国再出颠覆性发明,这次要安排我们的快递
  3. 关于Qomo于ajax的异同~
  4. 力扣——按递增顺序显示卡牌
  5. 解决 vue 项目一直出现 sockjs-node/info?t=1554978**** ,并造成浏览器不能及时更新编码改动结果
  6. HDU - 6383 百度之星2018初赛B 1004 p1m2(二分答案)
  7. 延迟任务调度系统—技术选型与设计(上篇)
  8. 【转】XCode环境变量及路径设置 -- 待学习
  9. python datetime 加一个月_Python日期的加减等操作的示例
  10. Python path
  11. ios property 之 strong weak unsafe_unretained
  12. 第一章第一节第一课时智能训练(2012-01-18 18:42:23)
  13. 谷歌浏览器---日常使用设置
  14. Pareto相关理论
  15. QQ批量挂机(python实现)
  16. 为什么“码农”需要自我营销?
  17. 如何拥有一个免费云服务器
  18. oracle dul误删数据,案例:Oracle dul数据挖掘 没有数据库备份非常规恢复truncate删除的数据表...
  19. linux nvcc未找到命令,打印本页 - nvcc命令无法识别
  20. 【Minio】实现视频断点续传功能

热门文章

  1. 论win10专业版,企业版和教育版之间自由切换的方法和密钥
  2. python正则匹配数字_python——正则匹配数字
  3. mysql as用法_数据库 as 用法
  4. 计算机科学与技术保研好不好,2021年北京邮电大学计算机科学与技术专业保研成功上岸经验指导...
  5. Fisher discrimination criterion (费舍尔判别准则)
  6. c语言三个学生每人四门,C语言一道题目,求教教3.统计一个班的学生成绩。要求程序具有如下功能:(1) 每个学生的学号和四门功课的成绩从键盘读入。...
  7. 人资(人事)送命连环问,51个问题。
  8. 【leetcode】995. Minimum Number of K Consecutive Bit Flips
  9. 吾欲使汝为恶,则恶不可为;使汝为善,则我不为恶。
  10. 线性代数01:函数对向量、矩阵的梯度(向量、矩阵求导)