【问题标题】:React and PDF.js changing page doesn't work when I render whole document当我渲染整个文档时,React 和 PDF.js 更改页面不起作用
【发布时间】:2019-05-23 14:42:29
【问题描述】:

我正在尝试使用 PDF.js 库在 React 中的 Web 应用程序中呈现 PDF 文件。那里有很多不同的信息,即使在官方 git 中也是如此,所以我坚持尝试渲染整个 pdf 文档并且还具有转到特定页面的功能。这就是我现在所拥有的:

import * as pdfWorker from 'pdfjs-dist/build/pdf.worker'
import PdfJsLib from 'pdfjs-dist';
import 'pdfjs-dist/web/pdf_viewer.css';
import * as pdfjsViewer from 'pdfjs-dist/web/pdf_viewer';

...

componentDidMount() {
        let container = this.viewerContainer.current;
        let viewer = this.viewer.current;

        PdfJsLib.GlobalWorkerOptions.workerSrc = pdfWorker;
        PdfJsLib.getDocument(this.props.file).then((pdf) => {

            this.setState({numPages: pdf.numPages});

            this.pdfLinkService = new pdfjsViewer.PDFLinkService();

            this.pdfFindController = new pdfjsViewer.PDFFindController({
                linkService: this.pdfLinkService,
            });

            this.pdfViewer = new pdfjsViewer.PDFViewer({
                 container,
                 viewer,
                 linkService: this.pdfLinkService,
                 findController: this.pdfFindController
            });
            this.pdfLinkService.setViewer(this.pdfViewer);

            this.pdfViewer.setDocument(pdf);
            this.pdfLinkService.setDocument(pdf, null);

            this.pdfViewer.onePageRendered.then(() => {
                 pdf.getOutline().then((outline) => {
                     this.outline = outline || null;

                     if (!outline) {
                        return;
                     }
                     this.setState({bookmarkItems: outline});
            });
       });
   });
}



...

onNextPageClick = () => {
    if(this.state.numPages > this.state.pageNumber) {
        this.setState({pageNumber: this.state.pageNumber + 1});
        this.setState({pageNumberInput: this.state.pageNumber + 1});

        this.pdfViewer.currentPageNumber++;
    }
}
onPreviousPageClick = () => {
    if(this.state.pageNumber > 1) {
        this.setState({pageNumber: this.state.pageNumber - 1});
        this.setState({pageNumberInput: this.state.pageNumber - 1});

        this.pdfViewer.currentPageNumber--;
    }
}

...

render() {
    return(

        ...

        <div className="splitToolbarButton hiddenSmallView">
            <button className="toolbarButton pageUp" title="Previous Page" id="previous" tabIndex="13" data-l10n-id="previous" onClick={this.onPreviousPageClick}>
            <span data-l10n-id="previous_label">Previous</span>
            </button>
         <div className="splitToolbarButtonSeparator" />
            <button className="toolbarButton pageDown" title="Next Page" id="next" tabIndex="14" data-l10n-id="next" onClick={this.onNextPageClick}>
             <span data-l10n-id="next_label">Next</span>
            </button>
        </div>

         ...

        <div id="viewerContainer" ref={this.viewerContainer}>
            <div id="viewer" ref={this.viewer} className="pdfViewer" />
        </div>
    )
}

因此,使用所有这些代码,我能够完整地呈现我的 pdf 文档,但是我在跳转到特定页面时遇到了问题。奇怪的是,只有当我使用new pdfjsViewer.PDFViewer 渲染整个文档时,我才能跳转到页面,但是当我使用new pdfjsViewer.PDFSinglePageViewer 仅渲染一页时,我通常可以跳转到页面。那么有谁知道我错过了什么,这让我头痛了好几个星期?谢谢。

【问题讨论】:

    标签: javascript reactjs pdf pdfjs


    【解决方案1】:

    我找到了问题所在。我不知道 ID 为 viewerContainerdiv 元素必须具有 position: absolute 以便 scrollIntoView 实际执行某些操作。 div 元素 mainContainer 也是如此。当然现在它是有道理的,但我一直在寻找错误的地方,认为它必须与 React 或 PDFLinkService 之类的服务做一些事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 2013-08-06
      • 2018-01-03
      • 2018-04-10
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多