当前位置: 首页 > news >正文

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

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

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

安装 pdfjs-dist 依赖

npm install pdfjs-dist
或者
yarn add pdfjs-dist

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

该组件中是一个包含 PDF 文件的 ArrayBuffer 或者 Uint8Array。
将 pdf 流传入该组件中使用

/** @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流转为ArrayBufferlet 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 方法不使用即可。

import React from 'react';
import PdfToImage from './PdfToImage.jsx';render() {const PDF_content = 'XXXX....BYFhEdCmVuZHN0cmVhbQplbmRvYmoKc3RhcnR4cmVmCjg2NTkxCiUlRU9GCg=='// base64 格式return (<PdfToImage  pdfData={PDF_content}></PdfToImage>)}

相关文章:

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

将PDF流转为图片展示在页面上 使用 pdfjs-dist 库来渲染 PDF 页面到 canvas 上&#xff0c;然后将 canvas 转为图片 安装 pdfjs-dist 依赖 npm install pdfjs-dist 或者 yarn add pdfjs-dist创建一个组件来处理 PDF 流的加载和渲染 该组件中是一个包含 PDF 文件的 ArrayBuffer…...

【深度学习】 零基础介绍卷积神经网络(CNN)

零基础介绍 卷积神经网络&#xff08;CNN&#xff0c;Convolutional Neural Network&#xff09;是深度学习中的一种神经网络&#xff0c;特别擅长处理图像和视频等有空间结构的数据。 假设我们在做一个“照片分类”的任务&#xff0c;比如判断一张照片中是猫还是狗。下面用一…...

Coze概述

### Coze概述 Coze&#xff08;中文名为扣子&#xff09;是由字节跳动开发的一个新一代AI应用开发平台&#xff0c;旨在让用户轻松创建各种AI驱动的应用和聊天机器人&#xff0c;无论用户的编程经验如何。以下是Coze的一些关键特性和功能&#xff1a; #### 关键特性 - **无代…...

康佳Android面试题及参考答案(多张原理图)

JVM 内存分布和分代回收机制是什么? JVM 内存主要分为以下几个区域。 堆(Heap)是 JVM 管理的最大的一块内存区域,主要用于存放对象实例。所有线程共享堆内存,在堆中又分为年轻代(Young Generation)和老年代(Old Generation)。年轻代又分为 Eden 区和两个 Survivor 区(…...

2022 年 3 月青少年软编等考 C 语言四级真题解析

目录 T1. 拦截导弹思路分析T2. 神奇的数列思路分析T3. 硬币思路分析T4. 公共子序列思路分析T1. 拦截导弹 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的…...

关于24年408真题的疑问

45.某计算机按字节编址&#xff0c;采用页式虚拟存储管理方式&#xff0c;虚拟地址和物理地址的长度均为32位&#xff0c;页表项的大小为4字节&#xff0c;页大小为4MB。虚拟地址结构如下&#xff1a; 这一道题如果不细想的话&#xff0c;其实是可以做对的&#xff0c;毕竟数字…...

【容器】k8s学习笔记基础部分(三万字超详细)

概念 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应用程序定义资源使…...

dayjs(2kb)和momentjs(70kb)关系详述及项目中如何选择讲解

关系 API&#xff1a;Day.js被设计为Moment.js的极简替代品&#xff0c;其API和用法与Moment.js几乎完全一致。这使得开发者在两者之间进行切换时&#xff0c;学习成本极低。 理念&#xff1a; Moment.js是一个大而全的时间日期库&#xff0c;提供了丰富的日期时间操作方法&am…...

【Python网络爬虫笔记】11- Xpath精准定位元素

目录 一、Xpath 在 Python 网络爬虫中的作用&#xff08;一&#xff09;精准定位元素&#xff08;二&#xff09;应对动态网页&#xff08;三&#xff09;数据结构化提取 二、Xpath 的常用方法&#xff08;一&#xff09;节点选取&#xff08;二&#xff09;谓词筛选&#xff0…...

6.python列表

Python 列表 (List) 深度总结 文章目录 Python 列表 (List) 深度总结1. 列表的基本概念2. 访问列表中的元素3. 修改列表4. 删除列表元素5. 列表的操作符6. 列表的内置函数7. 列表的方法8. 列表的高级用法8.1 列表推导式 (List Comprehensions)8.2 列表的浅拷贝与深拷贝8.3 列表…...

Android中bindService和startService启动服务有何区别

Android中bindService和startService启动服务有何区别 bindService 和 startService 是 Android 中两种用于与 Service 交互的方式&#xff0c;它们的区别主要在于 生命周期管理 和 使用场景。以下是详细对比&#xff1a; 1. bindService方式 bindService 是一种绑定方式&am…...

超牛免费 机械臂模型、工业机器人模型下载网站集合

‌机械臂是一种高精度、多输入多输出的复杂系统&#xff0c;能够模仿人手的动作&#xff0c;按照给定程序、轨迹和要求实现自动抓取、搬运等功能‌。它通常由执行机构、驱动装置、控制系统以及传感器等组成&#xff0c;能够完成各种复杂的动作。‌ 机械臂在工业、医学、娱乐、…...

引领未来的变革:15种前沿RAG技术及其应用探索

在现代人工智能领域&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术逐渐成为推动各种应用的重要力量。这些技术通过结合信息检索与文本生成&#xff0c;能够更有效地处理和利用信息。本文将详细介绍15种前沿RAG技术及其具体应用实例&#xff0c;以帮助您更好地理解这…...

Scala泛型应用场景

Scala中的泛型&#xff08;Generics&#xff09;是一种强大的工具&#xff0c;允许开发者编写可重用的代码&#xff0c;同时保持类型安全。泛型在Scala中有多种应用场景&#xff0c;以下是一些常见的应用场景&#xff1a; 集合类&#xff1a; Scala的集合类&#xff08;如List…...

AI监控赋能健身馆与游泳馆全方位守护,提升安全效率

一、AI视频监控技术的崛起 随着人工智能技术的不断发展&#xff0c;AI视频监控正成为各行业保障安全、提升效率的关键工具。相比传统监控系统&#xff0c;AI技术赋予监控系统实时分析、智能识别和精准预警的能力&#xff0c;让“被动监视”转变为“主动防控”。 二、AI监控应用…...

Avalonia实战实例二:添加三种状态的Svg图片按钮

文章目录 一、Avalonia和WPF中Style的不同1、Avalonia中舍弃了触发器2、Avalonia中Style不再使用x:Key命名区分二、使用Svg图片控件三、实现三种状态的按钮1、使用转换器2、伪类选择接着上一篇:使用Prism创建项目,并创建窗口 这一篇主要是添加: 两个Svg图片按钮,并包含三种…...

基于注意力的几何感知的深度学习对接模型 GAABind - 评测

GAABind 作者是苏州大学的生物基础与医学院, 期刊是 Briefings in Bioinformatics, 2024, 25(1), 1–14。GAABind 是一个基于注意力的几何感知蛋白-小分子结合模式与亲和力预测模型,可以捕捉小分子和蛋白的几何、拓扑结构特征以及相互作用。使用 PDBBind2020 和 CASF2016 作…...

arcGIS使用笔记(无人机tif合并、导出、去除黑边、重采样)

无人机航拍建图之后&#xff0c;通过大疆智图软件可以对所飞行的区域的进行拼图&#xff0c;但是如果需要对拼好的图再次合并&#xff0c;则需要利用到arcGIS软件。下面介绍arcGIS软件在这个过程中常用的操作。 1.导入tif文件并显示的方法&#xff1a;点击“”图标进行导入操作…...

Color-Light-Control-and-Four-Way-Responder based on STM32F103C8T6

Light Control and Responder 若要实现同样效果请看源码: gitee.com/apollo_666/Color-Light-Control-and-Four-Way-Responder # Abstract The design project for a decorative lighting controller enhanced our practical skills and engineering capabilities. During our…...

openGauss开源数据库实战二十八

文章目录 任务二十八 基于PowerDesigner的openGauss数据库设计任务目标实施步骤一、在Win11上安装 PowerDesigner16二、PowerDesigner快速入门1.启动和配置E-R概念建模2.创建数据项3.创建域4.创建实体5.创建两个实体之间的联系 三、PowerDesigner上的E-R建模1.只有单值属性的简…...

丧尸危机模拟:灾备系统的终极压力测试

对于软件测试从业者而言&#xff0c;压力测试早已是日常工作的一部分。我们习惯于用并发用户数、吞吐量、响应时间等冰冷指标&#xff0c;去描绘一个系统在极限负载下的“抗压能力”。然而&#xff0c;当我们将这些概念投射到一个更宏大、更富有冲击力的隐喻——丧尸危机之中时…...

用STC89C51+LM358做个心率计,从硬件选型到代码调试的完整避坑指南

从零打造高精度心率监测仪&#xff1a;STC89C51与LM358的硬核实战手册 指尖轻触红外传感器&#xff0c;LCD屏幕上的数字开始跳动——这不是医疗设备&#xff0c;而是你用面包板和51单片机搭建的心率监测装置。当开源硬件遇上生物信号采集&#xff0c;传统单片机依然能在可穿戴设…...

pg_activity快速入门:如何在5分钟内开始监控PostgreSQL服务器

pg_activity快速入门&#xff1a;如何在5分钟内开始监控PostgreSQL服务器 【免费下载链接】pg_activity pg_activity is a top like application for PostgreSQL server activity monitoring. 项目地址: https://gitcode.com/gh_mirrors/pg/pg_activity PostgreSQL数据库…...

Delphi经典8大天坑|第五篇:ShortString与String混用,导致字符串截断/乱码

一、现象描述项目中同时使用ShortString和string两种字符串类型&#xff0c;赋值时出现字符串被莫名截断&#xff08;超过255字符的部分丢失&#xff09;&#xff0c;或出现乱码&#xff0c;尤其是在Delphi D7及以下版本中&#xff0c;问题更常见。典型场景&#xff1a;将一个长…...

2024IEEE 《基于二次规划的安全关键型多智能体系统的控制》四旋翼 无人机 MATLAB

2024IEEE 《基于二次规划的安全关键型多智能体系统的控制》四旋翼 无人机 MATLAB 代码复现&#xff08;文献代码&#xff09;协同控制 规划 无人机 研究了基于二次规划的安全关键型多智能体系统的控制问题。 每个被控智能体被建模为一个积分器和一个不确定非线性驱动系统的级联…...

Emby高级功能完全解锁指南:emby-unlocked让媒体服务器焕发新生

Emby高级功能完全解锁指南&#xff1a;emby-unlocked让媒体服务器焕发新生 【免费下载链接】emby-unlocked Emby with the premium Emby Premiere features unlocked. 项目地址: https://gitcode.com/gh_mirrors/em/emby-unlocked 你是否厌倦了Emby Premiere的高级功能需…...

拒绝“调包侠”!从Atchem2安装到RIR敏感性分析,揭秘大气O3生成机制的高阶玩法--MCM箱模型建模方法及大气O3来源解析实践技术

在大气臭氧污染已成为我国“十四五”期间环境治理核心挑战的当下&#xff0c;深入解析其光化学生成机制与前体物控制策略&#xff0c;是科研工作者亟待攻克的关键课题。MCM箱模型凭借其包含约17000个反应的详尽化学机理&#xff0c;已成为探究O3生成潜势与敏感性分析的权威工具…...

PCB封装核心构成—焊盘,电气连接的基石

在电子设计与制造领域&#xff0c;PCB 封装是连接虚拟电路设计与实体元器件的关键纽带&#xff0c;而焊盘则是 PCB 封装中最核心、最基础的构成要素&#xff0c;堪称电气连接的 “基石”。没有精准设计的焊盘&#xff0c;元器件与电路板之间的电气连接便无从谈起&#xff0c;整…...

收藏备用!大模型3种调用模式详解,重点吃透RAG技术(小白/程序员入门必看)

对于刚接触大模型开发的小白、程序员来说&#xff0c;最困惑的莫过于“怎么用大模型”“如何避免AI瞎胡说”“不同场景该选哪种调用方式”。今天这篇文章&#xff0c;就把大模型最核心的3种调用模式讲透&#xff0c;重点拆解能解决AI幻觉、适配多场景的RAG技术&#xff0c;结合…...

抖音批量下载工具终极指南:如何免费快速获取无水印视频素材

抖音批量下载工具终极指南&#xff1a;如何免费快速获取无水印视频素材 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...