securityos/node_modules/rtf.js/GETTING_STARTED.md

5.9 KiB

This guide shows how to use the library to render a basic rtf file

Loading rtf.js as a script

Prerequisites

  • Include a promise polyfill if you have to support older browsers

Code

Put the following code into a html file:

<script src="../vendor/WMFJS.bundle.js"></script>
<script src="../vendor/EMFJS.bundle.js"></script>
<script src="../vendor/RTFJS.bundle.js"></script>

<script>
const rtf = 
    `{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Calibri;}}
    {\\*\\generator Msftedit 5.41.21.2510;}\\viewkind4\\uc1\\pard\\sa200\\sl276\\slmult1\\lang9\\f0\\fs22 This \\fs44 is \\fs22 a \\b simple \\ul one \\i paragraph \\ulnone\\b0 document\\i0 .\\par
    }`;

function stringToArrayBuffer(string) {
    const buffer = new ArrayBuffer(string.length);
    const bufferView = new Uint8Array(buffer);
    for (let i = 0; i < string.length; i++) {
        bufferView[i] = string.charCodeAt(i);
    }
    return buffer;
}

RTFJS.loggingEnabled(false);
WMFJS.loggingEnabled(false);
EMFJS.loggingEnabled(false);

const doc = new RTFJS.Document(stringToArrayBuffer(rtf));

const meta = doc.metadata();
doc.render().then(function(htmlElements) {
    console.log("Meta:");
    console.log(meta);
    console.log("Html:");
    console.log(htmlElements);
}).catch(error => console.error(error))
</script>

Importing rtf.js as a module

Prerequisites

  • Install rtf.js from npm (npm install rtf.js)

Code

import {EMFJS, RTFJS, WMFJS} from 'rtf.js';

const rtf = 
    `{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Calibri;}}
    {\\*\\generator Msftedit 5.41.21.2510;}\\viewkind4\\uc1\\pard\\sa200\\sl276\\slmult1\\lang9\\f0\\fs22 This \\fs44 is \\fs22 a \\b simple \\ul one \\i paragraph \\ulnone\\b0 document\\i0 .\\par
    }`;

function stringToArrayBuffer(string) {
    const buffer = new ArrayBuffer(string.length);
    const bufferView = new Uint8Array(buffer);
    for (let i = 0; i < string.length; i++) {
        bufferView[i] = string.charCodeAt(i);
    }
    return buffer;
}

RTFJS.loggingEnabled(false);
WMFJS.loggingEnabled(false);
EMFJS.loggingEnabled(false);

const doc = new RTFJS.Document(stringToArrayBuffer(rtf));

const meta = doc.metadata();
doc.render().then(function(htmlElements) {
    console.log("Meta:");
    console.log(meta);
    console.log("Html:");
    console.log(htmlElements);
}).catch(error => console.error(error))

Importing rtf.js as a module (Typescript)

Prerequisites

  • Install rtf.js from npm (npm install rtf.js)
  • Disable lib check in tsconfig.json (add "skipLibCheck": true)

Code

import {EMFJS, RTFJS, WMFJS} from 'rtf.js';

const rtf: string = 
    `{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Calibri;}}
    {\\*\\generator Msftedit 5.41.21.2510;}\\viewkind4\\uc1\\pard\\sa200\\sl276\\slmult1\\lang9\\f0\\fs22 This \\fs44 is \\fs22 a \\b simple \\ul one \\i paragraph \\ulnone\\b0 document\\i0 .\\par
    }`;

function stringToArrayBuffer(string) {
    const buffer = new ArrayBuffer(string.length);
    const bufferView = new Uint8Array(buffer);
    for (let i = 0; i < string.length; i++) {
        bufferView[i] = string.charCodeAt(i);
    }
    return buffer;
}

RTFJS.loggingEnabled(false);
WMFJS.loggingEnabled(false);
EMFJS.loggingEnabled(false);

const doc = new RTFJS.Document(stringToArrayBuffer(rtf));

const meta = doc.metadata();
doc.render().then(function(htmlElements) {
    console.log("Meta:");
    console.log(meta);
    console.log("Html:");
    console.log(htmlElements);
}).catch(error => console.error(error))

Node (using jsdom)

Prerequisites

  • Install rtf.js and jsdom from npm (npm install rtf.js jsdom)

Code

This is a minimal example for wrapper around rtf.js and jsdom:

const jsdom = require("jsdom");
const {JSDOM} = jsdom;

const rtf =
    `{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Calibri;}}
    {\\*\\generator Msftedit 5.41.21.2510;}\\viewkind4\\uc1\\pard\\sa200\\sl276\\slmult1\\lang9\\f0\\fs22 This \\fs44 is \\fs22 a \\b simple \\ul one \\i paragraph \\ulnone\\b0 document\\i0 .\\par
    }`;

function stringToArrayBuffer(string) {
    const buffer = new ArrayBuffer(string.length);
    const bufferView = new Uint8Array(buffer);
    for (let i = 0; i < string.length; i++) {
        bufferView[i] = string.charCodeAt(i);
    }
    return buffer;
}

function runRtfjs(rtf, callback, errorCallback) {
    const virtualConsole = new jsdom.VirtualConsole();
    virtualConsole.sendTo(console);

    new JSDOM(`
    <script src="./node_modules/rtf.js/dist/WMFJS.bundle.js"></script>
    <script src="./node_modules/rtf.js/dist/EMFJS.bundle.js"></script>
    <script src="./node_modules/rtf.js/dist/RTFJS.bundle.js"></script>

    <script>
        RTFJS.loggingEnabled(false);
        WMFJS.loggingEnabled(false);
        EMFJS.loggingEnabled(false);

        try {
            const doc = new RTFJS.Document(rtfFile);

            const meta = doc.metadata();
            doc.render().then(function(htmlElements) {
                const div = document.createElement("div");
                div.append(...htmlElements);

                window.done(meta, div.innerHTML);
            }).catch(error => window.onerror(error))
        } catch (error){
            window.onerror(error)
        }
    </script>
    `, {
        resources: "usable",
        runScripts: "dangerously",
        url: "file://" + __dirname + "/",
        virtualConsole,
        beforeParse(window) {
            window.rtfFile = stringToArrayBuffer(rtf);
            window.done = function (meta, html) {
                callback(meta, html);
            };
            window.onerror = function (error) {
                errorCallback(error)
            };
        }
    });
}

runRtfjs(
    rtf,
    (meta, html) => {
        console.log("Meta:");
        console.log(meta);
        console.log("Html:");
        console.log(html);
    },
    error => console.error(error));