pdf文件渲染到canvas

news2024/9/28 17:27:57

1、jQuery
2、Fabric.js
Fabric.js是一个对canvas进行封装的Javascript库,主要的功能包括在canvas上创建和填充图形,比如矩形、圆形、多边形;生成的图像自带缩放、旋转、拖拽等功能。
3、PDF.js
PDF.js 是一个使用 HTML5 构建的便携式文档格式查看器。
在这里插入图片描述

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="js/jquery-3.4.1.js"></script>
		<script type="text/javascript" src="js/fabric.min.js"></script>
		
		<script type="text/javascript" src="js/pdf.min.js"></script>
		<script type="text/javascript" src="js/pdf.worker.min.js"></script>
	</head>
	<body>
		 <div>
			<input id="fileInput" type="file" accept="application/pdf,image/jpeg,image/png"/>
		  </div>
		  <canvas id="canvas" width="500" height="620" style="border: 1px solid #000;">
		</canvas>
	</body>
	<script type="text/javascript">
		var currentSrc; // 图片src
		canvas = new fabric.Canvas('canvas', {
		    backgroundColor: '#fff'
		})
		
		$('#fileInput').change(function(event) {
		    var file = event.target.files[0]; // 获取文件对象
		    if(file&&file.type=='image/jpeg' || file.type=='image/png'){
		        console.log('图',file)
		        var reader = new FileReader();
		        reader.onload = function(e) {
		            // 处理读取结果
		            currentSrc = e.target.result;
		            createImg(100,100)
		            console.log('currentSrc',currentSrc);
		        };
		        reader.readAsDataURL(file); // 正确使用文件对象调用方法
		    }else if(file.type=='application/pdf'){
		        console.log('file',file,)
		        new Promise((resolve, reject) => {
		            let reader = new FileReader()
		            reader.onloadend = function(e) { //读取完成触发,无论失败还是成功
		                resolve(e.target.result) //base64格式
		            }
		            reader.readAsDataURL(event.target.files[0])
		        }).then(resolve => {
					// 读取多张
					pdfToImage(resolve)
		        })
		    }
		});
		// 多张
		async function pdfToImage(pdfUrl) {
		    (await importPdfToFabric(pdfUrl)).map(async c => {
		        // console.log('c------',c);
		        const fabricImage = new fabric.Image(await c, {
		            top:50,
		            left:30,
		            scaleX: 0.45,
		            scaleY: 0.45
		        });
		        
		        // canvas.clear();	
		        canvas.add(fabricImage);
		        console.log('文件存储',canvas.toJSON())
		        // console.log('cccc',JSON.stringify(canvas))
		    })
		};
		async function importPdfToFabric(pdfUrl) {
		    var loadingTask = pdfjsLib.getDocument(pdfUrl);
		    return await loadingTask.promise.then(  async (pdf) => {
		        const numPages = pdf.numPages;
		        let nar = new Array(numPages).fill(0);
		        for(var ii=1;ii<=numPages;ii++){
		            nar[ii-1] = await pdfgetPage(ii,pdf)
		        }
		        return nar;
		    });
		}
		async function pdfgetPage(pageNumber,pdf) {
		    let rss;
		    await pdf.getPage(pageNumber).then((page) => {
		        // console.log('page',page,pageNumber);
		        const viewport = page.getViewport({ scale: window.devicePixelRatio });
		        const canvas1 = document.createElement('canvas');
		        const context = canvas1.getContext('2d');
		        canvas1.height = viewport.height; // 1330
		        canvas1.width = viewport.width; // 930
		        const renderContext = {
		            canvasContext: context,
		            viewport: viewport
		        };
		        const renderTask = page.render(renderContext);
		        rss = renderTask.promise.then(() => canvas1);
		
		    });
		    return rss;
		};

		// 绘制图片
		function createImg(top, left) {
		    var img = document.createElement("img");
		    img.onload = function () {
		        var canvasImage = new fabric.Image(img,  {
		            top : top,
		            left : left,
		            angle: 0,
		            opacity: 1,
		            scaleX: 0.1,
					scaleY: 0.1
		        })
		        canvas.add(canvasImage)
		        // console.log('canvas toJSON', canvas.toJSON(),canvasImage)
		    }
		    img.crossOrigin = 'Anonymous'; 
		    img.src = currentSrc;
		
		};
	</script>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2088953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压

STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压&#xff1a;PC0、PA1和PA2。本测试将ADC1_IN6映射到PC0引脚&#xff0c;ADC12_IN2映射到PA1引脚&#xff0c;ADC1_IN3映射到PA2引脚。 1、ADC输入 ADC输入电压范围&#xff1a;Vref– ≤ VIN ≤ Vref ADC支持“单端输入…

雀巢玩了个梗,把打工人快得罪光了……

给打工人做了一款零食&#xff0c;并想着抖个机灵顺便讨好下打工人&#xff0c;但万万没想到&#xff0c;这零食刚到打工人手里还没等下嘴&#xff0c;就把打工人给得罪了…… 这是让浓眉大眼的雀巢最近无比糟心的一件事&#xff01; 事情大概是这样的&#xff0c;雀巢可能是为…

图论----最小生成树讲解与相关题解

目前已更新系列 当前--图论----最小生成树讲解与相关题解 滑动窗口系列算法总结与题解一 算法系列----并查集总结于相关题解 图论---dfs系列 差分与前缀和总结与对应题解&#xff08;之前笔试真的很爱考&#xff09; 数论---质数判断、质因子分解、质数筛&#xff08;埃氏…

信息学奥赛初赛天天练-79-NOIP2015普及组-基础题4-即时通讯软件、二叉树遍历、前序遍历、中序遍历、后序遍历、算法时间复杂度

NOIP 2015 普及组 基础题4 11 下面哪种软件不属于即时通信软件( ) A QQ B MSN C 微信 D P2P 16 前序遍历序列与中序遍历序列相同的二叉树为( ) A 根结点无左子树 B 根结点无右子树 C 只有根结点的二叉树或非叶子结点只有左子树的二叉树 D 只有根结点的二叉树或非叶子结点只有…

如何使用IDEA远程访问家里或者公司中无公网IP的内网MySQL数据库

文章目录 前言1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql5. 固定连接公网地址6. 固定地址连接测试 前言 本教程主要介绍如何使用Cpolar内网穿透工具实现在IDEA中也可以远程访问家里或者公司的数据库&#xff0c;提高开发效率&#xff01;无…

在 Debian 上安装 IntelliJ IDEA 笔记(含 JDK 的安装)

在 Debian&#x1f4a9; 上安装 IntelliJ IDEA &#x1f4a1; 笔记&#xff08;含 JDK 的安装&#xff09; 下载安装 JDKJDK17JDK8 安装 IntelliJ IDEA Community添加桌面启动项&#xff08;快捷方式&#xff09; 参考资料 下载 两个包已经下好了&#xff0c;一个JDK17&#x…

OZON新品藏品,OZON收藏品推荐

OZON新品藏品&#xff0c;OZON收藏品推荐Top1 火车模型 Наши поезда №17 - Пассажирский электровоз ЧС2 商品id&#xff1a;1643982093 月销量&#xff1a;266 OZON新品藏品地&#xff1a;m6z.cn/5H6fQR&#xff08;浏览器复制打开&a…

<数据集>车牌识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2000张 标注数量(xml文件个数)&#xff1a;2000 标注数量(txt文件个数)&#xff1a;2000 标注类别数&#xff1a;1 标注类别名称&#xff1a;[License] 序号类别名称图片数框数1License20002965 使用标注工具&am…

嵌入式单片机开发学习路线,从入门到高薪就业,保姆级学习攻略!

嵌入式就业方向及具体细分岗位如下&#xff1a; 方向 岗位 单片机开发 单片机开发工程师&#xff08;MCU开发工程师&#xff09; RTOS开发工程师 Linux应用开发 Linux应用工程师 QT开发工程师 Linux多媒体开发工程师 Linux驱动开发 Linux/Android驱动开发工程师 Linux设…

【建议收藏】100个Python精选库

Python为啥这么火&#xff0c;这么多人学&#xff0c;就是因为简单好学&#xff0c;功能强大&#xff0c;整个社区非常活跃&#xff0c;资料很多。而且这语言涉及了方方面面&#xff0c;比如自动化测试&#xff0c;运维&#xff0c;爬虫&#xff0c;数据分析&#xff0c;机器学…

鸿蒙(API 12 Beta3版)【识别图像数据】

基本概念 图像数据识码能力支持对相机预览流数据中的码图进行扫描识别&#xff0c;并获取信息。 场景介绍 图像数据识码能力支持对相机预览流数据中的条形码、二维码、MULTIFUNCTIONAL CODE进行识别&#xff0c;并获得码类型、码值、码位置信息和相机变焦比。该能力可用于一…

马斯克被告“狗狗币传销”!索赔2580亿美元,法官驳回诉讼!马斯克与狗狗币的不解之缘!

在数字货币领域&#xff0c;每一次波动都牵动着全球投资者的神经&#xff0c;而埃隆马斯克&#xff08;Elon Musk&#xff09;——这位科技界的传奇人物&#xff0c;更是以其独特的言行不断在加密货币市场上掀起波澜。近期&#xff0c;关于马斯克与狗狗币&#xff08;Dogecoin&…

【C++STL详解(十三)】unordered系列容器的介绍与使用

目录 前言 一、unordered_map 介绍 使用 构造方式 修改 容量 迭代器 元素访问 查询 桶操作 二、unordered_set 介绍 使用 构造 修改 容量 迭代器&#xff08;只有单向) 查询 桶操作 三、unordered系列的性能测试 前言 前面提到的map/set是C98提供的关联…

使用手机挖掘IDOR漏洞赚取1500美元赏金

在今天的文章中&#xff0c;笔者将分享如何在手机上发现两个不安全的直接对象引用 (IDOR) 实例&#xff0c;并因此获得 1500 美元的赏金。 信息收集&#xff1a;了解目标 首先&#xff0c;我通常使用 Google dork&#xff08;谷歌语法&#xff1a;如“site:target.com about”…

斯坦福UE4 C++课学习补充24:伤害数值

创建并调用数值显示UI 显示数值用UMG实现。创建名为DamagePopup_Widget控件蓝图&#xff0c;添加一个数值文本框。设置如下&#xff0c;设置文本框为Is Variable 将场景投射到屏幕Project World Location to Widget Position节点&#xff1a;它的作用是在UE中将一个世界空间中…

智能新未来:2024世界机器人大会全景解析

8月21日至25日&#xff0c;2024世界机器人大会在北京北人亦创国际会展中心盛大举行。本次大会以“共育新质生产力 共享智能新未来”为主题&#xff0c;汇聚了全球近170家机器人企业&#xff0c;展示了超过600款创新产品&#xff0c;其中首发新品达60余款&#xff0c;人形机器人…

晚宴扫码查询座位号

在晚宴活动中&#xff0c;快速准确地查询座位号是提升参与者体验的关键。以下是通过扫码查询系统实现座位号查询的详细步骤。 步骤一&#xff1a;电脑端上传查询信息 1. 访问云分组官网。 2. 使用微信扫码登录系统。 3. 点击菜单“我的查询”。 步骤二&#xff1a;准备查询信…

文心快码帮你解大厂面试题:如何使用shell找到access log,如何找到访问量最多的url?

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; 【大厂面试真题】系列&#xff0c;带你攻克大厂面试真题&#xff0c;秒变offer收割机&#xff01; ❓今日问题&#xff1a;在8…

Java框架spring(二)

一、AOP面向切面编程 1、AOP的概念 AOP&#xff08;AspectOrientedProgramming&#xff09;&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过 预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 AOP是OOP的延续&#xff0c;是软件开发中的一个热点&…