- 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」くんを参考にさせていただきました。
|