使用 React PDF 构建 React.js PDF 查看器的指南
在本文中,我们将重点介绍在React.js中制作 PDF 查看器的最受欢迎的开源库。具体来说,我们将利用著名的开源库react-pdf的功能,指导您完成创建 React.js PDF 查看器的过程。
通过本教程,您将在第一部分学习如何使用 React-PDF 在 React.js 应用程序中实现功能齐全的 PDF 查看器。在第二部分中,我们将重点介绍如何集成ComPDF以提供更多 PDF 功能,从而进一步增强用户的文档处理体验。
开源 React.js PDF 查看器库
在 React.js 开发中,各种开源库,尤其是非常流行的react-pdf和 @react-pdf/renderer,为 PDF 查看提供了便利。@react-pdf/renderer 在 npm 上的每周下载量高达 5.4 万次,而 React-PDF 在 npm 上的每周下载量也高达 100 万次。在这篇博文中,我们将重点介绍如何使用 React-PDF 构建一个免费的 PDF 查看器。
使用 React-PDF 构建 React.js PDF 查看器
要求:
- Node.js 版本 14 或更高版本。
-包管理器与 npm 兼容。本指南包含Yarn和npm 客户端(默认随 Node.js 安装)的使用示例。请确保 npm 版本为 5.6 或更高版本。
创建项目
1.首先使用 create-react-app 创建一个 React.js 项目:
npx create-react-app react-pdf-example
2. 项目创建完成后,将目录更改为项目文件夹:
cd react-pdf-example
添加 react-pdf
1. 安装并添加 React PDF 库:从 React 应用程序位置的终端运行以下命令来拉下所有必要的组件。
npm i react-pdf
2. 然后,按照下面的代码在”src/components/Webviewer.js”中创建一个Webviewer 。
import { useState } from "react"
import { Document, Page, pdfjs } from "react-pdf"
import "react-pdf/dist/esm/Page/AnnotationLayer.css"
import 'react-pdf/dist/Page/TextLayer.css';pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;export default function PDFViewer(props) {const [numPages, setNumPages] = useState();const [pageNumber, setPageNumber] = useState(1);function prevPage() {setPageNumber(pageNumber - 1 <= 1 ? 1 : pageNumber - 1);}function nextPage() {setPageNumber(pageNumber + 1 >= numPages ? numPages : pageNumber + 1);}function onLoadSuccess({ numPages }) {setNumPages(numPages);}return (<div><nav><button onClick={prevPage}>Previous Page</button><button onClick={nextPage}>Next Page</button></nav><div className="pages">{pageNumber} of {numPages}</div><div className="page"><Documentfile='ComPDFKit_Sample_File_Web.pdf'onLoadSuccess={onLoadSuccess}renderMode="canvas"><Pagekey={pageNumber}pageNumber={pageNumber}/></Document></div></div>)
}
显示 PDF
通过运行以下命令在终端中运行 React App 中的 PDF 查看器,PDF 成功显示:
npm start
使用 React-PDF 的局限性
尽管 React-PDF 是一个出色的开源项目,但它也有其局限性:
缺乏内置用户界面: React-PDF 没有预置的用户界面。如果您需要一个界面来帮助用户浏览 PDF 文件,则需要从头构建。
文本选择不完整: React-PDF 中的文本选择功能尚未完全优化,导致在尝试突出显示 PDF 文档中的文本时用户体验不佳。
性能挑战:渲染大型 PDF 文件或多页文档可能会影响 React-PDF 的性能,尤其是在资源有限的环境中。
如果您想在您的项目中集成更多 PDF 功能并改善用户体验,请继续阅读我们的第二种方法:使用 ComPDFKit 部署您的 PDF 查看器!
使用ComPDFKit构建 React.js PDF 查看器
此外,我们还提供ComPDFKit for Web,它可以轻松集成到您的项目中,通过添加您想要的任何功能来提高您的熟练程度并简化您的工作流程,例如:
- PDF 页面处理。
- PDF 编辑。
- PDF 评论和回复。
- 签署 PDF 文档。
- 比较 PDF 版本。
- 填表。
- 敏感信息编辑。
在这里,我们将逐步提供关于如何将 ComPDFKit for Web 无缝集成到您的 React 项目中的详细指南。
点击查看视频指南:使用 ComPDFKit PDF SDK 构建 React PDF 查看器
创建新的 React 项目
1. 使用 create-react-app 搭建一个简单的 React 应用程序:
npx create-react-app compdfkit-react-example
2. 切换到创建的项目目录:
cd compdfkit-react-example
将 ComPDFKit for Web 添加到您的项目中
1. 将“@compdfkit”文件夹导入到项目的根目录。
2. 通过调用ComPDFKitViewer.init()在您的项目中初始化 ComPDFKit for Web 。
显示 PDF
将您想要显示的 PDF 地址和您的许可证密钥传递到init 函数中。
import ComPDFKitViewer from "/@compdfkit/webviewer";export default function Home() {let init = falseconst viewer = useRef(null);let docViewer = nulluseEffect(() => {if (init) returninit = trueComPDFKitViewer.init({pdfUrl: 'Your PDF Url',license: 'Input your license here'}, viewer.current).then((core) => {docViewer = core.docViewer})});return ()
}
PDF 文件将会打开并显示。您也可以访问 ComPDFKit GitHub 账户下载React PDF 查看器示例项目,并直接运行 Web Demo。如果您在此过程中遇到任何问题,请立即联系我们!
使用 ComPDFKit 的好处
轻松集成:开发人员可以按照ComPDF的开发文档,只需几行代码即可轻松地将这个强大的 SDK 合并到他们的应用程序中。
功能优势:与 React-PDF 不同,使用 ComPDFKit 部署 PDF 查看器可提供无与伦比的自定义选项,以满足特定需求。您可以使用其他 PDF 功能(例如注释、文档编辑、表单处理和数字签名)来丰富您的应用程序,从而显著提升用户体验。
卓越的支持服务: ComPDFKit 提供 24/5 在线和电子邮件支持。遇到问题时,只需联系在线客服团队,即可获得快速有效的解决方案。
全面的技术援助: ComPDFKit 提供无限的错误请求支持和远程服务,确保迅速解决任何开发挑战,从而实现顺利的开发过程。
价格优势:为了方便项目测试,ComPDFKit 提供 30 天免费试用许可证。此外,我们还为个人开发者、中小型企业、初创企业和非营利组织等提供价格实惠的许可证。
相关文章:
使用 React PDF 构建 React.js PDF 查看器的指南
在本文中,我们将重点介绍在React.js中制作 PDF 查看器的最受欢迎的开源库。具体来说,我们将利用著名的开源库react-pdf的功能,指导您完成创建 React.js PDF 查看器的过程。 通过本教程,您将在第一部分学习如何使用 React-PDF 在 …...
动力电池点焊机厂家:驱动新能源制造的精密力量|比斯特自动化
在新能源汽车、储能系统等产业蓬勃发展的背景下,动力电池点焊机作为电池模组生产的核心设备,正经历着技术迭代与市场需求的双重升级。这类厂家通过持续研发与创新,不仅满足了电池制造企业对焊接精度、效率与稳定性的严苛要求,更推…...
React的合成事件(SyntheticEventt)
文章目录 前言 前言 React的合成事件(SyntheticEvent)是React为了统一不同浏览器的事件处理行为而封装的一套跨浏览器事件系统。它与原生事件的主要区别如下: 1. 事件绑定方式 • 合成事件:使用驼峰命名法绑定事件(如…...
知识中台Top5:Baklib上榜推荐
Baklib知识中台优势 在数字化转型浪潮中,Baklib凭借其知识中台的核心设计理念,构建了企业级知识管理的差异化竞争力。区别于传统文档管理系统,该平台通过四库体系(知识资源库、场景规则库、服务模型库、应用组件库)实…...
在Windows系统中使用C++与Orthanc交互:基于DICOMweb的医学影像应用开发
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
视频太大?用魔影工厂压缩并转MP4,画质不打折!
在日常生活中,我们常常需要将视频文件转换成不同的格式以适应各种设备或平台的播放需求。魔影工厂作为一款功能强大且操作简单的视频转换工具,深受用户喜爱。本文中简鹿办公将手把手教你如何使用魔影工厂将视频转换为MP4格式,并进行个性化设置…...
Wan2.1 通过首尾帧生成视频
Wan2.1 通过首尾帧生成视频 flyfish 使用 Wan2.1-FLF2V-14B-720P 模型,通过输入两张图像(起始帧和结束帧),生成一段连贯的视频。 First Last Frame-to-Video 即 “首末帧到视频” 技术 import numpy as np import torch import…...
宝塔+fastadmin:给项目添加定时任务
一、定时任务脚本编写 1. 使用 shebang 声明执行器 #!/usr/bin/env php 这是 Unix/Linux 系统中脚本文件的标准开头。表示这个脚本使用系统环境变量中的 php 来执行。2. 定义 ThinkPHP 入口路径并加载框架 define(APP_PATH, __DIR__ . /../../application/); require __DIR__…...
[自动化集成] 使用明道云上传附件并在Python后端处理Excel的完整流程
在企业日常自动化场景中,使用低代码平台如明道云搭建前端界面,结合自定义Python后端服务,实现灵活数据处理是一种高效的组合方式。本文将分享一个典型的集成用例:用户通过明道云上传文本和Excel附件,Python后端接收并解析这些信息,最终实现完整的数据处理闭环。 项目背景…...
前端项目采用响式布局
要让整个前端项目采用响应式布局,可以从多个方面进行优化,以下是一些具体的建议和实现方法: 1. 使用 ElementPlus 的响应式特性 ElementPlus 组件库本身提供了一些响应式的能力,例如 el-col 组件可以用于创建响应式的网格布局。…...
【Unity】DOTween的常用函数解释
DOTween插件常用函数解释 1.DOTween.To(通用变化动画) 解释:将某一个值在一定的时间内变化到另一个值(通用的函数),可用于大部分的动画变化 使用示例: using UnityEngine; using DG.Tweenin…...
飞桨paddle import fluid报错【已解决】
跟着飞桨的安装指南安装了paddle之后 pip install paddlepaddle有一个验证: import paddle.fluid as fluid fluid.install check.run check()报错情况如下,但是我在pip list中,确实看到了paddle安装上了 我import paddle别的包,…...
ELK简介和docker版安装
使用场景 主要还是给开发人员“打捞日志”用的。 ELK 是由三个开源工具组成的套件(Elasticsearch、Logstash 和 Kibana),主要用于日志的收集、分析和可视化。以下是 ELK 常见的使用场景: 日志集中化管理 收集来自多个服务器或服…...
DockerHub被封禁,怎么将镜像传到国内?一种简单合规的镜像同步到国内方案[最佳实践]
Docker将容器化技术普及,推动云计算向云原生的演进。Docker的核心创新技术之一是容器镜像,它是一种文件的打包方式,将应用程序运行的操作系统、库、运行环境等依赖全部打包一起。在其他任意环境,只要可以运行docker服务࿰…...
飞桨paddle ‘ParallelEnv‘ object has no attribute ‘_device_id‘【已解决】
书借上回,自从我反复重装paddle之后,我发现了,只要pip list中有库,但是代码报错,那就是飞桨没把代码更新完全,只能自己去改源代码 我又遇到报错了: 根据报错信息,找到ParallelEnv报…...
网络安全面试题(一)
文章目录 一、基础概念与模型1. 什么是通信协议?列举三种常见的网络通信模型?2. 解释OSI七层模型及各层功能3. TCP/IP四层模型与OSI模型的对应关系是什么?4. 五层协议体系结构与TCP/IP模型的区别?5. 什么是面向连接与非面向连接的服务&…...
【Leetcode 每日一题】3355. 零数组变换 I
问题背景 给定一个长度为 n n n 的整数数组 n u m s nums nums 和一个二维数组 q u e r i e s queries queries,其中 q u e r i e s [ i ] [ l i , r i ] queries[i] [l_i, r_i] queries[i][li,ri]。 对于每个查询 q u e r i e s [ i ] queries[i] quer…...
RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试
RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试 **背景与目标** 一.性能数据【INT8模型在CPU上推理的结果已经不对,暂未分析原因】二.操作步骤2.1 在x86-Linux上生成onnx模型,以及tflite量化模型(避免在RK3588上安装过多依赖)2.1.1 创建容器2.1.2 安装依赖2.1.3 下载推…...
力扣第5题:最长回文子串(动态规划)
小学生一枚,自学信奥中,没参加培训机构,所以命名不规范、代码不优美是在所难免的,欢迎指正。 标签: 字符串、动态规划、中心扩散法 语言: C 题目: 给你一个字符串s,找到s中最长的…...
HCIP实验五
一、实验拓扑图: 二、实验需求分析: 1. PreVal策略:要求确保R4通过R2到达192.168.10.0/24 ,需在R4上针对去往该网段路由配置PreVal策略,为经R2的路径赋予更高优先值,影响本地路由表选路。 2. AS Path策略…...
python Numpy-数组
目录 Numpy: 一、Ndarray 1 定义 2 数组的属性方法 2.1 数组的维度:np.ndarray.shape 2.2 元素的类型:np.ndarray.dtype 2.3 数组元素的个数:np.ndarray.size 2.4 转置 3 ndarray 所存储元素的数据类型 4 数组创建 4.1 a…...
数据库分库分表从理论到实战
1.分库分表基础理论 1.1 分库分表基本概念 定义:分库分表是一种将单一数据库中的数据分散存储到多个数据库或表中的技术方案,其核心思想是通过"分而治之"的方式解决数据库性能瓶颈问题。分库:将表按业务或数据量拆分到不同数据库中…...
Java异常处理与File类终极指南
Java异常处理与File类终极指南 目录 异常体系全维度拆解异常处理十五种高阶模式自定义异常企业级实践File类深度探索与NIO进化论分布式系统异常处理架构性能调优与安全防护全网最全异常代码库一、异常体系全维度拆解 1.1 Java异常DNA解析 // 异常类的核心继承关系 public cla…...
pmap中的mode列,脏页,写时复制
写时复制(Copy-on-Write,简称 COW) 是一种计算机编程中的优化技术,主要用于内存或存储资源的管理。其核心思想是:只有在真正需要修改数据时,才会执行实际的复制操作,从而避免不必要的资源开销。…...
通过COM获取正在运行的Excel实例并关闭 c#实现
利用COM对象模型获取正在运行的Excel实例并关闭。示例代码如下: using Excel Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; try { Excel.Application excelApp (Excel.Application)Marshal.GetActiveObject("Excel.Applicatio…...
运行在华为云kubernetes应用接入APM服务
1 APM概述 在云时代微服务架构下应用日益丰富,纷杂的应用异常问题接踵而来。应用运维面临巨大挑战: 分布式应用关系错综复杂,应用性能问题分析定位困难,应用运维面临如何保障应用正常、快速完成问题定位、迅速找到性能瓶颈的挑战…...
虚幻引擎5-Unreal Engine笔记之摄像头camera
虚幻引擎5-Unreal Engine笔记之摄像头camera code review! 目录 第一部分:摄像头的基础概念 1.1 UE5 中摄像头的定义与作用1.2 UE5 中摄像头的类型与分类 第二部分:摄像头的代码结构与分类 2.1 摄像头是类还是组件?2.2 组件的本质ÿ…...
mysql的基础命令
1.SQL的基本概念 SQL 是用于管理和操作关系型数据库的标准编程语言。是所有关系型数据库(如 MySQL、PostgreSQL、Oracle 等)的通用语言。 SQL语句分类 DDL: Data Defination Language 数据定义语言 CREATE,DROP,ALTER DML: Da…...
去中心化算力池:基于IPFS+智能合约的跨校GPU资源共享平台设计
点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 一、问题背景:高校算力孤岛的困境 现状痛点 各高校GPU集群利用率差异显著&…...
数据库(二):ORM技术
什么是 ORM? ORM(Object-Relational Mapping) 是一种用于实现 对象模型(面向对象)与关系模型(数据库)之间映射的技术,使程序员可以通过操作对象的方式访问数据库数据,而无…...
Oracle基础知识
目录 1.别名的使用 2.AND的优先级高于OR 3.where后面可以接别名,order by后面不可以 4.Oracle中SQL的执行顺序(重点) 5.dual万用表 6.是否区分大小写 7.Oracle常用数据类型 8.Oracle常用函数 (1)length字符、lengthb字节和cast强制类型转换 (2)数据类型转…...
使用 vite-plugin-dynamic-base 实现运行时动态设置上下文路径
我们一般会在编译之前设置上下文,那么如何在编译之后动态设置上下文的路径? 本文使用的技术栈是 Go(Gin) Vue.js(Vite) 本文使用到的第三方包:https://github.com/chenxch/vite-plugin-dynam…...
spark-shuffle 类型及其对比
1. Hash Shuffle 原理:将数据按照分区键进行哈希计算,将相同哈希值的数据发送到同一个Reducer中。特点:实现简单,适用于数据分布均匀的场景。但在数据分布不均匀时,容易导致某些Reducer处理的数据量过大,产…...
力扣-快乐数
1.题目要求 2.题目链接 202. 快乐数 - 力扣(LeetCode) 3.题目分析 首先,因为需要频繁地用到数字变为各个位上的平方的过程,我们可以将"对于一个正整数,每一次将该数替换为它每个位置的数字的平方和"这一操作抽象出来,定义成一个…...
每日算法刷题Day10 5.19:leetcode不定长滑动窗口求最长/最大4道题,结束定长滑动窗口,用时1h
不定长滑动窗口 不定长滑动窗口主要分为三类:求最长子数组,求最短子数组,以及求子数组个数。 注:滑动窗口相当于在维护一个队列。右指针的移动可以视作入队,左指针的移动可以视作出队。 滑动窗口【基础算法精讲 03】…...
FreeSWITCH 纯内网配置
纯内网,且同一个网段,Fs 可简化配置,要点是: 1. 不需要事先配置 directory,任意号码都可以注册,且无挑战 2. 呼叫无挑战 不需要考虑那么多安全问题 配置如下: 1. 全局变量 <X-PRE-PROCESS cmd"…...
STL中list的模拟
这里写目录标题 list 的节点 —— ListNodelist 的 “导览员” —— ListIteratorlist 的核心 —— list 类构造函数迭代器相关操作容量相关操作 结尾 在 C 的 STL(标准模板库)中,list 是一个十分重要的容器,它就像一个灵活的弹簧…...
【iOS】类结构分析
前言 之前我们已经探索得出对象的本质就是一个带有isa指针的结构体,这篇文章来分析一下类的结构以及类的底层原理。 类的本质 类的本质 我们在main函数中写入以上代码,然后利用clang对其进行反编译,可以得到c文件 可以看到底层使用Class接…...
Android 万能AI证件照 v1.3.2
在日常的生活和工作场景里,证件照的身影随处可见。找工作投简历时,它是展现你形象的 “第一张名片”;办理各类证件,缺了它可不行;参加各种考试报名,同样需要它。可以说,证件照虽小,却…...
【Java】封装在 Java 中是怎样实现的?
包 关于包有两个关键字 package : 声明当前类属于哪个包 和 import : 允许当前类使用其他类或接口时不使用全限定名 , 也就是导包 . IDEA 的普通项目文件包括 src : 包含源码和资源文件 和 out : 包含编译产物字节码文件 . 在 IDEA 开发环境建包会在 src 源码目录中生成 , 可…...
牛客网 NC14736 双拆分数字串 题解
牛客网 NC14736 双拆分数字串 题解 题目分析 解题思路 通过分析,我们可以发现: 当n≤3时,无法构造出双拆分数字串,因为数字位数太少对于n>3的情况,我们可以构造两种特殊形式: 当n为奇数时,…...
超长文本注意力机制如何突破传统 O(n²) 瓶颈
介绍了当前在超长文本(可达百万级及以上 Token)生成与预测中,注意力机制如何突破传统 O(n) 瓶颈,并阐释多种高效注意力算法如何支持 超长上下文处理能力。 概览 当前主流 Transformer 在处理长序列时,由于每个 Token…...
异丙肌苷市场:现状、挑战与未来展望
摘要 本文聚焦异丙肌苷市场,深入分析了其市场规模与增长趋势、应用价值与市场驱动因素、面临的挑战以及竞争格局。异丙肌苷作为一种具有重要应用价值的改性核苷衍生物,在药物研发和治疗领域展现出潜力,但市场发展也面临诸多挑战。文章最后为…...
JAVA面向对象——对象和类的基本语法
JAVA面向对象——对象和类的基本语法 一、面向对象编程基础 1. 程序中的数据存储方式 基本类型:变量(如 int max 15;)。数据结构:数组(一维/二维)、对象(特殊数据结构,用于存储复…...
【windows】音视频处理工具-FFmpeg(合并/分离)
一、FFmpeg介绍 FFmpeg是一个开源的跨平台音视频处理框架。 法国计算机程序员 Fabrice Bellard 于 2000 年创建。 “FF”(代表 “Fast Forward”,快进之意)与 “mpeg”(流行的视频压缩标准 MPEG,即运动图像专家组&am…...
Java并发编程:从基础到高级实战
在现代软件开发中,并发编程已成为不可或缺的核心技能。随着多核处理器的普及和分布式系统的发展,能否编写高效、线程安全的并发程序直接决定了应用程序的性能和可靠性。Java作为一门成熟的企业级编程语言,提供了丰富的并发编程工具和API&…...
在 Excel 中使用东方仙盟软件————仙盟创梦IDE
安装插件 用仙盟创梦编写插件代码 源码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ExcelDna.Integration;namespace 东方仙盟.仙盟创梦IDE_招标系统 {public static class 仙盟创梦_招标专…...
win7无线网络名称显示为编码,连接对应网络不方便【解决办法】
使用多个网络时可能需要切换到打印机的网络来打印东西,但是win7的编码问题导致不知道哪个网络是对应网络,可以使用批处理命令来自动连接道指定网络 将这个代码用文本文件打开后粘贴,然后另存为ansi格式的bat文件 代码中使用两种方式进行连接…...
.NET 10 - 尝试一下Minimal Api的Validation新特性
1.简单介绍 2025年11月微软将会发布.NET10,这是LTS(Long Term Support)版本。当前.NET10已经处于Preview4版本,微软对Runtime, Library, SDK, C#, Asp.NET Core, MAUI等都做了很多enhancement。近些年微软对Minimal Api一直在持续地更新。在.NET8中, Mi…...
C# Task 与 SynchronizationContext
示例代码 using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks;namespace Test {internal class Program{static void Main(string[] args){_mainThreadSynchronizationContext new ThreadSynchronizationContext(&qu…...