Rust में PDF रिपोर्ट जनरेशन: printpdf लाइब्रेरी

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

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

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

Rust में printpdf लाइब्रेरी से PDF रिपोर्ट जनरेशन

आज के प्रोग्रामिंग की दुनिया में, Rust का उपयोग हाई-परफॉर्मेंस सर्वर एप्लिकेशन और कमांड-लाइन टूल बनाने के लिए तेजी से बढ़ रहा है। एक बहुत ही जरूरी काम है PDF रिपोर्ट जनरेट करना - चाहे वह एनालिटिकल डैशबोर्ड हो, इनवॉइस हो या डॉक्यूमेंटेशन। printpdf लाइब्रेरी Rust में बिना किसी बाहरी सिस्टम (जैसे LaTeX या wkhtmltopdf) के निर्भरता के PDF डॉक्यूमेंट बनाने का एक हल्का और भरोसेमंद तरीका प्रदान करती है।

printpdf क्या है?

printpdf एक pure-Rust लाइब्रेरी है जो शुरू से PDF डॉक्यूमेंट जनरेट करती है। यह सपोर्ट करती है:

  • विभिन्न फॉन्ट के साथ टेक्स्ट (एम्बेडेड TrueType/OpenType सहित)।
  • वेक्टर ग्राफिक्स (लाइनें, आयत, अंडाकार)।
  • पारदर्शिता के साथ इमेज (PNG, JPEG)।
  • मैन्युअल पोजीशनिंग के माध्यम से टेबल और जटिल फॉर्मेटिंग।
  • किसी भी आकार के पेज (A4, Letter, कस्टम)।

यह लाइब्रेरी बाहरी प्रक्रियाओं का उपयोग नहीं करती, जो इसे वेब-सर्विस, CLI-यूटिलिटी या डेस्कटॉप एप्लिकेशन में एम्बेड करने के लिए आदर्श बनाती है।

इंस्टॉलेशन

Cargo.toml में जोड़ें:

[dependencies]
printpdf = "0.7"

साथ ही, फॉन्ट के साथ काम करने के लिए rusttype क्रेट की आवश्यकता होगी (यह ऑटोमैटिकली डिपेंडेंसी के रूप में आ जाता है)।

बेसिक उदाहरण: एक साधारण रिपोर्ट बनाना

चलिए एक प्रोग्राम लिखते हैं जो हेडिंग, टेक्स्ट और एक लाइन के साथ PDF बनाता है। परिणाम report.pdf फाइल में सेव होगा।

use printpdf::*;
use std::fs::File;
use std::io::BufWriter;

fn main() {
    // A4 फॉर्मेट का डॉक्यूमेंट बनाएं
    let (doc, page1, layer1) = PdfDocument::new(
        "मेरी रिपोर्ट",
        Mm(210.0),
        Mm(297.0),
        "Layer 1",
    );

    // फॉन्ट प्राप्त करें (बिल्ट-इन Helvetica)
    let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();

    // पहले लेयर पर ड्रॉइंग शुरू करें
    let current_layer = doc.get_page(page1).get_layer(layer1);

    // टेक्स्ट: हेडिंग
    current_layer.use_text(
        "बिक्री रिपोर्ट",
        24.0,
        Mm(20.0),
        Mm(270.0),
        &font,
    );

    // टेक्स्ट: सामान्य
    current_layer.use_text(
        "रिपोर्ट की तारीख: 2025-03-15",
        12.0,
        Mm(20.0),
        Mm(250.0),
        &font,
    );

    // डिवाइडर लाइन बनाएं
    current_layer.set_outline_color(Color::Rgb(Rgb::new(0.5, 0.5, 0.5)));
    current_layer.set_stroke_width(1.0);
    current_layer.add_line(
        Point::new(Mm(20.0), Mm(240.0)),
        Point::new(Mm(190.0), Mm(240.0)),
    );

    // फाइल में सेव करें
    let file = File::create("report.pdf").unwrap();
    let writer = BufWriter::new(file);
    doc.save(&mut std::io::BufWriter::new(writer)).unwrap();

    println!("PDF रिपोर्ट बन गई: report.pdf");
}

यह कोड एक सिंगल-पेज PDF बनाता है जिसमें हेडिंग, तारीख और एक ग्रे लाइन होती है। सभी कोऑर्डिनेट मिलीमीटर में दिए गए हैं (आप पॉइंट का भी उपयोग कर सकते हैं)।

डेटा के साथ टेबल जोड़ना

रिपोर्ट में अक्सर टेबल की जरूरत होती है। printpdf में रेडीमेड टेबल स्ट्रक्चर नहीं है, लेकिन इसे मैन्युअली आसानी से बनाया जा सकता है:

use printpdf::*;
use std::fs::File;
use std::io::BufWriter;

fn draw_table(
    layer: &PdfLayerReference,
    font: &IndirectFontRef,
    data: Vec<[&str; 3]>,
    start_x: Mm,
    start_y: Mm,
) {
    let col_widths = [Mm(40.0), Mm(60.0), Mm(50.0)];
    let row_height = Mm(10.0);
    let header_bg = Color::Rgb(Rgb::new(0.9, 0.9, 0.9));

    for (row_idx, row_data) in data.iter().enumerate() {
        let y = start_y - row_height * (row_idx as f32);

        // हेडर के लिए बैकग्राउंड
        if row_idx == 0 {
            layer.set_fill_color(header_bg);
            layer.add_rectangle(
                start_x,
                y - row_height,
                col_widths[0] + col_widths[1] + col_widths[2],
                row_height,
            );                    

अनुशंसाएँ