Π‘Π΅ΡΠ²ΠΈΡ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ PDF Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ· Handlebars ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Nitro.js ΠΈ Puppeteer.
ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅Ρ PDF Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ ΠΈΠ· Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΈΠ»ΠΈ ΡΡΡΠΎΠΊΠΈ ΡΠ°Π±Π»ΠΎΠ½Π°.
{
"template": "ΠΈΠΌΡ_ΡΠ°Π±Π»ΠΎΠ½Π°", // ΠΠΠ
"templateString": "{{title}}", // ΡΡΡΠΎΠΊΠ° ΡΠ°Π±Π»ΠΎΠ½Π°
"data": { // Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠ°Π±Π»ΠΎΠ½Π°
"title": "ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ",
"content": "Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅"
},
"options": { // ΠΎΠΏΡΠΈΠΈ PDF (Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ)
"format": "A4", // A4, A3, A5, Letter, Legal, Tabloid
"orientation": "portrait", // portrait, landscape
"margin": {
"top": "20mm",
"right": "20mm",
"bottom": "20mm",
"left": "20mm"
},
"printBackground": true, // ΠΏΠ΅ΡΠ°ΡΡ ΡΠΎΠ½Π°
"displayHeaderFooter": false, // ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ/ΠΏΠΎΠ΄Π²Π°Π»
"scale": 1 // ΠΌΠ°ΡΡΡΠ°Π± (0.1 - 2.0)
},
"filename": "document.pdf" // ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° (Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ)
}
ΠΠ»Π°Π²Π½Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠ° Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ API (ΡΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ°).
curl -X POST http://localhost:3000/v1/generate-pdf \
-H "Content-Type: application/json" \
-d '{
"templateString": "<h1>{{title}}</h1><p>{{content}}</p>",
"data": {
"title": "ΠΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ!",
"content": "ΠΡΠΎ ΠΌΠΎΠΉ ΠΏΠ΅ΡΠ²ΡΠΉ PDF Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ."
},
"filename": "hello-world.pdf"
}' \
--output hello-world.pdf
curl -X POST http://localhost:3000/v1/generate-pdf \
-H "Content-Type: application/json" \
-d '{
"templateString": "<h1>{{title}}</h1><p>{{content}}</p>",
"data": {
"title": "ΠΡΡΠ΅Ρ",
"content": "Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ ΠΎΡΡΠ΅ΡΠ°..."
},
"options": {
"format": "A4",
"orientation": "landscape",
"margin": {
"top": "15mm",
"bottom": "15mm",
"left": "15mm",
"right": "15mm"
}
}
}' \
--output report.pdf
const response = await fetch('/v1/generate-pdf', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
templateString: '<h1>{{title}}</h1>',
data: { title: 'ΠΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ' }
})
});
if (response.ok) {
const blob = await response.blob();
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'document.pdf';
a.click();
}
server/routes/v1/ - API ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ Π²Π΅ΡΡΠΈΠΈ 1server/services/v1/ - ΡΠ΅ΡΠ²ΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡserver/utils/ - ΡΡΠΈΠ»ΠΈΡΡ ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡserver/tasks/ - ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ Π·Π°Π΄Π°Ρserver/types/ - TypeScript ΡΠΈΠΏΡAPI Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ HTTP ΡΡΠ°ΡΡΡ ΠΊΠΎΠ΄Ρ:
200 - Π£ΡΠΏΠ΅ΡΠ½Π°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ PDF400 - ΠΡΠΈΠ±ΠΊΠ° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅404 - Π¨Π°Π±Π»ΠΎΠ½ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½405 - ΠΠ΅ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠΉ HTTP ΠΌΠ΅ΡΠΎΠ΄500 - ΠΠ½ΡΡΡΠ΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ:
π Nitro.js |
π¨ Handlebars |
π€ Puppeteer