html-to-pdfmake
pdfmake permits to easily create a PDF with JavaScript, but the support of HTML was missing. After reviewing issue #205 I decided to create a module to handle this feature.
Online Demo
You can find the online demo at https://aymkdn.github.io/html-to-pdfmake/index.html
Install
npm install html-to-pdfmake
How to use
This module will convert some basic and valid HTML code to its equivalent in pdfmake.
var pdfMake = require("pdfmake/build/pdfmake");
var pdfFonts = require("pdfmake/build/vfs_fonts");
pdfMake.vfs = pdfFonts.pdfMake.vfs;
var htmlToPdfmake = require("html-to-pdfmake");
var html = htmlToPdfmake(`
<div>
<h1>My title</h1>
<p>
This is a sentence with a <strong>bold word</strong>, <em>one in italic</em>,
and <u>one with underline</u>. And finally <a href="https://www.somewhere.com">a link</a>.
</p>
</div>
`);
Documentation
HTML tags supported
The below HTML tags are supported:
- DIV / P / SPAN
- BR
- B / STRONG
- I / EM
- S
- UL / OL / LI
- TABLE / THEAD / TBODY / TFOOTER / TR / TH / TD
- H1 to H6
- IMG
- SVG
Default styles
I've defined some default styles for the supported element.
For example, using a <STRONG> will display the word in bold. Or, a link will appear in blue with an underline, and so on...
Here is the list of defaults styles:
{
b: {bold:true},
strong: {bold:true},
u: {decoration:'underline'},
s: {decoration: 'lineThrough'},
em: {italics:true},
i: {italics:true},
h1: {fontSize:24, bold:true, marginBottom:5},
h2: {fontSize:22, bold:true, marginBottom:5},
h3: {fontSize:20, bold:true, marginBottom:5},
h4: {fontSize:18, bold:true, marginBottom:5},
h5: {fontSize:16, bold:true, marginBottom:5},
h6: {fontSize:14, bold:true, marginBottom:5},
a: {color:'blue', decoration:'underline'},
strike: {decoration: 'lineThrough'},
p: {margin:[0, 5, 0, 10]},
ul: {marginBottom:5},
li: {marginLeft:5},
table: {marginBottom:5},
th: {bold:true, fillColor:'#EEEEEE'}
}
Please, note that the above default styles are stronger than the ones defined in the style classes. Read below how to overwrite them.
Customize style
Each converted element will have an associated style-class called html-tagname
.
For example, if you want all <STRONG> tags to be highlighted with a yellow backgroud you can use html-strong
in the styles
definition:
var html = htmlToPdfmake(`
<p>
This sentence has <strong>a highlighted word</strong>, but not only.
</p>
`);
var docDefinition = {
content: [
html
],
styles:{
'html-strong':{
background:'yellow'
}
}
};
var pdfDocGenerator = pdfMake.createPdf(docDefinition);
CSS class and style
The class
and styles
for the elements will also be added.
var html = htmlToPdfmake(`
<p>
This sentence has <span style="font-weight:bold" class="red">a bold and red word</span>.
</p>
`);
var docDefinition = {
content: [
html
],
styles:{
red:{
color:'red'
}
}
};
var pdfDocGenerator = pdfMake.createPdf(docDefinition);
Please, note that the default styles are stronger than the ones defined in the style classes. For example, if you define a class html-a
to change all links in purple, then it won't work because the default styles will overwrite it:
var docDefinition = {
content: [
html
],
styles:{
'html-a':{
color:'purple'
}
}
};
To make it work, you have to either delete the default styles, or change it with a new value. Starting v1.1.0
, an option parameter is available as a second parameter.
Example: you want <li>
to not have a margin-left, and <a>
to be 'purple' and without 'underline' style:
var html = htmlToPdfmake('<ul><li>this is <a href="...">a link</a></li><li>another item</li><li class="with-margin">3rd item with a margin</li></ul>', {
defaultStyles:{
a:{
color:'purple',
decoration:''
},
li:''
}
});
var docDefinition = {
content: [
html
],
styles:{
'with-margin':{
marginLeft: 30
}
}
};
<img>
The <img>
tag is supported, however the src
attribute must already be a base64 encoded content (as describe in the PDFMake documentation).
This is too complex and out of the scope of this module to find and convert the image source to a base64 format. You can check this Stackoverflow question to know the different ways to get a base64 encoded content from an image.
page break
You can use pageBreakBefore
and a CSS class that you'll apply to your elements to identify when to add a page break:
var html = htmlToPdfmake(`
<div>
<h1>My title on page 1</h1>
<p>
This is my paragraph on page 1.
</p>
<h1 class="pdf-pagebreak-before">My title on page 2</h1>
<p>This is my paragraph on page 2.</p>
</div>
`);
var docDefinition = {
content: [
html
],
pageBreakBefore: function(currentNode) {
return currentNode.style && currentNode.style.indexOf('pdf-pagebreak-before') > -1;
}
};
var pdfDocGenerator = pdfMake.createPdf(docDefinition);
See example.js to see another example.
Special properties
PDFMake provides some special attributes, like widths
or heights
for table
, or fit
for image
, and more.
To apply these special attributes, you have to use the attribute data-pdfmake
on your HTML elements, and then pass the special attributes as a JSON string.
<table data-pdfmake="{"widths":[100,"*","auto"],"heights":40}">
<tr>
<td colspan="3">Table with <b>widths=[100,"*","auto"]</b> and <b>heights=40</b></th>
</tr>
<tr>
<td>Cell1</td>
<td>Cell2</td>
<td>Cell3</td>
</tr>
</table>
The expression provided by data-pdfmake
must be a valid JSON string because it will be translated with JSON.parse()
.
<hr>
An <hr>
can also be customized using data-pdfmake
. Some default styles are applied to this element:
{
left:0,
width:514,
color:'black',
thickness:0.5,
margin:[0,12,0,12]
}
See the example.js file to see a <hr>
example.
Examples
You can find more examples in example.js which will create example.pdf:
npm install
node example.js
Donate
You can support my work by making a donation, or by visiting my Github Sponsors page. Thank you!