相关文章推荐
忧郁的海龟  ·  JS 实现 ...·  1 月前    · 
活泼的柚子  ·  blob转file ...·  1 月前    · 
直爽的烤红薯  ·  java ...·  1 月前    · 
重情义的牛肉面  ·  Ansible(12) ...·  1 年前    · 

项目需求 前端上传一个pdf文件后, 需要预览此pdf文件, 通过一系列调后端接口, 拿到一个存放该pdf的链接, 根据此链接打开pdf文件 如何操作???

查阅资料得知有个 react-pdf

首先需要安装react-pdf包 npm install react-pdf --save

组件引用及使用代码

import React, { Component } from 'react';
import { Document, Page } from './pdf-modules/react-pdf/entry.webpack';
// import { pdfjs, Document, Page } from 'react-pdf'
// pdfjs.GlobalWorkerOptions.workerSrc = `pdfjs/build/pdf.worker.js`;
import { Modal, Pagination, Button, notification } from 'antd';
import 'react-pdf/dist/Page/AnnotationLayer.css' // 加入这个css可以显示pdf中的批注以及连接
export default class ViewPDFModal extends Component {
  state = {
    numPages: 0,
    pageNumber: 1,
  onDocumentLoadSuccess = ({ numPages }) => {
    this.setState({ numPages });
  onLoadError = (error) => {
    notification.error({
      message: '文件损坏无法预览',
    //console.log('--------onLoadError-------', error);
  onSourceError = (error) => {
    //console.log('--------onSourceError-------', error);
  onChange = (page) => {
    this.setState({
      pageNumber: page,
  render () {
    const { pageNumber, numPages } = this.state;
    const { name } = this.props;
    const fileType = name && name.substring(name.lastIndexOf('.') + 1);
    return (
      <Modal
        closable={false}
        visible={this.props.visible}
        onCancel={this.props.onCancel}
        width={1000}
        footer={(
            <Button style={{ visibility: 'middle' }} onClick={this.props.onCancel}>
            </Button>
            (fileType === 'jpg' || fileType === 'png' || fileType === 'jpeg')
                <img src={this.props.url} width={600} />
                {' '}
          {fileType === 'pdf'
              <Document
                options={{
                  cMapUrl: 'pdfjs/cmaps/',
                  cMapPacked: true,
                file={this.props.url} // 预览pdf的路径
                onLoadSuccess={this.onDocumentLoadSuccess}
                onSourceError={this.onSourceError}
                onLoadError={this.onLoadError}
                scale={0.8}
                error="文件损坏无法预览"
                loading="加载中......"
                <div className={'modal-pdf-layout'}>
                  <Page pageNumber={pageNumber} />  // 分页
                <div style={{ textAlign: 'right', visibility: 'middle', marginBottom: 30 }}>
                  <Pagination
                    style={{ visibility: 'middle' }}
                    defaultCurrent={pageNumber}
                    defaultPageSize={1}
                    total={numPages}
                    onChange={this.onChange}
              </Document>
      </Modal>

翻页的话动态修改pageNumber就行

如果想要一屏展示 Page改写一下

new Array(numPages).fill('').map((item, index) => { return <Page key={index} pageNumber={index} />

我在上面代码引用 import { Document, Page } from './pdf-modules/react-pdf/entry.webpack'; 其实和 import { pdfjs, Document, Page } from 'react-pdf' 是一样的 为什么我本地改写了呢?
是因为电子签章不出来!
所以我在本地修改了一段代码 :

if (data.fieldType === "Sig") {
      data.fieldValue = null;
      this.setFlags(AnnotationFlag.HIDDEN);

注释掉! 才可以显示电子签章!
在这里插入图片描述

如果提示文件损坏无法预览 也有可能是后端返回的url不对, 记得在浏览器里面先下载看是否可以查看

项目需求 前端上传一个pdf文件后, 需要预览此pdf文件, 通过一系列调后端接口, 拿到一个存放该pdf的链接, 根据此链接打开pdf文件 如何操作???查阅资料得知有个react-pdf首先需要安装react-pdf包 npm install react-pdf --save组件引用及使用代码import React, { Component } from 'react';import { Document, Page } from './pdf-modules/react-pdf/entry 此包用于显示现有的 PDF。 如果您希望使用 React 创建 PDF,您可能正在寻找 @react-pdf/renderer。 tl;dr 通过执行 npm install react-pdf 或 yarn add react-pdf 进行安装。 通过添加 import { Document } from 'react-pdf' 来导入。 通过添加使用 文件可以是 URL、base64 内容、Uint8Array 等。 里面的组件 渲染页面。 演示 在示例目录中可以找到一个最小的演示页面。 在线演示也可用! 在继续之前 React-PDF 正在不断开发中。 本文档是为 React-PDF 5.x 分支编写的。 如果您想查看其他版本的 React-PDF 的文档,请使用 GitHub 页面顶部的下拉菜单切换到适当的标签。 以下是每个分支最新文档的快速链接: v4.x v3.x v2.x v1.x 入门兼容性 React 要使用最新版本的 React-PDF,您的项目需要使用 Re 在下载后可能会遇到以下报错, This dependency was not found: worker-loader!pdfjs-dist/build/pdf.worker.js in......; 这时候直接npm install -g worker-loader 即可解决上述问题。 2、项目中引用 import PDFJS from 'pdfjs-dist'; import PropTypes from 'prop-types'; 4. 显示印章 客户在浏览器中使用开源PDF.JS插件预览签署后的PDF文件时会遇到无法显示电子签章的情况,这是因为PDF.JS因无法进行校验电子签名故而默认隐藏了电子签章。 如果需要显示电子签章则需要在中找到以下代码并进行注释 或者某些版本的PDF.JS需要在pdf.worker.js中找到如下代码并进行注释 最后看下效果图...... 开始需求的时候我使用的是iframe标签去实现的,如下代码,因为返回来的是一个文件对象,需要使用Blob实例化,上面是官网的blob资料,这里v是一个Blob数据,然后使用createObjectUrl将blob转为服务器上的url地址,然后展示即可 const res: any = await fetch(`${selected_content?.doc_type}`); res.blob().then(
react 显示pdfIt’s pretty easy to embed a PDF file into your website, but this might give your users more access than you would like. 将PDF文件嵌入到您的网站中非常容易,但这可能会使您的用户获得比您想要的更多的访问权限。 Maybe you want to show ...
你可以使用pdf-lib库来在React中处理PDF文件。首先,你需要在你的React项目中安装pdf-lib库。然后,你可以使用以下代码来读取一个PDF文件: import { PDFDocument } from 'pdf-lib'; const url = 'https://example.com/my-pdf-file.pdf'; const existingPdfBytes = await fetch(url).then(res => res.arrayBuffer()); const pdfDoc = await PDFDocument.load(existingPdfBytes); 接下来,你可以使用pdf-lib库提供的各种方法来编辑和处理PDF文件。例如,你可以使用以下代码来添加一个新页面: const { width, height } = pdfDoc.getPage().getSize(); const page = pdfDoc.addPage([width, height]); page.drawText('Hello World!', { x: 5, y: height / 2 + 300, size: 50, 最后,你可以使用以下代码将PDF文件保存到本地或上传到服务器: const pdfBytes = await pdfDoc.save(); // 保存到本地 const blob = new Blob([pdfBytes], { type: 'application/pdf' }); saveAs(blob, 'my-edited-pdf-file.pdf'); // 上传到服务器 const formData = new FormData(); formData.append('pdfFile', new Blob([pdfBytes], { type: 'application/pdf' }), 'my-edited-pdf-file.pdf'); const response = await fetch('https://example.com/upload-pdf-file', { method: 'POST', body: formData, 希望这可以帮助你在React中使用pdf-lib库处理PDF文件