pdf文件渲染到canvas

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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在React项目中加载PDF文件并显示在Canvas中,您需要使用以下步骤: 1. 安装pdfjs-dist库 使用npm或yarn安装pdfjs-dist库。 ``` npm install pdfjs-dist ``` 2. 加载PDF文件 使用pdfjs-dist库加载PDF文件。 ```javascript import pdfjsLib from 'pdfjs-dist'; pdfjsLib.getDocument(url).promise.then((pdf) => { // pdf对象包含了PDF文件的所有信息 }); ``` 3. 渲染PDF页面 使用pdfjs-dist库将PDF页面渲染Canvas中。 ```javascript pdf.getPage(pageNumber).then((page) => { const canvas = document.getElementById('canvas'); const context = canvas.getContext('2d'); const viewport = page.getViewport({ scale: 1 }); canvas.width = viewport.width; canvas.height = viewport.height; const renderContext = { canvasContext: context, viewport: viewport, }; page.render(renderContext); }); ``` 这个例子中,`pageNumber`是要渲染PDF页面的页码。`canvas`是渲染结果将要呈现的Canvas元素。`viewport`是PDF页面的大小和缩放比例。 4. 完整的React组件 ```javascript import React, { useEffect, useRef } from 'react'; import pdfjsLib from 'pdfjs-dist'; function PdfCanvas({ url, pageNumber }) { const canvasRef = useRef(null); useEffect(() => { const canvas = canvasRef.current; const context = canvas.getContext('2d'); pdfjsLib.getDocument(url).promise.then((pdf) => { pdf.getPage(pageNumber).then((page) => { const viewport = page.getViewport({ scale: 1 }); canvas.width = viewport.width; canvas.height = viewport.height; const renderContext = { canvasContext: context, viewport: viewport, }; page.render(renderContext); }); }); }, [url, pageNumber]); return ( <canvas ref={canvasRef} /> ); } export default PdfCanvas; ``` 这个组件将会渲染指定PDF文件的指定页面到一个Canvas元素中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值