TypeScript में PDF रिपोर्ट जनरेशन: PDF-Lib लाइब्रेरी

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

TypeScript में PDF-Lib लाइब्रेरी से PDF रिपोर्ट जनरेशन

आधुनिक वेब डेवलपमेंट में अक्सर जटिल PDF दस्तावेज़ बनाने की ज़रूरत होती है: रिपोर्ट, इनवॉइस, सर्टिफिकेट या एनालिटिकल डैशबोर्ड। TypeScript, अपनी सख्त टाइपिंग के कारण, इस प्रक्रिया को विश्वसनीय और अनुमानित बनाता है। Node.js और ब्राउज़र प्लेटफॉर्म पर PDF के साथ काम करने के लिए कई लाइब्रेरीज़ में से PDF-Lib सबसे अलग है - यह हल्का, शक्तिशाली और पूरी तरह से TypeScript में लिखा गया टूल है।

PDF-Lib को भारी-भरकम समाधानों (जैसे Puppeteer या wkhtmltopdf) के विपरीत, किसी अतिरिक्त नेटिव डिपेंडेंसी की आवश्यकता नहीं होती। यह Node.js और ब्राउज़र दोनों में काम करता है, और PDF की सभी आधुनिक सुविधाओं का समर्थन करता है: फॉन्ट एम्बेड करना, इमेज, फॉर्म बनाना, एनोटेशन और भी बहुत कुछ।

इंस्टॉलेशन और पहला दस्तावेज़

शुरू करने के लिए, npm के माध्यम से पैकेज इंस्टॉल करें:

npm install pdf-lib

अब एक सरल PDF दस्तावेज़ बनाते हैं:

import { PDFDocument, StandardFonts, rgb } from 'pdf-lib';

async function createSimplePdf() {
  // नया PDF दस्तावेज़ बनाएं
  const pdfDoc = await PDFDocument.create();

  // एक पेज जोड़ें (A4 फॉर्मेट)
  const page = pdfDoc.addPage([595.28, 841.89]); // A4 पॉइंट्स में

  // स्टैंडर्ड फॉन्ट एम्बेड करें
  const font = await pdfDoc.embedFont(StandardFonts.Helvetica);

  // टेक्स्ट ड्रा करें
  page.drawText('नमस्ते, दुनिया!', {
    x: 50,
    y: 700,
    size: 30,
    font: font,
    color: rgb(0.2, 0.4, 0.8),
  });

  // दस्तावेज़ को बाइट्स में सेव करें
  const pdfBytes = await pdfDoc.save();
  return pdfBytes;
}

// उपयोग का उदाहरण
createSimplePdf().then((bytes) => {
  // Node.js में फ़ाइल में लिख सकते हैं
  // require('fs').writeFileSync('hello.pdf', bytes);
  console.log('PDF बन गया! साइज़:', bytes.length, 'बाइट्स');
});

हिंदी टेक्स्ट और कस्टम फॉन्ट के साथ काम करना

रिपोर्ट जनरेशन में एक मुख्य चुनौती हिंदी या अन्य यूनिकोड टेक्स्ट का सही प्रदर्शन है। स्टैंडर्ड PDF फॉन्ट (Helvetica, Times, Courier) में देवनागरी ग्लिफ़ नहीं होते। समाधान - TrueType फॉन्ट को एम्बेड करना जो यूनिकोड को सपोर्ट करता हो।

import { PDFDocument, rgb } from 'pdf-lib';
import fontkit from '@pdf-lib/fontkit';
import fs from 'fs';

async function createHindiPdf() {
  const pdfDoc = await PDFDocument.create();

  // कस्टम फॉन्ट के लिए fontkit रजिस्टर करें
  pdfDoc.registerFontkit(fontkit);

  // हिंदी सपोर्ट वाला फॉन्ट लोड करें (जैसे, Noto Sans Devanagari)
  const fontBytes = fs.readFileSync('NotoSansDevanagari-Regular.ttf');
  const customFont = await pdfDoc.embedFont(fontBytes);

  const page = pdfDoc.addPage([595.28, 841.89]);

  page.drawText('TypeScript में रिपोर्ट जनरेशन', {
    x: 50,
    y: 750,
    size: 24,
    font: customFont,
    color: rgb(0, 0, 0),
  });

  page.drawText('दिनांक: 2024-01-15', {
    x: 50,
    y: 700,
    size: 14,
    font: customFont,
    color: rgb(0.3, 0.3, 0.3),
  });

  return await pdfDoc.save();
}

टेबल और संरचित रिपोर्ट बनाना

PDF-Lib में टेबल के लिए कोई बिल्ट-इन मॉड्यूल नहीं है, लेकिन लाइनें खींचकर और टेक्स्ट को पोज़िशन करके इसे आसानी से मैन्युअल रूप से लागू किया जा सकता है। सुविधा के लिए एक हेल्पर फंक्शन बनाएं:

interface TableCell {
  text: string;
  width: number;
  height?: number;
  align?: 'left' | 'center' | 'right';
}

async function drawTable(
  page: PDFPage,
  headers: TableCell[],
  rows: TableCell[][],
  startX: number,
  startY: number,
  font: PDFFont,
  fontSize: number = 12
) {
  const cellPadding = 5;
  const rowHeight = fontSize + 2 * cellPadding;
  let currentY = startY;

  // हेडर ड्रा करें
  let currentX = startX;
  for (const header of headers) {
    page.drawRectangle({
      x: currentX,
      y: currentY - rowHeight,
      width: header.width,
      height: rowHeight,
      color: rgb(0.9, 0.9, 0.9),
      borderColor: rgb(0.7, 0.7, 0.7),
      borderWidth: 1,
    });
    page.drawText(header.text, {
      x: currentX + cellPadding,
      y: currentY - rowHeight + cellPadding,
      size: fontSize,
      font: font,
      color: rgb(0, 0, 0),
    });
    currentX += header.width;
  }

  currentY -= rowHeight;

  // डेटा पंक्तियाँ ड्रा करें
  for (const row of rows) {
    currentX = startX;
    for (const cell of row) {
      page.drawRectangle({
        x: currentX,
        y: currentY - rowHeight,
        width: cell.width,
        height: rowHeight,
        borderColor: rgb(0.7, 0.7, 0.7),
        borderWidth: 1,
      });
      page.drawText(cell.text, {
        x: currentX + cellPadding,
        y: currentY - rowHeight + cellPadding,
        size: fontSize,
        font: font,
        color: rgb(0, 0, 0),
      });
      currentX += cell.width;
    }
    currentY -= rowHeight;
  }
}

अनुशंसाएँ