const os = require('os') const bytes = require('bytes') const sharp = require('sharp') const morgan = require('morgan') const express = require('express') const PDFDocument = require('pdfkit') const app = express() app.set('json spaces', 4) app.use(morgan('dev')) app.use(express.json()) app.all('/', (req, res) => { const status = {} const used = process.memoryUsage() for (let key in used) status[key] = formatSize(used[key]) const totalmem = os.totalmem() const freemem = os.freemem() status.memoryUsage = `${formatSize(totalmem - freemem)} / ${formatSize(totalmem)}` res.json({ creator: '@rippanteq7', message: 'Hello World', uptime: new Date(process.uptime() * 1000).toUTCString().split(' ')[4], status }) }) app.post('/imagetopdf', async (req, res) => { try { console.log(req.body) const { images } = req.body if (!images) return res.json({ success: false, message: 'Required an array image url' }) const buffer = await toPDF(images) res.setHeader('Content-Disposition', `attachment; filename=${Math.random().toString(36).slice(2)}.pdf`) res.setHeader('Content-Type', 'application/pdf') res.setHeader('Content-Length', buffer.byteLength) res.send(buffer) } catch (e) { console.log(e) e = String(e) res.json({ error: true, message: e === '[object Object]' ? 'Internal Server Error' : e }) } }) const PORT = process.env.PORT || 7860 app.listen(PORT, () => console.log('App running on port', PORT)) function formatSize(num) { return bytes.format(+num || 0, { unitSeparator: ' ' }) } function toPDF(urls) { return new Promise(async (resolve, reject) => { try { if (!Array.isArray(urls)) urls = [urls] const doc = new PDFDocument({ margin: 0, size: 'A4' }) const buffers = [] const promises = urls.map(async (url, index) => { const response = await fetch(url, { headers: { referer: url }}) if (!response.ok) return const type = response.headers.get('content-type') if (!/image/.test(type)) return reject(`Invalid Type: ${type}`) let buffer = Buffer.from(await response.arrayBuffer()) if (/gif|webp/.test(type)) buffer = await sharp(buffer).png().toBuffer() doc.image(buffer, 0, 0, { fit: [595.28, 841.89], align: 'center', valign: 'center' }) if (urls.length !== index + 1) doc.addPage() }) await Promise.all(promises) doc.on('data', (chunk) => buffers.push(chunk)) doc.on('end', () => resolve(Buffer.concat(buffers))) doc.on('error', reject) doc.end() } catch (e) { console.log(e) reject(e) } }) }