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

seo论坛站长交流微信网站是什么

seo论坛站长交流,微信网站是什么,网站建设策划图片,seo排名查询工具1.背景在项目开发中,pdf预览是一个很常见的业务。各大公司为了保护自己的知识产权,也会对pdf预览进行限制,比如:不允许下载、打印,不允许提取文字等等。要想在实现预览功能的基础上还要附加这些限制,有很多…

1.背景

        在项目开发中,pdf预览是一个很常见的业务。各大公司为了保护自己的知识产权,也会对pdf预览进行限制,比如:不允许下载、打印,不允许提取文字等等。要想在实现预览功能的基础上还要附加这些限制,有很多中可选的方法。本篇文章主要从前端视角谈谈怎么实现这个业务。

        在开始讲解之前,需要先明确一点:使用纯前端的方法是无法完全避免用户窃取pdf的内容的,只能通过一些配置和脚本增加用户获取的难度。更安全的方法是后端对于pdf资源的请求加以限制,或者对pdf增加水印等等。

2.技术栈

        本篇文章是在Next.js(React框架)的基础上借助pdf.js三方包演示怎么实现pdf预览和限制下载的。读者需要对React,JavaScript语法有基本的了解。

3.实现pdf预览

3.1. 安装pdf.js依赖

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

3.2. 创建 PDF 查看器组件

在 components/PdfViewer.js 中创建组件:

'use client'; // 必须标记为客户端组件import { useEffect, useRef, useState } from 'react';
import * as pdfjsLib from 'pdfjs-dist';export default function PdfViewer({ pdfUrl }) {const canvasRef = useRef(null);const [numPages, setNumPages] = useState(0);const [currentPage, setCurrentPage] = useState(1);const [scale, setScale] = useState(1.5);// 初始化 PDF.jsuseEffect(() => {pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.worker.min.js';}, []);// 加载 PDFuseEffect(() => {if (!pdfUrl) return;const loadPdf = async () => {const loadingTask = pdfjsLib.getDocument(pdfUrl);const pdf = await loadingTask.promise;setNumPages(pdf.numPages);renderPage(pdf, currentPage);};loadPdf().catch(console.error);}, [pdfUrl, currentPage]);// 渲染指定页面const renderPage = async (pdf, pageNum) => {const page = await pdf.getPage(pageNum);const viewport = page.getViewport({ scale });const canvas = canvasRef.current;const context = canvas.getContext('2d');canvas.height = viewport.height;canvas.width = viewport.width;await page.render({canvasContext: context,viewport: viewport}).promise;};const goToPrevPage = () => {if (currentPage > 1) {setCurrentPage(currentPage - 1);}};const goToNextPage = () => {if (currentPage < numPages) {setCurrentPage(currentPage + 1);}};return (<div className="pdf-viewer"><div className="pdf-controls"><button onClick={goToPrevPage} disabled={currentPage <= 1}>上一页</button><span>第 {currentPage} 页 / 共 {numPages} 页</span><button onClick={goToNextPage} disabled={currentPage >= numPages}>下一页</button><select value={scale} onChange={(e) => setScale(parseFloat(e.target.value))}><option value="0.5">50%</option><option value="1.0">100%</option><option value="1.5">150%</option><option value="2.0">200%</option></select></div><div className="pdf-canvas-container"><canvas ref={canvasRef} /></div></div>);
}

3.3. 创建样式文件

在 components/PdfViewer.module.css 中:

.pdf-viewer {width: 100%;max-width: 800px;margin: 0 auto;
}.pdf-controls {display: flex;justify-content: center;align-items: center;gap: 15px;margin-bottom: 20px;
}.pdf-canvas-container {border: 1px solid #ddd;box-shadow: 0 2px 5px rgba(0,0,0,0.1);overflow: auto;max-height: 80vh;
}button {padding: 5px 10px;cursor: pointer;
}button:disabled {opacity: 0.5;cursor: not-allowed;
}select {padding: 5px;
}

3.4. 在页面中使用组件

在 app/page.js 中:

import PdfViewer from '../components/PdfViewer';
import styles from './page.module.css';export default function Home() {// 可以是本地public文件夹中的PDF或远程URLconst pdfUrl = '/sample.pdf'; // 确保PDF文件放在public文件夹中return (<main className={styles.main}><h1>PDF 查看器</h1><PdfViewer pdfUrl={pdfUrl} /></main>);
}

3.5.注意事项

  • 在组件的第一行要声明‘use client’告诉next这是客户端组件(因为pdf.js调用的是浏览器的canvas用来绘制pdf后显示的,所以必须在浏览器环境下才能运行) 

 4.全局事件限制pdf

// 全局事件监听
useEffect(() => {// 禁用鼠标右键const handleContextMenu = (e: MouseEvent) => {e.preventDefault();e.stopPropagation();return false;};// 禁用键盘快捷键const handleKeyDown = (e: KeyboardEvent) => {if ((e.ctrlKey && (e.key === 's' || e.key === 'S')) ||(e.ctrlKey && (e.key === 'p' || e.key === 'P')) ||(e.ctrlKey && e.shiftKey && (e.key === 'I' || e.key === 'i')) ||e.key === 'F12' ||(e.ctrlKey && e.shiftKey && (e.key === 'C' || e.key === 'c')) ||(e.ctrlKey && e.shiftKey && (e.key === 'J' || e.key === 'j')) ||(e.ctrlKey && (e.key === 'u' || e.key === 'U')) ||(e.ctrlKey && (e.key === 'a' || e.key === 'A')) ||(e.ctrlKey && (e.key === 'c' || e.key === 'C')) ||(e.ctrlKey && (e.key === 'v' || e.key === 'V')) ||(e.ctrlKey && (e.key === 'x' || e.key === 'X'))) {e.preventDefault();e.stopPropagation();return false;}};// 禁用文本选择const handleSelectStart = (e: Event) => {e.preventDefault();return false;};  // 禁用拖拽const handleDragStart = (e: DragEvent) => {e.preventDefault();return false;};document.addEventListener('contextmenu', handleContextMenu, true);document.addEventListener('keydown', handleKeyDown, true);document.addEventListener('selectstart', handleSelectStart, true);document.addEventListener('dragstart', handleDragStart, true);window.addEventListener('keydown', handleKeyDown, true);return () => {// 组件注销时,清除事件方式内存泄漏document.removeEventListener('contextmenu', handleContextMenu, true);document.removeEventListener('keydown', handleKeyDown, true);document.removeEventListener('selectstart', handleSelectStart, true);document.removeEventListener('dragstart', handleDragStart, true);window.removeEventListener('keydown', handleKeyDown, true);};}, []);

通过这些全局事件的引用可以很好的限制普通用户对于下载pdf,但是对于熟练的用户,还是有很多办法绕过这些限制的。具体方法感兴趣的同学可以自行搜索。

        

http://www.dtcms.com/wzjs/541668.html

相关文章:

  • 怎样建设大型网站淘宝客导购网站建设?
  • 济南网站制作哪家强免费的h5制作软件app
  • 网站美化工具2003服务器怎么挂网站
  • 做网站步骤详解网站联系方式连接怎么做
  • 免费素材哪个网站比较好云校网站建设
  • 黑河哈尔滨网站建设使用php做的网站
  • 湛江找人做网站排名如何做推广引流赚钱
  • 郑州网站制作招聘移动端的网站怎么做的
  • tp5被黑做的网站全变成首页岳阳seo快速排名
  • 怎么创建免费网站网站建设yuanmus
  • 一个网站交互怎么做的云南建投二公司官网
  • 免费网站建设平台 iiswordpress divi 2.5
  • 建设信息发布平台多少钱合肥网站优化步骤
  • 专门做问卷的网站wordpress手机端响应慢
  • 吴忠建设局网站wordpress导出主题代码
  • wordpress 搬站拉卡拉(300773) 股吧
  • 移动宽带 国外网站广州正佳极地海洋世界
  • 网站建设所需技术文化建设设计网站
  • 青岛网络建站公司网站设计需要什么技术
  • 网站建站流程有哪些怎么做网站后台管理系统
  • 阿里云服务器可以做彩票网站吗高级室内设计网站
  • 辽宁建设工程信息网诚信备案库seo怎么去做
  • 云南工程建设信息网站iis wordpress伪静态
  • 足球比赛直播在线观看网站建设和网站优化的区别
  • 高端制作网站技术网页制作工具通常在什么上建立热点
  • 烟台seo网站推广做亚克力在那个网站上好
  • 那个网站可以做公示宣传册设计与制作用什么软件
  • 商城的网站设计小程序开发平台好牌子推荐
  • 云南高端网站建设360推广登录
  • 网站模板修改软件茂名市建设银行网站