aboutsummaryrefslogtreecommitdiff
path: root/src/server/ApiManagers/PDFManager.ts
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2023-12-21 14:55:48 -0500
committerbobzel <zzzman@gmail.com>2023-12-21 14:55:48 -0500
commit1caba64ee0f32ee8af79263cd4ef2a8bc5d5146e (patch)
tree0fa0e957d1f342fdc6ed4a4b43f5dddfddb1298a /src/server/ApiManagers/PDFManager.ts
parent02eb7da95df283606d4275a22d9451cef371c3b5 (diff)
parent2691b951d96f2ce7652acbea9e340b61737b3b57 (diff)
Merge branch 'moreUpgrading' into dataViz-annotations
Diffstat (limited to 'src/server/ApiManagers/PDFManager.ts')
-rw-r--r--src/server/ApiManagers/PDFManager.ts116
1 files changed, 0 insertions, 116 deletions
diff --git a/src/server/ApiManagers/PDFManager.ts b/src/server/ApiManagers/PDFManager.ts
deleted file mode 100644
index e419d3ac4..000000000
--- a/src/server/ApiManagers/PDFManager.ts
+++ /dev/null
@@ -1,116 +0,0 @@
-import ApiManager, { Registration } from "./ApiManager";
-import { Method } from "../RouteManager";
-import RouteSubscriber from "../RouteSubscriber";
-import { existsSync, createReadStream, createWriteStream } from "fs";
-import * as Pdfjs from 'pdfjs-dist/legacy/build/pdf';
-import { createCanvas } from "canvas";
-const imageSize = require("probe-image-size");
-import * as express from "express";
-import * as path from "path";
-import { Directory, serverPathToFile, clientPathToFile, pathToDirectory } from "./UploadManager";
-import { red } from "colors";
-import { resolve } from "path";
-
-export default class PDFManager extends ApiManager {
-
- protected initialize(register: Registration): void {
-
- register({
- method: Method.POST,
- subscription: new RouteSubscriber("thumbnail"),
- secureHandler: async ({ req, res }) => {
- const { coreFilename, pageNum, subtree } = req.body;
- return getOrCreateThumbnail(coreFilename, pageNum, res, subtree);
- }
- });
-
- }
-
-}
-
-async function getOrCreateThumbnail(coreFilename: string, pageNum: number, res: express.Response, subtree?: string): Promise<void> {
- const resolved = `${coreFilename}-${pageNum}.png`;
- return new Promise<void>(async resolve => {
- const path = serverPathToFile(Directory.pdf_thumbnails, resolved);
- if (existsSync(path)) {
- const existingThumbnail = createReadStream(path);
- const { err, viewport } = await new Promise<any>(resolve => {
- imageSize(existingThumbnail, (err: any, viewport: any) => resolve({ err, viewport }));
- });
- if (err) {
- console.log(red(`In PDF thumbnail response, unable to determine dimensions of ${resolved}:`));
- console.log(err);
- return;
- }
- dispatchThumbnail(res, viewport, resolved);
- } else {
- await CreateThumbnail(coreFilename, pageNum, res, subtree);
- }
- resolve();
- });
-}
-
-async function CreateThumbnail(coreFilename: string, pageNum: number, res: express.Response, subtree?: string) {
- const part1 = subtree ?? "";
- const filename = `${part1}${coreFilename}.pdf`;
- const sourcePath = resolve(pathToDirectory(Directory.pdfs), filename);
- const documentProxy = await Pdfjs.getDocument(sourcePath).promise;
- const factory = new NodeCanvasFactory();
- const page = await documentProxy.getPage(pageNum);
- const viewport = page.getViewport({ scale: 1, rotation: 0, dontFlip: false });
- const { canvas, context } = factory.create(viewport.width, viewport.height);
- const renderContext = {
- canvasContext: context,
- canvasFactory: factory,
- viewport
- };
- await page.render(renderContext).promise;
- const pngStream = canvas.createPNGStream();
- const resolved = `${coreFilename}-${pageNum}.png`;
- const pngFile = serverPathToFile(Directory.pdf_thumbnails, resolved);
- const out = createWriteStream(pngFile);
- pngStream.pipe(out);
- return new Promise<void>((resolve, reject) => {
- out.on("finish", () => {
- dispatchThumbnail(res, viewport, resolved);
- resolve();
- });
- out.on("error", error => {
- console.log(red(`In PDF thumbnail creation, encountered the following error when piping ${pngFile}:`));
- console.log(error);
- reject();
- });
- });
-}
-
-function dispatchThumbnail(res: express.Response, { width, height }: Pdfjs.PageViewport, thumbnailName: string) {
- res.send({
- path: clientPathToFile(Directory.pdf_thumbnails, thumbnailName),
- width,
- height
- });
-}
-
-class NodeCanvasFactory {
-
- create = (width: number, height: number) => {
- const canvas = createCanvas(width, height);
- const context = canvas.getContext('2d');
- return {
- canvas,
- context
- };
- }
-
- reset = (canvasAndContext: any, width: number, height: number) => {
- canvasAndContext.canvas.width = width;
- canvasAndContext.canvas.height = height;
- }
-
- destroy = (canvasAndContext: any) => {
- canvasAndContext.canvas.width = 0;
- canvasAndContext.canvas.height = 0;
- canvasAndContext.canvas = null;
- canvasAndContext.context = null;
- }
-}