HTML to PDF
The HTML to PDF Converter is an extension for Jspreadsheet that enables users to generate PDF documents from HTML templates with data interpolation from worksheet rows. This functionality allows for dynamic creation of personalized PDFs, such as certificates, reports, or letters, by replacing placeholders in the template with actual data from the spreadsheet. Designed for simplicity and efficiency, the HTML to PDF Converter extension provides an effective solution for producing customized documents directly from spreadsheet data.
Structuring Templates
Templates can be structured using HTML to define the layout, with the syntax $[HeaderTitle] used for data interpolation. For example:
<div>
<p>$[Name] is $[Age] years old</p>
</div>
Documentation
Installation
Please choose one of the following options
Using NPM
npm install @jspreadsheet/htmlToPdf
Using a CDN
<script src="https://cdn.jsdelivr.net/npm/@jspreadsheet/htmlToPdf/dist/index.min.js"></script>
Setup
To open the extension panel, follow these steps:
Set the Extension in Jspreadsheet
Add the HTML to PDF Converter extension to Jspreadsheet by setting it in the extensions object:
jspreadsheet.setExtensions({ htmlToPdf });
Call the Opening Function
Once the extension is set, open the extension panel from the worksheet instance using the following code:
// Call the extension panel from the worksheet instance
worksheet.parent.tools.htmlToPdf(true);
Code samples
Opening from a button
In this example, we show how you can open the extension panel directly from a button.
For this example, try adding this text below as the template:
<table>
<tr>
<th>Name</th>
<th>Grade 1</th>
<th>Grade 2</th>
<th>Grade 3</th>
<th>Grade 4</th>
</tr>
<tr>
<td>$[Name]</td>
<td>$[Grade 1]</td>
<td>$[Grade 2]</td>
<td>$[Grade 3]</td>
<td>$[Grade 4]</td>
</tr>
</table>
<script src="https://jspreadsheet.com/v11/jspreadsheet.js"></script>
<script src="https://jsuites.net/v5/jsuites.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@jspreadsheet/htmlToPdf/dist/index.min.js"></script>
<link rel="stylesheet" href="https://jspreadsheet.com/v11/jspreadsheet.css" type="text/css" />
<link rel="stylesheet" href="https://jsuites.net/v5/jsuites.css" type="text/css" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons" />
<div id="spreadsheet"></div>
<input type="button" value="Open the panel" id="open-btn" />
<script>
// Set your JSS license key (The following key only works for one day)
jspreadsheet.setLicense('MzQ3Nzg4NTU3YzhmZTY1MjNmOTNhZjY3NzRhYmQ0ZTMzMjVlM2NmNzQwNzNjYTM4ZTU1Y2UxMmIwMmEyZTM5Y2YxNThhNWY3MGViZjk0NTdmYjNmZmQ2NTBlYjQ4ZmZhMGUwMjkxZDE2ZGE4OTI5NTczMTg3M2Y3YTQxMmMwODIsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpRd016QXdNRE16TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0ozWldJaUxDSnNiMk5oYkdodmMzUWlYU3dpY0d4aGJpSTZJak0wSWl3aWMyTnZjR1VpT2xzaWRqY2lMQ0oyT0NJc0luWTVJaXdpZGpFd0lpd2lkakV4SWl3aVkyaGhjblJ6SWl3aVptOXliWE1pTENKbWIzSnRkV3hoSWl3aWNHRnljMlZ5SWl3aWNtVnVaR1Z5SWl3aVkyOXRiV1Z1ZEhNaUxDSnBiWEJ2Y25SbGNpSXNJbUpoY2lJc0luWmhiR2xrWVhScGIyNXpJaXdpYzJWaGNtTm9JaXdpY0hKcGJuUWlMQ0p6YUdWbGRITWlMQ0pqYkdsbGJuUWlMQ0p6WlhKMlpYSWlMQ0p6YUdGd1pYTWlYU3dpWkdWdGJ5STZkSEoxWlgwPQ==');
// Create a new spreadsheet
let worksheets = jspreadsheet(document.getElementById('spreadsheet'), {
worksheets: [{
data: [
["John", 7, 9, 5, 10],
["Ana", 10, 9, 9.5, 10],
["Jane", 5, 10, 8, 6],
["Carlos", 4.5, 3, 6, 3.5],
],
// Define the titles so you can reference them in templates
columns: [{ title: "Name" }, { title: "Grade 1" }, { title: "Grade 2" }, { title: "Grade 3" }, { title: "Grade 4" }]
}]
});
document.getElementById("open-btn").onclick = (e) => worksheets[0].parent.tools.htmlToPdf(true);
</script>
</html>
import React, { useRef } from "react";
import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/react";
import htmlToPdf from "@jspreadsheet/htmlToPdf";
import "jsuites/dist/jsuites.css";
import "jspreadsheet/dist/jspreadsheet.css";
// Set license
jspreadsheet.setLicense("MzQ3Nzg4NTU3YzhmZTY1MjNmOTNhZjY3NzRhYmQ0ZTMzMjVlM2NmNzQwNzNjYTM4ZTU1Y2UxMmIwMmEyZTM5Y2YxNThhNWY3MGViZjk0NTdmYjNmZmQ2NTBlYjQ4ZmZhMGUwMjkxZDE2ZGE4OTI5NTczMTg3M2Y3YTQxMmMwODIsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpRd016QXdNRE16TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0ozWldJaUxDSnNiMk5oYkdodmMzUWlYU3dpY0d4aGJpSTZJak0wSWl3aWMyTnZjR1VpT2xzaWRqY2lMQ0oyT0NJc0luWTVJaXdpZGpFd0lpd2lkakV4SWl3aVkyaGhjblJ6SWl3aVptOXliWE1pTENKbWIzSnRkV3hoSWl3aWNHRnljMlZ5SWl3aWNtVnVaR1Z5SWl3aVkyOXRiV1Z1ZEhNaUxDSnBiWEJ2Y25SbGNpSXNJbUpoY2lJc0luWmhiR2xrWVhScGIyNXpJaXdpYzJWaGNtTm9JaXdpY0hKcGJuUWlMQ0p6YUdWbGRITWlMQ0pqYkdsbGJuUWlMQ0p6WlhKMlpYSWlMQ0p6YUdGd1pYTWlYU3dpWkdWdGJ5STZkSEoxWlgwPQ==");
// Set extension
jspreadsheet.setExtensions({ htmlToPdf });
export default function App() {
// Spreadsheet array of worksheets
const spreadsheet = useRef(null)
const data = [
["John", 7, 9, 5, 10],
["Ana", 10, 9, 9.5, 10],
["Jane", 5, 10, 8, 6],
["Carlos", 4.5, 3, 6, 3.5],
]
// Define the titles so you can reference them in templates
const columns = [{ title: "Name" }, { title: "Grade 1" }, { title: "Grade 2" }, { title: "Grade 3" }, { title: "Grade 4" }]
// Render component
return (
<>
<Spreadsheet ref={spreadsheet} toolbar={true}>
<Worksheet columns={columns} data={data}/>
</Spreadsheet>
<button onClick={() => spreadsheet.current[0].parent.tools.htmlToPdf(true)}>Open extension panel</button>
</>
);
}
<template>
<Spreadsheet ref="spreadsheet" :license="license">
<Worksheet :data="data" :columns="columns" />
</Spreadsheet>
<input ref="button" type="button" value="Open extension panel" @click="handleOpening" />
</template>
<script>
import { Spreadsheet, Worksheet, jspreadsheet } from "@jspreadsheet/vue";
import htmlToPdf from "@jspreadsheet/htmlToPdf";
import "jsuites/dist/jsuites.css";
import "jspreadsheet/dist/jspreadsheet.css";
// Set the license
const license = 'MzQ3Nzg4NTU3YzhmZTY1MjNmOTNhZjY3NzRhYmQ0ZTMzMjVlM2NmNzQwNzNjYTM4ZTU1Y2UxMmIwMmEyZTM5Y2YxNThhNWY3MGViZjk0NTdmYjNmZmQ2NTBlYjQ4ZmZhMGUwMjkxZDE2ZGE4OTI5NTczMTg3M2Y3YTQxMmMwODIsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpRd016QXdNRE16TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0ozWldJaUxDSnNiMk5oYkdodmMzUWlYU3dpY0d4aGJpSTZJak0wSWl3aWMyTnZjR1VpT2xzaWRqY2lMQ0oyT0NJc0luWTVJaXdpZGpFd0lpd2lkakV4SWl3aVkyaGhjblJ6SWl3aVptOXliWE1pTENKbWIzSnRkV3hoSWl3aWNHRnljMlZ5SWl3aWNtVnVaR1Z5SWl3aVkyOXRiV1Z1ZEhNaUxDSnBiWEJ2Y25SbGNpSXNJbUpoY2lJc0luWmhiR2xrWVhScGIyNXpJaXdpYzJWaGNtTm9JaXdpY0hKcGJuUWlMQ0p6YUdWbGRITWlMQ0pqYkdsbGJuUWlMQ0p6WlhKMlpYSWlMQ0p6YUdGd1pYTWlYU3dpWkdWdGJ5STZkSEoxWlgwPQ==';
// Set extension
jspreadsheet.setExtensions({ htmlToPdf })
export default {
components: {
Spreadsheet,
Worksheet,
},
methods: {
handleOpening() {
this.$refs.spreadsheet[0].parent.tools.htmlToPdf(true)
}
},
data() {
// Data
const data = [
["John", 7, 9, 5, 10],
["Ana", 10, 9, 9.5, 10],
["Jane", 5, 10, 8, 6],
["Carlos", 4.5, 3, 6, 3.5],
]
const columns = [{ title: "Name" }, { title: "Grade 1" }, { title: "Grade 2" }, { title: "Grade 3" }, { title: "Grade 4" }]
return {
data,
columns,
license,
};
}
}
</script>
import { Component, ViewChild, ElementRef } from "@angular/core";
import jspreadsheet from "jspreadsheet";
import htmlToPdf from "@jspreadsheet/htmlToPdf";
import "jspreadsheet/dist/jspreadsheet.css"
import "jsuites/dist/jsuites.css"
// Set your JSS license key (The following key only works for one day)
jspreadsheet.setLicense('MzQ3Nzg4NTU3YzhmZTY1MjNmOTNhZjY3NzRhYmQ0ZTMzMjVlM2NmNzQwNzNjYTM4ZTU1Y2UxMmIwMmEyZTM5Y2YxNThhNWY3MGViZjk0NTdmYjNmZmQ2NTBlYjQ4ZmZhMGUwMjkxZDE2ZGE4OTI5NTczMTg3M2Y3YTQxMmMwODIsZXlKamJHbGxiblJKWkNJNklpSXNJbTVoYldVaU9pSktjM0J5WldGa2MyaGxaWFFpTENKa1lYUmxJam94TnpRd016QXdNRE16TENKa2IyMWhhVzRpT2xzaWFuTndjbVZoWkhOb1pXVjBMbU52YlNJc0ltTnZaR1Z6WVc1a1ltOTRMbWx2SWl3aWFuTm9aV3hzTG01bGRDSXNJbU56WWk1aGNIQWlMQ0ozWldJaUxDSnNiMk5oYkdodmMzUWlYU3dpY0d4aGJpSTZJak0wSWl3aWMyTnZjR1VpT2xzaWRqY2lMQ0oyT0NJc0luWTVJaXdpZGpFd0lpd2lkakV4SWl3aVkyaGhjblJ6SWl3aVptOXliWE1pTENKbWIzSnRkV3hoSWl3aWNHRnljMlZ5SWl3aWNtVnVaR1Z5SWl3aVkyOXRiV1Z1ZEhNaUxDSnBiWEJ2Y25SbGNpSXNJbUpoY2lJc0luWmhiR2xrWVhScGIyNXpJaXdpYzJWaGNtTm9JaXdpY0hKcGJuUWlMQ0p6YUdWbGRITWlMQ0pqYkdsbGJuUWlMQ0p6WlhKMlpYSWlMQ0p6YUdGd1pYTWlYU3dpWkdWdGJ5STZkSEoxWlgwPQ==');
// Set extension
jspreadsheet.setExtensions({ htmlToPdf })
@Component({
standalone: true,
selector: "app-root",
template: `
<div #spreadsheet></div>
<input #button type='button' value='Open extension panel' (click)="this.handleOpening()" />`,
})
export class AppComponent {
@ViewChild("spreadsheet") spreadsheet: ElementRef;
@ViewChild("button") button: ElementRef;
// Worksheets
worksheets: jspreadsheet.worksheetInstance[];
// Data
data: data;
// Create a new data grid
ngAfterViewInit() {
// Create spreadsheet
this.worksheets = jspreadsheet(this.spreadsheet.nativeElement, {
worksheets: [{
data: [
["John", 7, 9, 5, 10],
["Ana", 10, 9, 9.5, 10],
["Jane", 5, 10, 8, 6],
["Carlos", 4.5, 3, 6, 3.5],
],
columns: [{ title: "Name" }, { title: "Grade 1" }, { title: "Grade 2" }, { title: "Grade 3" }, { title: "Grade 4" }],
}]
});
}
handleOpening() {
this.worksheets[0].parent.tools.htmlToPdf(true)
}
}