pdfmake permits to easily create a PDF with JavaScript; however there is no support of HTML code, so I decided to create a module to handle this feature.
Some options can be passed to htmlToPdfmake function as a second argument.
window
If you use Node, then you'll have to pass the window object (see below).
defaultStyles
You can overwrite the default styles using defaultStyles (see below).
imagesByReference
If you're using html-to-pdfmake in a web browser with images, then you can set this option to true and it will automatically load your images in your PDF using the {images} option of PDFMake.
Using this option will change the output of html-to-pdfmake that will return an object with {content, images}.
You can overwrite the default sizes for the old HTML4 tag <font> by using fontSizes. It must be an array with 7 values (see below).
tableAutoSize
By passing tableAutoSize with true, then the program will try to define widths and heights for the tables, based on CSS properties width and height that have been provided to TH or TD.
Example:
varhtml=htmlToPdfmake(`<table> <tr style="height:100px"> <td style="width:250px">height:100px / width:250px</td> <td>height:100px / width:'auto'</td> </tr> <tr> <td style="width:100px">Here it will use 250px for the width because we have to use the largest col's width</td> <td style="height:200px">height:200px / width:'auto'</td> </tr></table>`,{tableAutoSize:true});// it will return something like:[{"table": {"body": [[…]],"widths": [188,"auto"],"heights": [75,151]}}]
replaceText
By passing replaceText as a function with two parameters (text and nodes) you can modify the text of all the nodes in your HTML document.
Example:
varhtml=htmlToPdfmake(`<p style='text-align: justify;'>Lorem Ipsum is simply d-ummy text of th-e printing and typese-tting industry. Lorem Ipsum has b-een the industry's standard dummy text ever since the 1500s</p>`,{replaceText:function(text,nodes){// 'nodes' contains all the parent nodes for the textreturntext.replace(/-/g,"\\u2011");// it will replace any occurrence of '-' with '\\u2011' in "Lorem Ipsum is simply d-ummy text […] dummy text ever since the 1500s"}});
customTag
If your HTML code doesn't use regular HTML tags, then you can use customTag to define your own result.
Example with a QR code generator:
varhtml=htmlToPdfMake(`<code typecode="QR" style="foreground:black;background:yellow;fit:300px">texto in code</code>`,{,customTag:function(params){varret=params.ret;varelement=params.element;varparents=params.parents;switch(ret.nodeName){case"CODE": {ret=this.applyStyle({ret:ret,parents:parents.concat([element])});ret.qr=ret.text[0].text;switch(element.getAttribute("typecode")){case'QR':
deleteret.text;ret.nodeName='QR';if(!ret.style||!Array.isArray(ret.style)){ret.style=[];}ret.style.push('html-qr');break;}break;}}returnret;}});
HTML tags supported
The below HTML tags are supported:
A (with external and internal links)
DIV / P / SPAN
B / STRONG
I / EM
S
UL / OL / LI
TABLE / THEAD / TBODY / TFOOTER / TR / TH / TD
H1 to H6
FONT
IMG
SVG
SUP / SUB
CSS properties supported
CSS can create very complex design, however this framework can only handle the most simple HTML / CSS. The support of CSS style is limited and might not work in all cases with all values:
background-color
border
color
font-family
font-style (with italic)
font-weight (with bold)
height
margin
text-align
text-decoration
text-indent
white-space (with break-spaces and pre*)
width
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...
For the old HTML4 tag <font>, the size attributes can have a value from 1 to 7, which will be converted to 10pt, 14pt, 16pt, 18pt, 20pt, 24pt, or 28pt.
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:
varhtml=htmlToPdfmake(` <p> This sentence has <strong>a highlighted word</strong>, but not only. </p> `);vardocDefinition={content: [html],styles:{'html-strong':{background:'yellow'// it will add a yellow background to all <STRONG> elements}}};varpdfDocGenerator=pdfMake.createPdf(docDefinition);
CSS class and style
The class and styles for the elements will also be added.
varhtml=htmlToPdfmake(` <p> This sentence has <span style="font-weight:bold" class="red">a bold and red word</span>. </p> `);/*It returns:{ text: [ { text: 'This sentence has ' }, { text: 'a bold and red word', style: ['red', 'html-span'], // 'red' added because of `class="red"` bold: true // added because of `style="font-weight:bold"` }, { text: '.' } ], margin: [0, 5, 0, 10], style: ['html-p']}*/vardocDefinition={content: [html],styles:{red:{// we define the class called "red"color:'red'}}};varpdfDocGenerator=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:
vardocDefinition={content: [html],styles:{'html-a':{color:'purple'// it won't work: all links will remain 'blue'}}};
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:
varhtml=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:{// change the default stylesa:{// for <A>color:'purple',// all links should be 'purple'decoration:''// remove underline},li:''// remove all default styles for <LI>}});vardocDefinition={content: [html],styles:{'with-margin':{marginLeft: 30// apply a margin with the specific class is used}}};
Units
PDFMake uses pt units for the numbers. html-to-pdfmake will check the inline style to see if a number with unit is provided, then it will convert it to pt.
It only works for px, pt, em and rem (for em/rem it's based on 1rem = 16px);
Examples:
font-size:16px will be converted to fontSize:12
margin:1em will be converted to margin:12
<img>
If you use html-to-pdfmakein a Web browser, then you could just pass the option imagesByReference with the value true and the images will be passed by references (starting from PDFMake v0.1.67).
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:
varhtml=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>`);vardocDefinition={content: [html],pageBreakBefore: function(currentNode){returncurrentNode.style&¤tNode.style.indexOf('pdf-pagebreak-before')>-1;}};varpdfDocGenerator
请发表评论