lollms-webui/endpoints/libraries/lollms_markdown2PDF.js

122 lines
3.1 KiB
JavaScript
Raw Normal View History

2024-08-19 21:12:58 +00:00
class LollmsMarkdown2PDF {
constructor() {
this.markdown = '';
this.pdfDoc = null;
}
// Load Markdown content
loadMarkdown(markdown) {
this.markdown = markdown;
}
// Parse Markdown and convert to PDF
async convertToPDF() {
// We'll use the pdfkit library for PDF generation
const PDFDocument = require('pdfkit');
const fs = require('fs');
const showdown = require('showdown');
const cheerio = require('cheerio');
this.pdfDoc = new PDFDocument();
// Convert Markdown to HTML
const converter = new showdown.Converter({tables: true, strikethrough: true});
const html = converter.makeHtml(this.markdown);
// Parse HTML
const $ = cheerio.load(html);
// Process elements
$('body').children().each((i, elem) => {
this.processElement($(elem));
});
return this.pdfDoc;
}
// Process individual elements
processElement(elem) {
switch(elem.get(0).tagName.toLowerCase()) {
case 'h1':
case 'h2':
case 'h3':
case 'h4':
case 'h5':
case 'h6':
this.addHeading(elem);
break;
case 'p':
this.addParagraph(elem);
break;
case 'img':
this.addImage(elem);
break;
case 'table':
this.addTable(elem);
break;
case 'pre':
this.addCodeBlock(elem);
break;
// Add more cases for other elements
}
}
// Add heading
addHeading(elem) {
const level = parseInt(elem.get(0).tagName.slice(1));
const fontSize = 24 - (level - 1) * 2;
this.pdfDoc.fontSize(fontSize).text(elem.text(), {bold: true});
this.pdfDoc.moveDown();
}
// Add paragraph
addParagraph(elem) {
this.pdfDoc.fontSize(12).text(elem.text());
this.pdfDoc.moveDown();
}
// Add image
addImage(elem) {
const src = elem.attr('src');
if (src) {
this.pdfDoc.image(src, {fit: [400, 300], align: 'center'});
this.pdfDoc.moveDown();
}
}
// Add table
addTable(elem) {
const rows = elem.find('tr').map((i, row) => {
return $(row).find('td, th').map((j, cell) => {
return $(cell).text().trim();
}).get();
}).get();
this.pdfDoc.table(rows, {
prepareHeader: () => this.pdfDoc.font('Helvetica-Bold'),
prepareRow: (row, i) => this.pdfDoc.font('Helvetica').fontSize(12)
});
this.pdfDoc.moveDown();
}
// Add code block
addCodeBlock(elem) {
const code = elem.text();
this.pdfDoc.font('Courier').fontSize(10).text(code);
this.pdfDoc.moveDown();
}
// Save PDF to file
savePDF(outputPath) {
return new Promise((resolve, reject) => {
const stream = fs.createWriteStream(outputPath);
this.pdfDoc.pipe(stream);
this.pdfDoc.end();
stream.on('finish', resolve);
stream.on('error', reject);
});
}
}
module.exports = LollmsMarkdown2PDF;