aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package.json1
-rw-r--r--src/client/views/nodes/PDFBox.tsx2
-rw-r--r--src/client/views/pdf/PDFViewer.tsx47
-rw-r--r--src/server/index.ts122
4 files changed, 122 insertions, 50 deletions
diff --git a/package.json b/package.json
index 0fe26f16d..7fd6c4ba9 100644
--- a/package.json
+++ b/package.json
@@ -142,6 +142,7 @@
"passport": "^0.4.0",
"passport-local": "^1.0.0",
"pdfjs-dist": "^2.0.943",
+ "probe-image-size": "^4.0.0",
"prosemirror-commands": "^1.0.7",
"prosemirror-example-setup": "^1.0.1",
"prosemirror-history": "^1.0.4",
diff --git a/src/client/views/nodes/PDFBox.tsx b/src/client/views/nodes/PDFBox.tsx
index 243982a3b..655c12ab3 100644
--- a/src/client/views/nodes/PDFBox.tsx
+++ b/src/client/views/nodes/PDFBox.tsx
@@ -111,7 +111,7 @@ export class PDFBox extends DocComponent<FieldViewProps, PdfDocument>(PdfDocumen
}}
ref={this.createRef}
onWheel={(e: React.WheelEvent) => e.stopPropagation()} className={classname}>
- <PDFViewer url={pdfUrl.url.href} loaded={this.loaded} scrollY={this._scrollY} parent={this} />
+ <PDFViewer url={pdfUrl.url.pathname} loaded={this.loaded} scrollY={this._scrollY} parent={this} />
{/* <div style={{ width: "100px", height: "300px" }}></div> */}
</div>
);
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 55d15893a..75c298f55 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -20,6 +20,9 @@ import { emptyFunction, returnTrue, returnFalse } from "../../../Utils";
import { DocumentView } from "../nodes/DocumentView";
import { DragManager } from "../../util/DragManager";
import { Dictionary } from "typescript-collections";
+import * as rp from "request-promise";
+import { restProperty } from "babel-types";
+import { DocServer } from "../../DocServer";
export const scale = 2;
interface IPDFViewerProps {
@@ -137,7 +140,8 @@ class Viewer extends React.Component<IViewerProps> {
}
setTimeout(() => {
- this.renderPages(this.startIndex, this.endIndex, true);
+ // this.renderPages(this.startIndex, this.endIndex, true);
+ this.saveThumbnail();
}, 1000);
}
@@ -204,17 +208,19 @@ class Viewer extends React.Component<IViewerProps> {
}
@action
- saveThumbnail = () => {
+ saveThumbnail = async () => {
// file address of the pdf
const address: string = this.props.url;
for (let i = 0; i < this._visibleElements.length; i++) {
if (this._isPage[i]) {
// change the address to be the file address of the PNG version of each page
- let thisAddress = `${address.substring(0, address.length - ".pdf".length)}-${i + 1}.PNG`;
- let nWidth = this._pageSizes[i].width;
- let nHeight = this._pageSizes[i].height;
+ let res = JSON.parse(await rp.get(DocServer.prepend(`/thumbnail${address.substring("files/".length, address.length - ".pdf".length)}-${i + 1}.PNG`)));
+ let thisAddress = res.path;
+ let nWidth = parseInt(res.width);
+ let nHeight = parseInt(res.height);
// replace page with image
- this._visibleElements[i] = <img key={thisAddress} style={{ width: `${nWidth}px`, height: `${nHeight}px` }} src={thisAddress} />;
+ runInAction(() =>
+ this._visibleElements[i] = <img key={thisAddress} style={{ width: `${nWidth * scale}px`, height: `${nHeight * scale}px` }} src={thisAddress} />);
}
}
}
@@ -236,6 +242,7 @@ class Viewer extends React.Component<IViewerProps> {
if (this.scrollY !== prevProps.scrollY || this._pdf !== this.props.pdf) {
this._pdf = this.props.pdf;
// render pages if the scorll position changes
+ console.log(`START: ${this.startIndex}, END: ${this.endIndex}`);
this.renderPages(this.startIndex, this.endIndex);
}
}
@@ -269,7 +276,7 @@ class Viewer extends React.Component<IViewerProps> {
// this is only for an initial render to get all of the pages rendered
if (this._visibleElements.length !== numPages) {
- let divs = Array.from(Array(numPages).keys()).map(i => (
+ let divs = Array.from(Array(numPages).keys()).map(i => i < 5 ? (
<Page
pdf={this.props.pdf}
page={i}
@@ -285,8 +292,10 @@ class Viewer extends React.Component<IViewerProps> {
makeAnnotationDocuments={this.makeAnnotationDocument}
receiveAnnotations={this.sendAnnotations}
{...this.props} />
- ));
- let arr = Array.from(Array(numPages).keys()).map(() => false);
+ ) :
+ (<div key={`pdfviewer-placeholder-${i}`} className="pdfviewer-placeholder" style={{ width: this._pageSizes[i] ? this._pageSizes[i].width : 612 * scale, height: this._pageSizes[i] ? this._pageSizes[i].height : 792 * scale }} />)
+ );
+ let arr = Array.from(Array(numPages).keys()).map(i => i < 5);
this._visibleElements.push(...divs);
this._isPage.push(...arr);
}
@@ -378,16 +387,16 @@ class Viewer extends React.Component<IViewerProps> {
// get the page index that the vertical offset passed in is on
getIndex = (vOffset: number) => {
- if (this._loaded) {
- let numPages = this.props.pdf ? this.props.pdf.numPages : 0;
- let index = 0;
- let currOffset = vOffset;
- while (index < numPages && currOffset - this._pageSizes[index].height > 0) {
- currOffset -= this._pageSizes[index].height;
- index++;
- }
- return index;
- }
+ // if (this._loaded) {
+ let numPages = this.props.pdf ? this.props.pdf.numPages : 0;
+ let index = 0;
+ let currOffset = vOffset;
+ while (index < numPages && currOffset - (this._pageSizes[index] ? this._pageSizes[index].height : 792 * scale) > 0) {
+ currOffset -= this._pageSizes[index].height;
+ index++;
+ }
+ return index;
+ // }
return 0;
}
diff --git a/src/server/index.ts b/src/server/index.ts
index e22794df1..3e51eb4ff 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -38,8 +38,10 @@ import c = require("crypto");
import { Search } from './Search';
import { debug } from 'util';
import _ = require('lodash');
+import { Response } from 'express-serve-static-core';
const MongoStore = require('connect-mongo')(session);
const mongoose = require('mongoose');
+const probe = require("probe-image-size");
const download = (url: string, dest: fs.PathLike) => request.get(url).pipe(fs.createWriteStream(dest));
@@ -134,6 +136,66 @@ app.get("/search", async (req, res) => {
res.send(results);
});
+app.get("/thumbnail/:filename", (req, res) => {
+ let filename = req.params.filename;
+ let noExt = filename.substring(0, filename.length - ".png".length);
+ let pagenumber = parseInt(noExt[noExt.length - 1]);
+ fs.exists(uploadDir + filename, (exists: boolean) => {
+ console.log(`${uploadDir + filename} ${exists ? "exists" : "does not exist"}`);
+ if (exists) {
+ let input = fs.createReadStream(uploadDir + filename);
+ probe(input, (err: any, result: any) => {
+ if (err) {
+ console.log(err);
+ return;
+ }
+ console.log(result.width);
+ console.log(result.height);
+ res.send({ path: "/files/" + filename, width: result.width, height: result.height });
+ });
+ }
+ else {
+ LoadPage(uploadDir + filename.substring(0, filename.length - "-n.png".length) + ".pdf", pagenumber, res);
+ }
+ });
+});
+
+function LoadPage(file: string, pageNumber: number, res: Response) {
+ console.log(file);
+ Pdfjs.getDocument(file).promise
+ .then((pdf: Pdfjs.PDFDocumentProxy) => {
+ let factory = new NodeCanvasFactory();
+ console.log(pageNumber);
+ pdf.getPage(pageNumber).then((page: Pdfjs.PDFPageProxy) => {
+ console.log("reading " + page);
+ let viewport = page.getViewport(1);
+ let canvasAndContext = factory.create(viewport.width, viewport.height);
+ let renderContext = {
+ canvasContext: canvasAndContext.context,
+ viewport: viewport,
+ canvasFactory: factory
+ }
+ console.log("read " + pageNumber);
+
+ page.render(renderContext).promise
+ .then(() => {
+ console.log("saving " + pageNumber);
+ let stream = canvasAndContext.canvas.createPNGStream();
+ let pngFile = `${file.substring(0, file.length - ".pdf".length)}-${pageNumber}.PNG`;
+ let out = fs.createWriteStream(pngFile);
+ stream.pipe(out);
+ out.on("finish", () => {
+ console.log(`Success! Saved to ${pngFile}`);
+ let name = path.basename(pngFile);
+ res.send({ path: "/files/" + name, width: viewport.width, height: viewport.height });
+ });
+ }, (reason: string) => {
+ console.error(reason + ` ${pageNumber}`);
+ });
+ });
+ });
+}
+
// anyone attempting to navigate to localhost at this port will
// first have to login
addSecureRoute(
@@ -229,36 +291,36 @@ app.post(
isImage = true;
}
else if (pdfTypes.includes(ext)) {
- Pdfjs.getDocument(uploadDir + file).promise
- .then((pdf: Pdfjs.PDFDocumentProxy) => {
- let numPages = pdf.numPages;
- let factory = new NodeCanvasFactory();
- for (let pageNum = 0; pageNum < numPages; pageNum++) {
- console.log(pageNum);
- pdf.getPage(pageNum + 1).then((page: Pdfjs.PDFPageProxy) => {
- console.log("reading " + pageNum);
- let viewport = page.getViewport(1);
- let canvasAndContext = factory.create(viewport.width, viewport.height);
- let renderContext = {
- canvasContext: canvasAndContext.context,
- viewport: viewport,
- canvasFactory: factory
- }
- console.log("read " + pageNum);
-
- page.render(renderContext).promise
- .then(() => {
- console.log("saving " + pageNum);
- let stream = canvasAndContext.canvas.createPNGStream();
- let out = fs.createWriteStream(uploadDir + file.substring(0, file.length - ext.length) + `-${pageNum + 1}.PNG`);
- stream.pipe(out);
- out.on("finish", () => console.log(`Success! Saved to ${uploadDir + file.substring(0, file.length - ext.length) + `-${pageNum + 1}.PNG`}`));
- }, (reason: string) => {
- console.error(reason + ` ${pageNum}`);
- });
- });
- }
- });
+ // Pdfjs.getDocument(uploadDir + file).promise
+ // .then((pdf: Pdfjs.PDFDocumentProxy) => {
+ // let numPages = pdf.numPages;
+ // let factory = new NodeCanvasFactory();
+ // for (let pageNum = 0; pageNum < numPages; pageNum++) {
+ // console.log(pageNum);
+ // pdf.getPage(pageNum + 1).then((page: Pdfjs.PDFPageProxy) => {
+ // console.log("reading " + pageNum);
+ // let viewport = page.getViewport(1);
+ // let canvasAndContext = factory.create(viewport.width, viewport.height);
+ // let renderContext = {
+ // canvasContext: canvasAndContext.context,
+ // viewport: viewport,
+ // canvasFactory: factory
+ // }
+ // console.log("read " + pageNum);
+
+ // page.render(renderContext).promise
+ // .then(() => {
+ // console.log("saving " + pageNum);
+ // let stream = canvasAndContext.canvas.createPNGStream();
+ // let out = fs.createWriteStream(uploadDir + file.substring(0, file.length - ext.length) + `-${pageNum + 1}.PNG`);
+ // stream.pipe(out);
+ // out.on("finish", () => console.log(`Success! Saved to ${uploadDir + file.substring(0, file.length - ext.length) + `-${pageNum + 1}.PNG`}`));
+ // }, (reason: string) => {
+ // console.error(reason + ` ${pageNum}`);
+ // });
+ // });
+ // }
+ // });
}
if (isImage) {
resizers.forEach(resizer => {