当我呈现整个文档时,React 和 PDF.js 更改页面不起作用
React and PDF.js changing page doesn't work when I render whole document
我正在尝试使用 PDF.js 库在我的 React 网络应用程序中呈现 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
只渲染一页时我通常可以跳转到页面。那么有人知道我错过了什么吗,这让我头痛了好几个星期了?谢谢。
我找到了我的问题所在。我不知道 ID 为 viewerContainer
的 div
元素必须有 position: absolute
,这样 scrollIntoView
才能实际执行某些操作。 div
元素 mainContainer
也是如此。当然现在它是有道理的,但我一直在看错误的地方,认为它必须用 React 或像 PDFLinkService
.
这样的服务做一些事情。
我正在尝试使用 PDF.js 库在我的 React 网络应用程序中呈现 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
只渲染一页时我通常可以跳转到页面。那么有人知道我错过了什么吗,这让我头痛了好几个星期了?谢谢。
我找到了我的问题所在。我不知道 ID 为 viewerContainer
的 div
元素必须有 position: absolute
,这样 scrollIntoView
才能实际执行某些操作。 div
元素 mainContainer
也是如此。当然现在它是有道理的,但我一直在看错误的地方,认为它必须用 React 或像 PDFLinkService
.