使用 React 16+Webpack 和 pdfjs-dist 或 react-pdf 实现 PDF 文件显示、定位和高亮

写在前面

在本文中,我们将探讨如何使用 React 16+Webpack 和 pdfjs-dist 或 react-pdf 库来实现 PDF 文件的显示、定位和高亮功能。这些库提供了强大的工具和 API,使得在 Web 应用中处理 PDF 文件变得更加容易。

项目设置

首先,我们需要创建一个新的 React 项目并安装所需的依赖。可以使用 create-react-app 工具来快速生成项目骨架:

npx create-react-app pdf-viewer
cd pdf-viewer

接下来,安装 pdfjs-dist 或 react-pdf 库:

# 使用 pdfjs-dist
npm install pdfjs-dist# 或者使用 react-pdf
npm install react-pdf

使用 pdfjs-dist

pdfjs-dist 是一个流行的 JavaScript 库,用于在浏览器中解析和显示 PDF 文件。以下是使用 pdfjs-dist 实现 PDF 文件显示、定位和高亮的步骤:

  1. 导入 pdfjs-dist

在你的 React 组件中导入 pdfjs-dist:

import { PDFDocument } from 'pdfjs-dist';
  1. 加载 PDF 文件

使用 PDFDocument 类从 URL 或文件对象加载 PDF 文档:

const pdfUrl = 'https://example.com/sample.pdf';PDFDocument.load(pdfUrl).promise.then((pdf) => {// PDF 加载完成后的处理逻辑
});
  1. 显示 PDF 页面

获取 PDF 文档的第一页并将其渲染到 canvas 元素中:

const canvas = document.getElementById('pdf-canvas');
const ctx = canvas.getContext('2d');pdf.getPage(1).then((page) => {const viewport = page.getViewport({ scale: 1 });canvas.height = viewport.height;canvas.width = viewport.width;const renderContext = {canvasContext: ctx,viewport,};page.render(renderContext);
});
  1. 定位到特定页面

使用 getPage() 方法获取指定页码的页面对象:

const targetPageNumber = 3;
pdf.getPage(targetPageNumber).then((page) => {// 定位到目标页面的处理逻辑
});
  1. 高亮文本

使用 getTextContent() 方法获取页面上的文本内容,并使用 canvas API 在文本位置绘制高亮矩形:

page.getTextContent().then((textContent) => {const items = textContent.items;for (let i = 0; i < items.length; i++) {const item = items[i];if (item.str === 'Hello, world!') {const transform = page.getTransform(item.transform);const x = transform[4];const y = transform[5];const width = item.width;const height = item.height;ctx.fillStyle = 'rgba(255, 255, 0, 0.5)';ctx.fillRect(x, y, width, height);}}
});

使用 react-pdf

react-pdf 是一个专门为 React 应用设计的 PDF 查看器组件。以下是使用 react-pdf 实现 PDF 文件显示、定位和高亮的步骤:

  1. 导入 react-pdf

在你的 React 组件中导入 react-pdf:

import { Document, Page } from 'react-pdf';
  1. 加载 PDF 文件

使用 Document 组件加载 PDF 文档:

const pdfUrl = 'https://example.com/sample.pdf';<Document file={pdfUrl}><Page pageNumber={1} />
</Document>
  1. 显示 PDF 页面

使用 Page 组件渲染 PDF 页面:

const pdfUrl = 'https://example.com/sample.pdf';<Document file={pdfUrl}><Page pageNumber={1} />
</Document>
  1. 定位到特定页面

通过更改 Page 组件的 pageNumber 属性来定位到指定页码:

const targetPageNumber = 3;<Document file={pdfUrl}><Page pageNumber={targetPageNumber} />
</Document>
  1. 高亮文本

react-pdf 不直接支持高亮文本功能,但可以通过自定义渲染函数来实现。例如,可以使用 onLoadSuccess 回调获取 PDF 文档的文本内容,并在渲染页面时绘制高亮矩形:

const pdfUrl = 'https://example.com/sample.pdf';function CustomPage({ pageNumber, width, height }) {const [textContent, setTextContent] = useState(null);useEffect(() => {const page = pdf.getPage(pageNumber);page.getTextContent().then((textContent) => {setTextContent(textContent);});}, [pageNumber]);return (<PagepageNumber={pageNumber}width={width}height={height}render={(page) => {// 在这里绘制高亮矩形if (textContent) {const canvas = page.getCanvas();const ctx = canvas.getContext('2d');//...}}}/>);
}<Document file={pdfUrl}><CustomPage pageNumber={1} width={400} height={600} />
</Document>

总结

在本文中,我们探讨了如何使用 React 16+Webpack 和 pdfjs-dist 或 react-pdf 库来实现 PDF 文件的显示、定位和高亮功能。无论选择哪种库,都可以轻松地在 Web 应用中处理 PDF 文件。记住,根据你的具体需求和项目要求,选择最适合的库和方法。

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

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

相关文章

42页精品PPT | 数字政府智慧政务大数据平台建设方案

这份《数字政府智慧政务大数据平台建设方案》PPT详细阐述了数字政府智慧政务大数据平台的建设背景、目标、架构以及实施策略。方案围绕解决当前政务服务中的痛点&#xff0c;如“互联网政务服务”推进中的数据共享难题、数据安全风险以及部门间业务流程整合等问题展开。 通过构…

CSS 小技巧 —— CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层

CSS 小技巧 —— CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层 1. 两个元素实现 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>纯 CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层</titl…

网络工程师 (34)生成树协议

前言 生成树协议&#xff08;Spanning Tree Protocol&#xff0c;STP&#xff09;是一种工作在OSI网络模型中第二层&#xff08;数据链路层&#xff09;的通信协议&#xff0c;其基本应用是防止交换机冗余链路产生的环路&#xff0c;确保以太网中无环路的逻辑拓扑结构&#xff…

基于CanMV IDE 开发软件对K210图像识别模块的开发

简介 CanMV IDE 是一款专为 K210 芯片设计的图形识别 Python 软件&#xff0c;它提供了强大的功能&#xff0c;帮助开发者轻松实现基于 K210 芯片的图形识别应用。无论你是初学者还是经验丰富的开发者&#xff0c;CanMV IDE 都能为你提供便捷的开发环境和丰富的资源。 硬件资…

linux的三剑客和进程处理

Linux三剑客&#xff1a; grep&#xff1a;查找 sed&#xff1a;编辑 awk&#xff1a;分析 grep - 正则表达式 [rootlocalhost ~]# grep ^a hello.txt abc grep - 忽略大小写&#xff0c;还有一些场景需要查询出来对应字符串所在的行号&#xff0c;方便我们快速在文件中定位字…

Python虚拟环境管理工具 pyenv

情景 我现在在部署一个python 项目&#xff0c;需要用到Python 3.10。但是我本地已经有了一个3.12解释器&#xff0c;有没有一种方法&#xff0c;可以管理python 环境&#xff0c;还可以随意切换。怎么做&#xff1f; window 安装pyenv-win 使用 PowerShell&#xff08;以管…

基于 PyTorch 的树叶分类任务:从数据准备到模型训练与测试

基于 PyTorch 的树叶分类任务&#xff1a;从数据准备到模型训练与测试 1. 引言 在计算机视觉领域&#xff0c;图像分类是一个经典的任务。本文将详细介绍如何使用 PyTorch 实现一个树叶分类任务。我们将从数据准备开始&#xff0c;逐步构建模型、训练模型&#xff0c;并在测试…

pytest测试专题 - 1.2 如何获得美观的测试报告

<< 返回目录 1 pytest测试专题 - 1.2 如何获得美观的测试报告 1.1 背景 虽然pytest命令的报文很详细&#xff0c;用例在执行调试时还算比较方便阅读和提取失败信息&#xff0c; 但对于大量测试用例运行时&#xff0c;可能会存在以下不足 报文被冲掉测试日志没法归档 …

压缩stl文件大小

1、MeshLab下载界面&#xff0c;从MeshLab下载适合自己系统的最新版本。 2、打开 MeshLab软件&#xff0c;将stl文件拖入其中。 3、 4、Percentage reduction参数即为缩放比例&#xff0c;根据自身想要将文件压缩到多大来。 然后点击apply 5、CtrlE弹出窗口保存文件后&…

FPGA 28 ,基于 Vivado Verilog 的呼吸灯效果设计与实现( 使用 Vivado Verilog 实现呼吸灯效果 )

目录 前言 一. 设计流程 1.1 需求分析 1.2 方案设计 1.3 PWM解析 二. 实现流程 2.1 确定时间单位和精度 2.2 定义参数和寄存器 2.3 实现计数器逻辑 2.4 控制 LED 状态 三. 整体流程 3.1 全部代码 3.2 代码逻辑 1. 参数定义 2. 分级计数 3. 状态切换 4. LED 输…

【云安全】云原生-K8S- API Server 未授权访问

API Server 是 Kubernetes 集群的核心管理接口&#xff0c;所有资源请求和操作都通过 kube-apiserver 提供的 API 进行处理。默认情况下&#xff0c;API Server 会监听两个端口&#xff1a;8080 和 6443。如果配置不当&#xff0c;可能会导致未授权访问的安全风险。 8080 端口…

DeepSeek的大模型介绍

文章目录 DeepSeek是什么DeepSeek平台使用DeepSeek的使用场景DeepSeek的本地部署 DeepSeek是什么 DeepSeek是一家2023/7月年成立的人工智能公司&#xff0c;致力于开发高效、高性能的生成式AI模型&#xff0c;在短短一年多的时间里推出了多款强大的开源模型&#xff0c;包括De…

问卷数据分析|SPSS实操之单因素方差分析

适用条件&#xff1a; 检验分类变量和定量变量之间的差异 分类变量数量要大于等于三 具体操作&#xff1a; 1.选择分析--比较平均值--单因素ANOVA检验 2. 下方填分类变量&#xff0c;上方为各个量表数据Z1-Y2 3. 点击选项&#xff0c;选择描述和方差齐性检验 4.此处为结果数…

信息收集-主机服务器系统识别IP资产反查技术端口扫描协议探针角色定性

知识点&#xff1a; 1、信息收集-服务器系统-操作系统&IP资产 2、信息收集-服务器系统-端口扫描&服务定性 一、演示案例-应用服务器-操作系统&IP资产 操作系统 1、Web大小写(windows不区分大小写&#xff0c;linux区分大小写) 2、端口服务特征(22就是linux上的服…

vmware安装win7

1、版本说明 vmware workstation 16 win7 X64 2、安装步骤 安装步骤有点独特&#xff0c;先配置虚拟机&#xff0c;然后再虚拟机的虚拟光驱里添加下载的win7。 配置完了之后&#xff0c;点击要运行的虚拟机&#xff0c;然后一直往下走就可以完成系统的安装。 3、配置系统以解…

【ThreeJS Basics 1-3】Hello ThreeJS,实现第一个场景

文章目录 环境创建一个项目安装依赖基础 Web 页面概念解释编写代码运行项目 环境 我的环境是 node version 22 创建一个项目 首先&#xff0c;新建一个空的文件夹&#xff0c;然后 npm init -y , 此时会快速生成好默认的 package.json 安装依赖 在新建的项目下用 npm 安装依…

Linux下的进程切换与调度

目录 1.进程的优先级 优先级是什么 Linux下优先级的具体做法 优先级的调整为什么要受限 2.Linux下的进程切换 3.Linux下进程的调度 1.进程的优先级 我们在使用计算机的时候&#xff0c;通常会启动多个程序&#xff0c;这些程序最后都会变成进程&#xff0c;但是我们的硬…

使用 EMQX 接入 LwM2M 协议设备

LwM2M 协议介绍 LwM2M 是一种轻量级的物联网设备管理协议&#xff0c;由 OMA&#xff08;Open Mobile Alliance&#xff09;组织制定。它基于 CoAP &#xff08;Constrained Application Protocol&#xff09;协议&#xff0c;专门针对资源受限的物联网设备设计&#xff0c;例…

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透&#xff1f;怎么解决&#xff1f;2. 你能介绍一下布隆过滤器吗&#xff1f;3. 什么是缓存击穿&#xff1f;怎么解决&#xff1f;4. 什么是缓存雪崩&#xff1f;怎么解决&#xff1f;5. redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&…

第二天:工具的使用

每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中&#xff0c;对于爬虫有兴趣的伙伴可以订阅专栏一起学习&#xff0c;完全免费。 键盘为桨&#xff0c;代码作帆。这趟为期30天左右的Python爬虫特训即将启航&#xff0c;每日解锁新海域&#xff1a;从Requests库的…