import { observer } from "mobx-react"; import React = require("react"); import { observable, action, runInAction } from "mobx"; import { RouteStore } from "../../../server/RouteStore"; import * as Pdfjs from "pdfjs-dist"; import { Opt } from "../../../new_fields/Doc"; import "./PDFViewer.scss"; interface IPDFViewerProps { url: string; } @observer export class PDFViewer extends React.Component { @observable _pdf: Opt; @action componentDidMount() { // const pdfUrl = window.origin + RouteStore.corsProxy + "/https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf"; const pdfUrl = this.props.url; let promise = Pdfjs.getDocument(pdfUrl).promise; promise.then((pdf: Pdfjs.PDFDocumentProxy) => { runInAction(() => this._pdf = pdf); }); } render() { console.log("PDFVIEWER"); console.log(this._pdf); return (
); } } interface IViewerProps { pdf: Opt; } class Viewer extends React.Component { render() { console.log("VIEWER"); let numPages = this.props.pdf ? this.props.pdf.numPages : 0; console.log(numPages); return (
{Array.from(Array(numPages).keys()).map((i) => ( ))} }
); } } interface IPageProps { pdf: Opt; name: string; numPages: number; page: number; } @observer class Page extends React.Component { @observable _state: string = "N/A"; @observable _width: number = 0; @observable _height: number = 0; @observable _page: Opt; canvas: React.RefObject; textLayer: React.RefObject; @observable _currPage: number = this.props.page + 1; constructor(props: IPageProps) { super(props); this.canvas = React.createRef(); this.textLayer = React.createRef(); } componentDidMount() { console.log(this.props.pdf); if (this.props.pdf) { this.update(this.props.pdf); } } componentDidUpdate() { if (this.props.pdf) { this.update(this.props.pdf); } } private update = (pdf: Pdfjs.PDFDocumentProxy) => { if (pdf) { this.loadPage(pdf); } else { this._state = "loading"; } } private loadPage = (pdf: Pdfjs.PDFDocumentProxy) => { if (this._state === "rendering" || this._page) return; pdf.getPage(this._currPage).then( (page: Pdfjs.PDFPageProxy) => { console.log("PAGE"); console.log(page); this._state = "rendering"; this.renderPage(page); } ) } @action private renderPage = (page: Pdfjs.PDFPageProxy) => { let scale = 1; let viewport = page.getViewport(scale); let canvas = this.canvas.current; if (canvas) { let context = canvas.getContext("2d"); canvas.width = viewport.width; this._width = viewport.width; canvas.height = viewport.height; this._height = viewport.height; if (context) { page.render({ canvasContext: context, viewport: viewport }); page.getTextContent().then((res: Pdfjs.TextContent) => { //@ts-ignore let textLayer = Pdfjs.renderTextLayer({ textContent: res, container: this.textLayer.current, viewport: viewport }); // textLayer._render(); this._state = "rendered"; }); this._page = page; } } } @action prevPage = (e: React.MouseEvent) => { if (this._currPage > 2 && this._state !== "rendering") { this._currPage = Math.max(this._currPage - 1, 1); this._page = undefined; this.loadPage(this.props.pdf!); this._state = "rendering"; } } @action nextPage = (e: React.MouseEvent) => { if (this._currPage < this.props.numPages - 1 && this._state !== "rendering") { this._currPage = Math.min(this._currPage + 1, this.props.numPages) this._page = undefined; this.loadPage(this.props.pdf!); this._state = "rendering"; } } render() { return (
{/*
<
>
*/}
); } }