JavaScript - express + bodyParser + puppeteer - server.js


 クラウディア


1. 概要
2. server.js
3. デーモン化
4. 参考サイト

1. 概要

 ソース的には、短いものになります。

2. server.js

 下記のソースになります。

const express = require('express');
const bodyParser = require('body-parser');
const puppeteer = require('puppeteer');

const app = express();
app.use(bodyParser.json({ limit: '50mb' }));

app.post('/generate-pdf', async (req, res) => {
    const htmlContent = req.body.html;

    if (!htmlContent) {
        return res.status(400).send('HTML content is required');
    }

    let browser;
    try {
        browser = await puppeteer.launch({
            headless: 'new',
            args: ['--no-sandbox', '--disable-setuid-sandbox'],
        });

        const page = await browser.newPage();
        await page.setContent(htmlContent, { waitUntil: 'networkidle0' });

        const pdfBuffer = await page.pdf({
            format: 'A4',
            // printBackground: true,
			landscape: true, // 横向き
			printBackground: true,
			margin: {
				top: '20mm',
				bottom: '20mm',
				left: '15mm',
				right: '15mm'
			},
			pageRanges: '1', // 1ページに制限(物理的に収まるなら)
        });

        await browser.close();

        // PDF を直接返す
        res.setHeader('Content-Type', 'application/pdf');
        res.setHeader('Content-Disposition', 'attachment; filename="document.pdf"');
        res.send(pdfBuffer);

    } catch (error) {
        if (browser) await browser.close();
        console.error(error);
        res.status(500).send('PDF generation failed');
    }
});

const PORT = 3000;
app.listen(PORT, () => {
    console.log(`Puppeteer server running on port ${PORT}`);
});
 これ、提示されるままに作成したので、うまく説明できないのですが・・・。  説明できる箇所だけ説明します。  下記で実行します。

node server.js
 ポート 3000 で受信しています。  呼び出し側では、下記の形式で呼び出します。  下記の場合、「api」は、「sample.pdf」というファイルを返して、クライアント側では、それをダウンロードすることになります。

$html = view('any_page')->render();

// Node.js Puppeteer サーバーに送信
$response = Http::post('http://127.0.0.1:3000/generate-pdf', [
	'html' => $html
]);

if ($response->failed())
{
	return response()->json(['error' => 'PDF generation failed'], 500);
}

return response($response, 200)
	->header('Content-Type', 'application/pdf')
	->header('Content-Disposition', 'attachment; filename="sample.pdf"');		// ダウンロード
 「php」や「Laravel」の話になりますが、 上記は、「.pdf」のバイナリをそのまま返しています。  ブラウザに「html」として表示させるには、最後の部分を、下記のように記述します。

return response($response, 200)
	->header('Content-Type', 'application/pdf')
	->header('Content-Disposition', 'inline; filename="sample.pdf"');			// HTML で開く

3. デーモン化


node server.js
 をデーモンとして、動作させる方法に関しては、「JavaScript - Node.js」をご参照ください。

4. 参考サイト

 本ページは、「ChatGPT」くんを参考にさせていただきました。

AbemaTV 無料体験