当前位置:首页 > React

react实现移动端pdf

2026-01-27 10:37:22React

React 实现移动端 PDF 预览与操作

在移动端实现 PDF 预览和操作,可以使用以下方法:

使用 react-pdf 安装依赖包:

npm install react-pdf

基础实现代码:

import { Document, Page } from 'react-pdf';
import 'react-pdf/dist/esm/Page/AnnotationLayer.css';
import 'react-pdf/dist/esm/Page/TextLayer.css';

function PDFViewer() {
  const [numPages, setNumPages] = useState(null);
  const [pageNumber, setPageNumber] = useState(1);

  function onDocumentLoadSuccess({ numPages }) {
    setNumPages(numPages);
  }

  return (
    <div style={{ width: '100%' }}>
      <Document
        file="/sample.pdf"
        onLoadSuccess={onDocumentLoadSuccess}
      >
        <Page pageNumber={pageNumber} width={window.innerWidth} />
      </Document>
      <p>
        Page {pageNumber} of {numPages}
      </p>
    </div>
  );
}

移动端优化要点

  • 设置 width={window.innerWidth} 使 PDF 适配屏幕宽度
  • 添加手势支持实现翻页
  • 添加缩放功能(需结合 transform: scale()
  • 使用 CSS 媒体查询优化移动端样式

替代方案:PDF.js + React 对于更复杂的需求,可以直接使用 Mozilla 的 PDF.js:

import * as pdfjsLib from 'pdfjs-dist';

async function loadPDF(url) {
  const loadingTask = pdfjsLib.getDocument(url);
  const pdf = await loadingTask.promise;

  // 获取第一页
  const page = await pdf.getPage(1);
  const viewport = page.getViewport({ scale: 1.0 });

  // 渲染到canvas
  const canvas = document.getElementById('pdf-canvas');
  const context = canvas.getContext('2d');
  canvas.height = viewport.height;
  canvas.width = viewport.width;

  const renderContext = {
    canvasContext: context,
    viewport: viewport
  };
  await page.render(renderContext).promise;
}

移动端专用功能实现

  • 双指缩放:监听 touchmove 事件计算手指距离变化
  • 单指滑动翻页:监听 touchstarttouchend 计算滑动方向
  • 长按选择文本:通过 PDF.js 的文本层实现
  • 夜间模式:使用 CSS filter 反转颜色

性能优化建议

  • 实现分页加载,避免一次性渲染所有页面
  • 使用 Web Worker 处理 PDF 解析
  • 添加加载进度指示器
  • 对低端设备降低默认渲染质量

完整移动端示例组件

import { useState, useRef, useEffect } from 'react';
import { Document, Page } from 'react-pdf';

function MobilePDFViewer({ url }) {
  const [numPages, setNumPages] = useState(0);
  const [pageNumber, setPageNumber] = useState(1);
  const [scale, setScale] = useState(1);
  const startX = useRef(0);

  const handleTouchStart = (e) => {
    startX.current = e.touches[0].clientX;
  };

  const handleTouchEnd = (e) => {
    const endX = e.changedTouches[0].clientX;
    const diffX = startX.current - endX;

    if (Math.abs(diffX) > 50) {
      setPageNumber(prev => {
        const newPage = diffX > 0 ? prev + 1 : prev - 1;
        return Math.max(1, Math.min(numPages, newPage));
      });
    }
  };

  return (
    <div 
      style={{ 
        touchAction: 'none',
        overflow: 'hidden'
      }}
      onTouchStart={handleTouchStart}
      onTouchEnd={handleTouchEnd}
    >
      <Document
        file={url}
        onLoadSuccess={({ numPages }) => setNumPages(numPages)}
      >
        <Page 
          pageNumber={pageNumber} 
          width={window.innerWidth * scale}
        />
      </Document>

      <div style={{
        position: 'fixed',
        bottom: 20,
        left: 0,
        right: 0,
        textAlign: 'center'
      }}>
        <button onClick={() => setScale(s => Math.min(2, s + 0.2))}>+</button>
        <span> {pageNumber}/{numPages} </span>
        <button onClick={() => setScale(s => Math.max(0.5, s - 0.2))}>-</button>
      </div>
    </div>
  );
}

注意事项

react实现移动端pdf

  • 在 iOS 上需要确保 PDF 文件通过 HTTPS 访问
  • 大文件需要实现流式加载
  • 考虑添加离线缓存支持
  • 测试不同移动浏览器的兼容性

以上实现可以根据具体需求进行调整,关键是根据移动端特性优化交互体验。

标签: reactpdf
分享给朋友:

相关文章

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修改…

react如何开发组件

react如何开发组件

React 组件开发基础 React 组件分为函数组件和类组件两种形式。函数组件是现代 React 开发的主流方式,结合 Hooks 可以实现完整功能。 函数组件示例: function Gree…

如何下载react

如何下载react

下载 React 的方法 通过 npm 或 yarn 安装 React 可以通过包管理器 npm 或 yarn 安装。确保已安装 Node.js(包含 npm),然后在项目目录中运行以下命令:…

react如何发音

react如何发音

React的发音 React的正确发音为 /riˈækt/,类似于“ree-akt”。以下是详细说明: 发音分解 第一个音节“Ree”发音类似英文单词“see”中的“ee”音。 第二个音节…

react如何折叠

react如何折叠

在 React 中实现折叠功能 使用 useState 管理折叠状态 通过 useState 定义一个状态变量来控制折叠面板的显示与隐藏。例如: const [isCollapsed, setIsC…

如何监控react性能

如何监控react性能

使用 React Profiler API React 16.5 及以上版本内置了 Profiler API,可直接测量组件渲染时间。通过 <React.Profiler> 包裹目标组件,…