File size: 2,386 Bytes
d456a76
1576c93
d456a76
 
4f1ca17
3151f31
 
1576c93
4f1ca17
 
3151f31
4f1ca17
d456a76
4f1ca17
6802ffc
d456a76
 
 
6802ffc
4f1ca17
3151f31
 
 
 
 
 
 
16d3be6
d456a76
 
3151f31
8a591bb
 
 
16d3be6
8a591bb
7dda8bc
16d3be6
 
 
205ee52
16d3be6
8a591bb
 
205ee52
 
 
8a591bb
 
16d3be6
3151f31
 
 
16d3be6
 
 
 
 
 
d456a76
74e1c38
3151f31
4f1ca17
 
3151f31
d456a76
 
9c34b87
3151f31
d456a76
3151f31
 
 
 
d456a76
3151f31
16d3be6
3151f31
d456a76
16d3be6
3151f31
 
d456a76
3151f31
 
 
d456a76
 
4f1ca17
1576c93
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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"));