|
| 1 | +--- |
| 2 | +title: "Generate a PDF using react-pdf and save it to R2" |
| 3 | +sidebarTitle: "React to PDF" |
| 4 | +description: "This example will show you how to generate a PDF using Trigger.dev." |
| 5 | +--- |
| 6 | + |
| 7 | +## Overview |
| 8 | + |
| 9 | +This example demonstrates how to use Trigger.dev to generate a PDF using `react-pdf` and save it to Cloudflare R2. |
| 10 | + |
| 11 | +## Task code |
| 12 | + |
| 13 | +```ts trigger/generateResumePDF.ts |
| 14 | +import { logger, task } from "@trigger.dev/sdk/v3"; |
| 15 | +import { Document, Page, Text, View } from "@react-pdf/renderer"; |
| 16 | +import { renderToBuffer } from "@react-pdf/renderer"; |
| 17 | +import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; |
| 18 | + |
| 19 | +// Initialize S3 client |
| 20 | +const s3Client = new S3Client({ |
| 21 | + region: "auto", |
| 22 | + endpoint: process.env.S3_ENDPOINT, |
| 23 | + credentials: { |
| 24 | + accessKeyId: process.env.R2_ACCESS_KEY_ID ?? "", |
| 25 | + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY ?? "", |
| 26 | + }, |
| 27 | +}); |
| 28 | + |
| 29 | +export const generateResumePDF = task({ |
| 30 | + id: "generate-resume-pdf", |
| 31 | + run: async (payload: { text: string }) => { |
| 32 | + logger.log("Generating PDF resume", payload); |
| 33 | + |
| 34 | + // Render the ResumeDocument component to a PDF buffer |
| 35 | + const pdfBuffer = await renderToBuffer( |
| 36 | + <Document> |
| 37 | + <Page size="A4"> |
| 38 | + <View> |
| 39 | + <Text>{payload.text}</Text> |
| 40 | + </View> |
| 41 | + </Page> |
| 42 | + </Document> |
| 43 | + ); |
| 44 | + |
| 45 | + // Generate a unique filename |
| 46 | + const filename = `${payload.text |
| 47 | + .replace(/\s+/g, "-") |
| 48 | + .toLowerCase()}-${Date.now()}.pdf`; |
| 49 | + |
| 50 | + // Upload to R2 |
| 51 | + const s3Key = `resumes/${filename}`; |
| 52 | + const uploadParams = { |
| 53 | + Bucket: process.env.S3_BUCKET, |
| 54 | + Key: s3Key, |
| 55 | + Body: pdfBuffer, |
| 56 | + ContentType: "application/pdf", |
| 57 | + }; |
| 58 | + |
| 59 | + logger.log("Uploading to R2 with params", uploadParams); |
| 60 | + |
| 61 | + // Upload the PDF to R2 and return the URL. |
| 62 | + await s3Client.send(new PutObjectCommand(uploadParams)); |
| 63 | + const s3Url = `https://${process.env.S3_BUCKET}.s3.amazonaws.com/${s3Key}`; |
| 64 | + logger.log("PDF uploaded to R2", { url: s3Url }); |
| 65 | + return { pdfUrl: s3Url }; |
| 66 | + }, |
| 67 | +}); |
| 68 | + |
| 69 | +``` |
0 commit comments