Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jsPDF server side (node.js) usage using node-jspdf

I am actually trying to include jspdf in server side and then use it for simple pdf generation(simply the text "Hello world!")(Go to the url- get the pdf localhost:8080). Now the first problem I face is

  • How to include it / What to do to use jsPDF in node?
  • While trying to install it using npm install node-jspdf then it gives following error-

> G:\test\myproj>npm install node-jspdf
 [email protected] install G:\test\myproj\node_modules\node-jspdf
 sh install.sh
'sh' is not recognized as an internal or external command,
operable program or batch file.
npm ERR! Windows_NT 6.1.7601
npm ERR! argv "C:\\Program Files\\nodejs\\\\node.exe" "C:\\Program Files\\nodejs
\\node_modules\\npm\\bin\\npm-cli.js" "install" "node-jspdf"
npm ERR! node v0.12.4
npm ERR! npm  v2.10.1
npm ERR! code ELIFECYCLE

npm ERR! [email protected] install: `sh install.sh`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] install script 'sh install.sh'.
npm ERR! This is most likely a problem with the node-jspdf package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     sh install.sh
npm ERR! You can get their info via:
npm ERR!     npm owner ls node-jspdf
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     G:\test\myproj\npm-debug.log

Can anybody help me on how to include it in node? And give a 4-5 line demo.

like image 777
user2736738 Avatar asked Jun 07 '15 14:06

user2736738


2 Answers

You can actually use jspdf directly (npm install jspdf instead of npm install node-jspdf). Jspdf is currently (v1.3.2) not built with node support in mind, but you can mock the globals like below and get it to work that way. This is a basic example and all features of jspdf will not be available.

global.window = {document: {createElementNS: () => {return {}} }};
global.navigator = {};
global.html2pdf = {};
global.btoa = () => {};

var fs = require('fs');
var jsPDF = require('jspdf');

var doc = new jsPDF();
doc.text("Hello", 10, 10);
var data = doc.output();

fs.writeFileSync('./document.pdf', data, 'binary');

delete global.window;
delete global.html2pdf;
delete global.navigator;
delete global.btoa;
like image 56
Simon Bengtsson Avatar answered Sep 21 '22 04:09

Simon Bengtsson


In extension to the answer provided by Simon Bengtsson:

I managed to handle even latin-1 characters by sending the output of jsPdf to encoding:

global.window = {document: {createElementNS: () => {return {}} }};
global.navigator = {};
global.btoa = () => {};

var fs = require('fs');
var jsPDF = require('jspdf');
var encoding = require('encoding')
var doc = new jsPDF();
doc.text("HelloäöüßÄÖÜ©µ®", 10, 10);
var data = doc.output()
var buffer = encoding.convert(data, "Latin_1") 

fs.writeFileSync('./document.pdf', buffer);

delete global.window;
delete global.navigator;
delete global.btoa;
like image 21
Bernhard Avatar answered Sep 18 '22 04:09

Bernhard