将PDF流使用 canvas 绘制然后转为图片展示在页面上(二)

将PDF流转为图片展示在页面上

使用 pdfjs-dist 库来渲染 PDF 页面到 canvas 上,然后将 canvas 转为图片

安装 pdfjs-dist 依赖

bash 复制代码
npm install pdfjs-dist
或者
yarn add pdfjs-dist

创建一个组件来处理 PDF 流的加载和渲染

该组件中是一个包含 PDF 文件的 ArrayBuffer 或者 Uint8Array。

将 pdf 流传入该组件中使用

javascript 复制代码
/** @format */

import React, { useState, useEffect } from 'react';
// import { pdfjs } from 'pdfjs-dist';
var pdfjs = require('pdfjs-dist/es5/build/pdf.js');
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.min.js`;

const PdfToImage = ({ pdfData }) => {
    const [imageSrc, setImageSrc] = useState(null);

    const base64ToArrayBuffer = (base64) => {
        var binary_string = window.atob(base64);
        var len = binary_string.length;
        var bytes = new Uint8Array(len);
        for (var i = 0; i < len; i++) {
            bytes[i] = binary_string.charCodeAt(i);
        }
        return bytes.buffer;
    };

    useEffect(() => {
        const renderPDF = async (arrayBuffer) => {
            const loadingTask = pdfjs.getDocument({ data: arrayBuffer });

            try {
                const pdf = await loadingTask.promise;
                const page = await pdf.getPage(1); // 获取第一页
                const viewport = page.getViewport({ scale: 1.5 }); // 设置缩放比例
                const canvas = document.createElement('canvas');
                const canvasContext = canvas.getContext('2d');
                canvas.height = viewport.height;
                canvas.width = viewport.width;

                const renderContext = {
                    canvasContext,
                    viewport,
                };
                await page.render(renderContext).promise;

                // 将canvas内容转换为图片
                const imageSrc = canvas.toDataURL('image/png');
                setImageSrc(imageSrc);
            } catch (error) {
                console.error('Error rendering PDF:', error);
            }
        };

		// 首先将base64的PDF流转为ArrayBuffer
        let arrayBuffer = base64ToArrayBuffer(pdfData);
		// 然后将ArrayBuffer格式的数据转为图片
        renderPDF(arrayBuffer);
    }, [pdfData]);

    return <div>{imageSrc && <img src={imageSrc} alt="PDF as image" />}</div>;
};

export default PdfToImage;

使用示例

这里的PDF_content 也可以直接使用 ArrayBuffer 或者 Uint8Array 的格式,直接传入组件,将组件中的 base64ToArrayBuffer 方法不使用即可。

javascript 复制代码
import React from 'react';
import PdfToImage from './PdfToImage.jsx';
 render() {
 const PDF_content = 'XXXX....BYFhEdCmVuZHN0cmVhbQplbmRvYmoKc3RhcnR4cmVmCjg2NTkxCiUlRU9GCg=='// base64 格式
  return (
  	<PdfToImage  pdfData={PDF_content}></PdfToImage>
  )
 }
相关推荐
NoneCoder33 分钟前
CSS系列(14)--后处理器详解
前端·css
半桶水专家34 分钟前
js 中的console使用详解
开发语言·javascript·ecmascript
靠谱杨36 分钟前
【Linux服务器nginx前端部署详解】ubantu22.04,前端Vue项目dist打包
linux·服务器·前端·vue.js·经验分享·阿里云·腾讯云
猫猫村晨总37 分钟前
前端样式练手:阴阳图+时钟的组合
前端·css·css3
远洋录37 分钟前
前端单元测试实战:从零开始构建可靠的测试体系
前端·人工智能·react
李明一.2 小时前
探索 Echarts 绘图:数据可视化的奇妙之旅
前端·信息可视化·echarts
violet_evergarden.2 小时前
HTML+CSS+Vue3的静态网页,免费开源,可当作作业使用
前端·css·vue.js·开源·html
下雪了 ~3 小时前
HTTP和HTTPS的区别有哪些?
服务器·前端·笔记·网络协议·计算机网络
跟我很快乐3 小时前
JavaScript ES6+ 语法速通
javascript·es6
修谦得益3 小时前
JavaScript是按顺序执行的吗?聊聊JavaScript中的变量提升
javascript·js变量提升·词法环境