@openinc/parse-server-opendash 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,12 @@
1
+ interface Options {
2
+ /** Number in px */
3
+ width?: number;
4
+ /** Number in px */
5
+ height?: number;
6
+ /** A list of pages to render instead of all of them */
7
+ page_numbers?: number[];
8
+ /** Output as base64 */
9
+ base64?: boolean;
10
+ }
11
+ export declare function convert(pdf: string, conversion_config?: Options): Promise<any[]>;
12
+ export {};
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.convert = void 0;
8
+ // Fork of: https://www.npmjs.com/package/pdf-img-convert
9
+ // node_modules/pdf-img-convert/pdf-img-convert.js
10
+ const node_fetch_1 = __importDefault(require("node-fetch"));
11
+ const strict_1 = __importDefault(require("assert/strict"));
12
+ // import pdfjs from "pdfjs-dist/legacy/build/pdf.js";
13
+ // import Canvas from "canvas";
14
+ // Somehow the import does not work
15
+ const pdfjs = require("pdfjs-dist/legacy/build/pdf.js");
16
+ const Canvas = require("canvas");
17
+ function NodeCanvasFactory() { }
18
+ NodeCanvasFactory.prototype = {
19
+ create: function NodeCanvasFactory_create(width, height) {
20
+ (0, strict_1.default)(width > 0 && height > 0, "Invalid canvas size");
21
+ var canvas = Canvas.createCanvas(width, height);
22
+ var context = canvas.getContext("2d");
23
+ return {
24
+ canvas: canvas,
25
+ context: context,
26
+ };
27
+ },
28
+ reset: function NodeCanvasFactory_reset(canvasAndContext, width, height) {
29
+ (0, strict_1.default)(canvasAndContext.canvas, "Canvas is not specified");
30
+ (0, strict_1.default)(width > 0 && height > 0, "Invalid canvas size");
31
+ canvasAndContext.canvas.width = width;
32
+ canvasAndContext.canvas.height = height;
33
+ },
34
+ destroy: function NodeCanvasFactory_destroy(canvasAndContext) {
35
+ (0, strict_1.default)(canvasAndContext.canvas, "Canvas is not specified");
36
+ // Zeroing the width and height cause Firefox to release graphics
37
+ // resources immediately, which can greatly reduce memory consumption.
38
+ canvasAndContext.canvas.width = 0;
39
+ canvasAndContext.canvas.height = 0;
40
+ canvasAndContext.canvas = null;
41
+ canvasAndContext.context = null;
42
+ },
43
+ };
44
+ async function convert(pdf, conversion_config = {}) {
45
+ // Get the PDF in Uint8Array form
46
+ const resp = await (0, node_fetch_1.default)(pdf);
47
+ const pdfData = new Uint8Array(await resp.arrayBuffer());
48
+ var outputPages = [];
49
+ var loadingTask = pdfjs.getDocument({ data: pdfData, verbosity: 0 });
50
+ var pdfDocument = await loadingTask.promise;
51
+ var canvasFactory = new NodeCanvasFactory();
52
+ if (conversion_config.height <= 0 || conversion_config.width <= 0)
53
+ console.error("Negative viewport dimension given. Defaulting to 100% scale.");
54
+ // If there are page numbers supplied in the conversion config
55
+ if (conversion_config.page_numbers)
56
+ for (let i = 0; i < conversion_config.page_numbers.length; i++) {
57
+ // This just pushes a render of the page to the array
58
+ let currentPage = await doc_render(pdfDocument, conversion_config.page_numbers[i], canvasFactory, conversion_config);
59
+ if (currentPage != null) {
60
+ // This allows for base64 conversion of output images
61
+ if (conversion_config.base64)
62
+ outputPages.push(currentPage.toString("base64"));
63
+ else
64
+ outputPages.push(new Uint8Array(currentPage));
65
+ }
66
+ }
67
+ // Otherwise just loop the whole doc
68
+ else
69
+ for (let i = 1; i <= pdfDocument.numPages; i++) {
70
+ let currentPage = await doc_render(pdfDocument, i, canvasFactory, conversion_config);
71
+ if (currentPage != null) {
72
+ // This allows for base64 conversion of output images
73
+ if (conversion_config.base64)
74
+ outputPages.push(currentPage.toString("base64"));
75
+ else
76
+ outputPages.push(new Uint8Array(currentPage));
77
+ }
78
+ }
79
+ return outputPages;
80
+ } // convert method
81
+ exports.convert = convert;
82
+ async function doc_render(pdfDocument, pageNo, canvasFactory, conversion_config) {
83
+ // Page number sanity check
84
+ if (pageNo < 1 || pageNo > pdfDocument.numPages) {
85
+ console.error("Invalid page number " + pageNo);
86
+ return;
87
+ }
88
+ // Get the page
89
+ let page = await pdfDocument.getPage(pageNo);
90
+ // Create a viewport at 100% scale
91
+ let outputScale = 1.0;
92
+ let viewport = page.getViewport({ scale: outputScale });
93
+ // Scale it up / down dependent on the sizes given in the config (if there
94
+ // are any)
95
+ if (conversion_config.width)
96
+ outputScale = conversion_config.width / viewport.width;
97
+ else if (conversion_config.height)
98
+ outputScale = conversion_config.height / viewport.height;
99
+ if (outputScale != 1 && outputScale > 0)
100
+ viewport = page.getViewport({ scale: outputScale });
101
+ let canvasAndContext = canvasFactory.create(viewport.width, viewport.height);
102
+ let renderContext = {
103
+ canvasContext: canvasAndContext.context,
104
+ viewport: viewport,
105
+ canvasFactory: canvasFactory,
106
+ };
107
+ let renderTask = await page.render(renderContext).promise;
108
+ // Convert the canvas to an image buffer.
109
+ let image = canvasAndContext.canvas.toBuffer();
110
+ return image;
111
+ } // doc_render
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.init = void 0;
4
+ const pdf2img_1 = require("../helper/pdf2img");
4
5
  const __1 = require("..");
5
6
  const types_1 = require("../types");
6
7
  async function init() {
@@ -8,11 +9,51 @@ async function init() {
8
9
  const { object, original, user } = request;
9
10
  await (0, __1.defaultHandler)(request);
10
11
  await (0, __1.defaultAclHandler)(request);
11
- // TODO
12
+ await (0, __1.immutableField)(request, "document");
12
13
  });
13
14
  (0, __1.afterSaveHook)(types_1.Knowledge_Document, async (request) => {
14
15
  const { object, original, user } = request;
15
- // TODO
16
+ const pdfUrl = object.document?.url();
17
+ const previousPdfUrl = original?.document?.url();
18
+ if (pdfUrl !== previousPdfUrl) {
19
+ const previousPages = await new Parse.Query(types_1.Knowledge_DocumentPage)
20
+ .equalTo("document", object)
21
+ .limit(1000000)
22
+ .find({ useMasterKey: true });
23
+ for (const page of previousPages) {
24
+ // page.image.destroy({ useMasterKey: true });
25
+ await page.image.destroy();
26
+ await page.destroy({ useMasterKey: true });
27
+ }
28
+ const images = await (0, pdf2img_1.convert)(pdfUrl, {
29
+ base64: true,
30
+ width: 2000,
31
+ });
32
+ for (let i = 0; i < images.length; i++) {
33
+ const page = i + 1;
34
+ const name = `page-${page}.png`;
35
+ const base64 = images[i];
36
+ const image = new Parse.File(name, { base64 }, "image/png");
37
+ const pageObject = new types_1.Knowledge_DocumentPage({
38
+ document: object,
39
+ page,
40
+ image,
41
+ label: name,
42
+ });
43
+ await pageObject.save(null, { useMasterKey: true });
44
+ }
45
+ }
46
+ });
47
+ (0, __1.beforeDeleteHook)(types_1.Knowledge_Document, async (request) => {
48
+ const { object, original, user } = request;
49
+ const previousPages = await new Parse.Query(types_1.Knowledge_DocumentPage)
50
+ .equalTo("document", object)
51
+ .limit(1000000)
52
+ .find({ useMasterKey: true });
53
+ for (const page of previousPages) {
54
+ await page.image.destroy();
55
+ await page.destroy({ useMasterKey: true });
56
+ }
16
57
  });
17
58
  }
18
59
  exports.init = init;
@@ -14,5 +14,9 @@ async function init() {
14
14
  const { object, original, user } = request;
15
15
  // TODO
16
16
  });
17
+ (0, __1.beforeDeleteHook)(types_1.Knowledge_DocumentPage, async (request) => {
18
+ const { object, original, user } = request;
19
+ await object.image.destroy();
20
+ });
17
21
  }
18
22
  exports.init = init;
package/dist/index.js CHANGED
@@ -18,8 +18,6 @@ async function init(cfg = {}) {
18
18
  console.log(`[${pkg.name}] init (v${pkg.version})`);
19
19
  }
20
20
  catch (error) { }
21
- const config = await Parse.Config.get();
22
- exports.PREFIX = config.get("OPENDASH_CLASS_PREFIX") || exports.PREFIX;
23
21
  const schemaConfig = await (0, parse_server_schema_1.loadConfig)(cfg.configPath);
24
22
  try {
25
23
  await (0, parse_server_schema_1.up)(schemaConfig, (0, path_1.resolve)(__dirname, "../schema"), {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openinc/parse-server-opendash",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "description": "Parse Server Cloud Code for open.DASH",
5
5
  "keywords": [
6
6
  "parse",
@@ -23,6 +23,7 @@
23
23
  "fast-deep-equal": "^3.0.0",
24
24
  "jsonwebtoken": "^8.0.0",
25
25
  "node-fetch": "^2.0.0",
26
+ "pdf-img-convert": "1.0.6",
26
27
  "web-push": "^3.0.0"
27
28
  },
28
29
  "devDependencies": {