Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/core/config/Categories.json
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,8 @@
"Hex Density chart",
"Scatter chart",
"Series chart",
"Heatmap chart"
"Heatmap chart",
"Render PDF"
]
},
{
Expand Down
100 changes: 100 additions & 0 deletions src/core/operations/RenderPDF.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/**
* @author Shailendra [singhshailendra.in]
* @copyright Crown Copyright 2017
* @license Apache-2.0
*/

import { fromBase64, toBase64 } from "../lib/Base64.mjs";
import Operation from "../Operation.mjs";
import OperationError from "../errors/OperationError.mjs";
import Utils from "../Utils.mjs";

/**
* Render PDF operation
*/
class RenderPDF extends Operation {

/**
* RenderPDF constructor
*/
constructor() {
super();

this.name = "Render PDF";
this.module = "File";
this.description = "Displays the input as a PDF preview. Supports Raw and Base64 input formats.";
this.inputType = "string";
this.outputType = "byteArray";
this.presentType = "html";
this.args = [
{
"name": "Input format",
"type": "option",
"value": ["Base64", "Raw"],
}
];
this.checks = [
{
pattern: "^%PDF-",
flags: "",
args: ["Raw"],
useful: true,
output: {
mime: "application/pdf"
}
}
];
}

/**
* @param {string} input
* @param {Object[]} args
* @returns {byteArray}
*/
run(input, args) {
const inputFormat = args[0];

if (!input.length) return [];

// Convert input to raw bytes
switch (inputFormat) {
case "Base64":
input = fromBase64(input, undefined, "byteArray");
break;
case "Raw":
default:
input = Utils.strToByteArray(input);
break;
}

// Check PDF signature
if (
input[0] !== 0x25 || // %
input[1] !== 0x50 || // P
input[2] !== 0x44 || // D
input[3] !== 0x46 // F
) {
throw new OperationError("Input does not appear to be a PDF file.");
}

return input;
}

/**
* Displays the PDF using HTML for web apps.
*
* @param {byteArray} data
* @returns {html}
*/
async present(data) {
if (!data.length) return "";

const base64 = toBase64(data);
const dataURI = "data:application/pdf;base64," + base64;

return `<iframe src="${dataURI}" style="width:100%;height:100%;border:1px solid #ccc;"></iframe>`;
}

}

export default RenderPDF;
2 changes: 1 addition & 1 deletion tests/node/tests/nodeApi.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ TestRegister.addApiTests([

it("chef.help: returns multiple results", () => {
const result = chef.help("base 64");
assert.strictEqual(result.length, 13);
assert.strictEqual(result.length, 14);
}),

it("chef.help: looks in description for matches too", () => {
Expand Down
Loading