Spaces:
Paused
Paused
| const express = require("express"); | |
| const app = express(); | |
| const puppeteer = require("puppeteer-extra"); | |
| const StealthPlugin = require("puppeteer-extra-plugin-stealth"); | |
| const bodyParser = require("body-parser"); | |
| const multer = require("multer"); | |
| const markdownIt = require("markdown-it"); | |
| app.use(bodyParser.json()); | |
| app.use(bodyParser.urlencoded({ extended: false })); | |
| app.use(multer().array("")); | |
| puppeteer.use(StealthPlugin()); | |
| const initBrowser = puppeteer.launch({ | |
| executablePath: process.env.CHROME_BIN || null, | |
| defaultViewport: null, | |
| headless: true, | |
| }); | |
| // Fungsi untuk mengonversi Markdown ke HTML | |
| const convertMarkdownToHTML = (markdown) => { | |
| const md = new markdownIt(); | |
| return md.render(markdown); | |
| }; | |
| // Fungsi untuk membuat PDF dari Markdown | |
| async function MdtoPdf(md, cssCustom, type) { | |
| const browser = await initBrowser; | |
| const page = await browser.newPage(); | |
| const htmlContent = convertMarkdownToHTML(md); | |
| const fullHtmlContent = ` | |
| <html> | |
| <head> | |
| <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Arabic&display=swap" rel="stylesheet"> | |
| <style> | |
| body { | |
| font-family: 'Noto Sans Arabic', sans-serif; | |
| margin: 0; | |
| padding: 0; | |
| } | |
| ${cssCustom} | |
| </style> | |
| </head> | |
| <body> | |
| ${htmlContent} | |
| </body> | |
| </html> | |
| `; | |
| await page.setContent(fullHtmlContent, { waitUntil: "networkidle0" }); | |
| const pdfBuffer = await page.pdf({ | |
| format: type || "A4", | |
| printBackground: true, | |
| margin: { | |
| top: "10mm", // Jarak atas | |
| bottom: "10mm", // Jarak bawah | |
| left: "10mm", // Jarak kiri | |
| right: "10mm", // Jarak kanan | |
| }, | |
| }); | |
| await page.close(); | |
| return pdfBuffer; | |
| } | |
| app.get("/", (req, res) => { | |
| res.send("Hello World"); | |
| }); | |
| app.post("/mdtopdf", async (req, res) => { | |
| const data = req.body; | |
| if (!("md" in data)) { | |
| return res.status(400).json({ | |
| error: "No markdown parameter in request", | |
| }); | |
| } | |
| const md = data["md"]; | |
| const css = data["css"]; | |
| const type = data["type"] || "A4"; | |
| try { | |
| const pdfBuffer = await MdtoPdf(md, css, type); | |
| res.set("Content-Type", "application/pdf"); | |
| res.send(pdfBuffer); | |
| } catch (e) { | |
| res.status(500).json({ | |
| error: "Failed to generate PDF", | |
| }); | |
| } | |
| }); | |
| app.listen(8080, () => console.log("Server running at port 8080")); |