@ruanitto/adonis-report-builder
Version:
Report Builder for Adonis 4. Builds a PDF from view
103 lines (91 loc) • 2.31 kB
JavaScript
const wkhtmltopdf = require('wkhtmltopdf')
const defaultConfig = require('./config/default.js')
const View = use('View')
// const Functions
class ReportBuilder {
/**
* Creates an instance of ReportBuilder.
* @param {*} Config
* @memberof ReportBuilder
*/
constructor(Config) {
/**
* Options to wkhtmltopdf
* More Options: https://wkhtmltopdf.org/usage/wkhtmltopdf.txt
*
* @option pageSize: Set paper size to: A4, Letter, etc. (default A4)
* @option orientation: Set orientation to Landscape or Portrait. (default Portrait)
* @option footerRight: Right aligned footer text. (default 'Page: [page] from [topage]')
*
* @type {Object}
* @public
*/
this.options = Config.merge('reportbuilder', defaultConfig)
}
async streamToBuffer(stream) {
return new Promise((resolve, reject) => {
let buffers = [];
stream.on('error', reject);
stream.on('data', (data) => buffers.push(data));
stream.on('end', () => resolve(Buffer.concat(buffers)));
});
}
async builder() {
this.stream = await wkhtmltopdf(this.html, this.options)
this.buffer = await this.streamToBuffer(this.stream)
}
/**
* Load a view to Report Builder
*
* @param {*} _template - Load template from edge view
* @param {*} _data - Data to render report
* @memberof ReportBuilder
*/
async loadView(_template, _data) {
const html = await View.render(_template, _data)
this.html = html
}
/**
* Load an HTML to build
*
* @param {*} _html
* @memberof ReportBuilder
*/
async loadHTML(_html) {
this.html = _html
}
/**
* Return base64 of an PDF
*
* @returns
* @memberof ReportBuilder
*/
async outputBase64() {
await this.builder()
return this.buffer.toString('base64')
}
/**
* Return a RAW data of a PDF
*
* @returns
* @memberof ReportBuilder
*/
async outputBuffer() {
await this.builder()
return this.buffer
}
/**
* Output to File and return base64
*
* @param {*} _file - Path to save
* @returns
* @memberof ReportBuilder
*/
async outputToFile(_file) {
this.options.output = file
await this.builder()
return this.buffer.toString('base64')
}
}
module.exports = ReportBuilder