下载包 npm install react-pdf

我使用的是react-pdf@5.7.2版本

以下例子使用的是react创建的项目

直接上代码=>cv可用,保证高效

1.新增依赖

yarn add react-pdf@5.7.2

npm install react-pdf@5.7.2

2.导出js

/*
1.进入该组件时,通过路由传递path进来,形如:
history.push({ pathname: '/pdfPreview', query: { path } }) 2.进入该组件时,通过props传递path进来,形如:
{ filePath :{ path :''} }
*/
import React, { useState } from 'react';
import { Spin, Tooltip, Input } from 'antd';
import {
LeftOutlined,
RightOutlined,
PlusCircleOutlined,
MinusCircleOutlined,
FullscreenOutlined,
FullscreenExitOutlined,
} from '@ant-design/icons';
import styles from './index.less';
import { Document, Page, pdfjs } from 'react-pdf'; // pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`; const pdfjsWorker = require('pdfjs-dist/build/pdf.worker.entry'); // 引用本地的
pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker; const PreviewPDF = (props: any) => {
const { location, filePDF, filePath } = props; // 方法1: 作为组件传入的值, 取出path(pdf地址)
// const { path }: any = location.query; // 方法2: 作为路由跳转的传入的值, 取出path(pdf地址)
const path = filePath; const [pageNumber, setPageNumber] = useState(1);
const [pageNumberInput, setPageNumberInput] = useState(1);
const [pageNumberFocus, setPageNumberFocus] = useState(false);
const [numPages, setNumPages] = useState(1);
const [pageWidth, setPageWidth] = useState(1200);
const [fullscreen, setFullscreen] = useState(false);
const onDocumentLoadSuccess = ({ numPages }: any) => {
setNumPages(numPages);
};
const lastPage = () => {
if (pageNumber == 1) return;
const page = pageNumber - 1;
setPageNumber(page);
setPageNumberInput(page);
};
const nextPage = () => {
if (pageNumber === numPages) return;
const page = pageNumber + 1;
setPageNumber(page);
setPageNumberInput(page);
};
const onPageNumberFocus = () => {
setPageNumberFocus(true);
};
const onPageNumberBlur = () => {
setPageNumberFocus(false);
setPageNumberInput(pageNumber);
};
const onPageNumberChange = (e: any) => {
let { value } = e.target;
value = value <= 0 ? 1 : value;
value = value >= numPages ? numPages : value;
setPageNumberInput(value);
};
const toPage = (e: any) => {
setPageNumber(Number(e.target.value));
};
const pageZoomOut = () => {
if (pageWidth <= 1200) return;
const width = pageWidth * 0.8;
setPageWidth(width);
};
const pageZoomIn = () => {
const width = pageWidth * 1.2;
setPageWidth(width);
};
const pageFullscreen = () => {
if (fullscreen) {
setFullscreen(false);
setPageWidth(1200);
} else {
setFullscreen(true);
setPageWidth(window.screen.width - 40);
}
}; return (
<div className={`${styles.view}`}>
<div className={styles.pageContainer}>
<Document
file={path}
onLoadSuccess={onDocumentLoadSuccess}
loading={<Spin size="large" />}
options={{
// cMapUrl: `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdfjs.version}/cmaps/`, // 解决打印不显示的问题,必要的
cMapUrl:'./cmaps/', // public路径 下载到本地
cMapPacked: true,
optimizedImages: true,
// disableWorker: true
}}
>
<Page pageNumber={pageNumber} width={pageWidth} loading={<Spin size="large" />} />
</Document>
</div>
<div className={styles.pageTool}>
<Tooltip title={pageNumber == 1 ? '已是第一页' : '上一页'}>
<LeftOutlined className={styles.outlined} onClick={lastPage} />
</Tooltip>
<Input
value={pageNumberFocus ? pageNumberInput : pageNumber}
onFocus={onPageNumberFocus}
onBlur={onPageNumberBlur}
onChange={onPageNumberChange}
onPressEnter={toPage}
type="number"
/>
/ {numPages}
<Tooltip title={pageNumber == numPages ? '已是最后一页' : '下一页'}>
<RightOutlined className={styles.outlined} onClick={nextPage} />
</Tooltip>
<Tooltip title="放大">
<PlusCircleOutlined className={styles.outlined} onClick={pageZoomIn} />
</Tooltip>
<Tooltip title="缩小">
<MinusCircleOutlined className={styles.outlined} onClick={pageZoomOut} />
</Tooltip>
<Tooltip title={fullscreen ? '恢复默认' : '适合窗口'}>
{fullscreen ? (
<FullscreenExitOutlined className={styles.outlined} onClick={pageFullscreen} />
) : (
<FullscreenOutlined className={styles.outlined} onClick={pageFullscreen} />
)}
</Tooltip>
</div>
</div>
);
}; export default PreviewPDF;

3.cv  Css

.view {
display: flex;
justify-content: center;
height: 100%;
// height: 100vh;
padding: 20px 0;
// background: #444;
.pageContainer {
width: max-content;
max-width: 100%;
// overflow-y: scroll;
box-shadow: rgba(0, 0, 0, 0.2) 0px 2px 4px 0px;
}
.pageTool {
position: absolute;
bottom: 60px;
left: -20px;
padding: 8px 15px;
color: white;
background: rgb(66, 66, 66);
// background-color: #fff;
border-radius: 15px;
.outlined {
margin: 0 10px;
user-select: none;
}
input {
display: inline-block;
width: 50px;
height: 24px;
margin-right: 10px;
text-align: center;
}
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none;
}
input[type='number'] {
-moz-appearance: textfield;
}
}
}

4.引用组件

import PreviewPDF from './PreviewPDF';

  /**
*
* @param file 数据返回的值,就是预览的pdf的path值
* 此处写的一个方法调用,获取path值,进行操作
*/
const handlePreview = async(file: any) => {
await setFilePath(file.url); setVisiblePDF(true); // 组件方式预览
// const prefix = `${window.location.protocol}//${window.location.host}`;
// window.open(`${prefix}/#/binjiang-publicpower/previewPDF?path=${file.url}`); // 路由的方式预览, 新窗口打开
}; <Modal width={1400} destroyOnClose footer={false} visible={visiblePDF} onCancel={() => setVisiblePDF(false)} title={''}>
<PreviewPDF filePath={filePath} />
</Modal>

其实可以后端返回的链接添加参数(因为有些后端返回的是下载的链接),用自带的浏览器打开

默认的响应头是attachment,这里要改成inline,变成下载的

<a href={`${file.fileUrl || fileUrl}?dispositionType=inline`} target="_target"></a>

前端实现预览PDF的更多相关文章

  1. pdfjs-dist 后端返回文件前端实现预览pdf

    pdfjs-dist锁定版本号2.2.228,别的都不太好使,各种各样的报错 不锁定的时候升高版本出现pdf预览不了 引用的时候 import pdfjsLib from 'pdfjs-dist/bu ...

  2. 使用pdf.js实现前端页面预览pdf文档,解决了跨域请求

    pdf.js主要包含两个库文件,一个pdf.js和一个pdf.worker.js,,一个负责API解析,一个负责核心解析 官网地址:http://mozilla.github.io/pdf.js/ 下 ...

  3. 前端实现在线预览pdf、word、xls、ppt等文件

    最近在做一个公司的资源管理系统,一些知识小记一下. 1.前端实现pdf文件在线预览功能 方式一.pdf文件理论上可以在浏览器直接打开预览但是需要打开新页面.在仅仅是预览pdf文件且UI要求不高的情况下 ...

  4. layui.js---layer;;前端预览pdf

    layui.js---layer;;前端预览pdf 1.必须引入layui.js 2.uul是pdf文件地址 3.触发function函数:小于号button onclick="pdfsee ...

  5. 前端实现在线预览pdf、docx、xls、ppt等文件

    思路:前台将各种格式的附件上传到服务器----后台通过方法将这些格式的文件转化成图片,前台通过放映ppt的方式将其展示在页面上. 关键点:reveal.js 参考文章:https://www.awes ...

  6. 前端实现预览ppt,word,xls,pdf文件

    1.前端实现pdf文件在线预览功能 ps:刚好工作上有这个需求,所以到处找了一下处理方案,大家有需要可以试一下这几种方案,找到合适自己的 方式一. pdf文件理论上可以在浏览器直接打开预览但是需要打开 ...

  7. 前端使用pdf.js预览pdf文件

    现在的浏览器基本都支持直接把pdf文件拖到浏览器就可以打开了,不用安装额外的插件.但是不同的浏览器显示的页面不一样.如果我们想在网页上统一预览pdf怎样实现呢? Mozilla开源了一个插件pdf.j ...

  8. 前端使用pdf.js预览pdf文件,超级简单

    现在的浏览器基本都支持直接把pdf文件拖到浏览器就可以打开了,不用安装额外的插件.但是不同的浏览器显示的页面不一样.如果我们想在网页上统一预览pdf怎样实现呢? Mozilla开源了一个插件pdf.j ...

  9. fis3+vue+pdf.js制作预览PDF文件或其他

    人生第一篇博客,的确有点紧张,但有些许兴奋,因为这对于我来说应该是一个好的开始,以此励志在技术的道路上越走越远. 看过了多多少少的技术博客,给自己带来了很多技术上的收获,也因此在想什么时候自己也可以赠 ...

  10. JS展示预览PDF。

    刚好遇到需求,需要在手机端--展示一个电子收据,电子收据返回是PDF格式的,所以需要在前端上面去做PDF预览. 在学习过程中,了解到一种很简单,不需要任何插件的方法做PDF预览,但是这方法有局限性. ...

随机推荐

  1. 从 Flink Forward Asia 2021,看Flink未来开启新篇章

    ​简介:本文将对FFA Keynote议题作一些简单的归纳总结,感兴趣的小伙伴们可以在FFA官网[2]找到相关主题视频观看直播回放. ​ 作者 | 梅源(Yuan Mei) 来源 | 阿里技术公众号 ...

  2. git fatal detected dubious ownership in repository 的解决方法

    我换了一台电脑,将旧电脑的硬盘换到新电脑上:我装了双系统,切换到另一个系统时:我发现了 git 代码仓库无法执行 git 命令,不断报错 fatal: detected dubious ownersh ...

  3. 2018-7-15-WPF-在-DrawingContext-的-push-如何使用

    title author date CreateTime categories WPF 在 DrawingContext 的 push 如何使用 lindexi 2018-7-15 15:51:0 + ...

  4. spannerlib优雅的go异常处理

    蹩脚的go 异常处理 一般写go的人,如果他不是写算法,正常写业务代码的话,可能都会为优雅的异常处理而烦恼,因为脑子抽筋的go设计者们,总是感觉语法糖是一种很低级的东西.但是在我们大多数公司的业务逻辑 ...

  5. python3解析FreeSWITCH会议室列表信息

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Python版本:3.9.12 进行FreeSWITCH会议室相关功能开发过程中,会遇到需要解析会议室列表信息并进行 ...

  6. FFmpeg开发笔记(十八)FFmpeg兼容各种音频格式的播放

    ​FFmpeg结合SDL可以播放音频文件,也能播放视频文件中的音频流,<FFmpeg开发实战:从零基础到短视频上线>一书第10章的示例程序playaudio.c支持播放mp3和aac两种格 ...

  7. Halo博客搭建小记

    准备工作 阿里云服务器,操作系统为CentOS 7.9.2009 x86_64(Py3.7.9) 宝塔面板 Nginx 1.24.0(用于反向代理) 已备案的域名 ssl证书(https访问) 参考官 ...

  8. 题解:CF1941G Rudolf and Subway

    原题链接 简化题意 一个无向连通图中将边分成了不同颜色(保证同种颜色联通),问从 \(b\) 到 \(e\) 最短需要经过几种颜色 思路 考虑因为同种颜色联通,可直接在读入的时候开两个 vector ...

  9. github、gitee冲突配置ssh key

    背景 当有多个git账号时,比如: a. 两个gitee,一个账号是用于公司内部的工作开发,一个账号是自己学习的个人账号: b. 一个github,用于自己进行一些开发活动: 操作: 生成不同的key ...

  10. docker 安装 kafka+zookeeper,golang操作kafka

    目录 docker-compose.yml go操作kafka producer 消费者 consumer 消费者 结合gin框架操作kafka go-queue操作kafka 环境: centos8 ...