@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
|
-
|
|
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
|
-
|
|
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.
|
|
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": {
|