PDF-Berichterstellung in Rust: Die Bibliothek printpdf

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

PDF-Berichterstellung in Rust mit der Bibliothek printpdf



In der modernen Programmierwelt wird Rust zunehmend für die Erstellung leistungsstarker Serveranwendungen und Kommandozeilen-Tools eingesetzt. Eine gefragte Aufgabe ist die Generierung von PDF-Berichten – seien es Analyse-Dashboards, Rechnungen oder Dokumentationen. Die Bibliothek printpdf bietet eine einfache und zuverlässige Möglichkeit, PDF-Dokumente in reinem Rust ohne Abhängigkeiten von externen Systemen (wie LaTeX oder wkhtmltopdf) zu erstellen.



Was ist printpdf?



printpdf ist eine Pure-Rust-Bibliothek zur Erstellung von PDF-Dokumenten von Grund auf. Sie unterstützt:

  • Text mit verschiedenen Schriftarten (einschließlich eingebetteter TrueType/OpenType).
  • Vektorgrafiken (Linien, Rechtecke, Ellipsen).
  • Bilder (PNG, JPEG) mit Transparenz.
  • Tabellen und komplexe Formatierung durch manuelle Positionierung.
  • Seiten beliebiger Größe (A4, Letter, benutzerdefiniert).


Die Bibliothek verwendet keine externen Prozesse, was sie ideal für die Einbettung in Webdienste, CLI-Tools oder Desktop-Anwendungen in Rust macht.



Installation



Fügen Sie in Cargo.toml hinzu:



[dependencies]printpdf = "0.7"


Sie benötigen auch die Crate rusttype für die Arbeit mit Schriftarten (sie wird automatisch als Abhängigkeit hinzugezogen).



Basisbeispiel: Erstellen eines einfachen Berichts



Schreiben wir ein Programm, das ein PDF mit einer Überschrift, Text und einer Linie erstellt. Das Ergebnis speichern wir in der Datei report.pdf.



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

fn main() { // Dokument im A4-Format erstellen let (doc, page1, layer1) = PdfDocument::new( "Mein Bericht", Mm(210.0), Mm(297.0), "Layer 1", );

// Schriftart abrufen (eingebaute Helvetica) let font = doc.add_builtin_font(BuiltinFont::Helvetica).unwrap();

// Mit dem Zeichnen auf der ersten Ebene beginnen let current_layer = doc.get_page(page1).get_layer(layer1);

// Text: Überschrift current_layer.use_text( "Verkaufsbericht", 24.0, Mm(20.0), Mm(270.0), &font, );

// Text: normal current_layer.use_text( "Berichtsdatum: 2025-03-15", 12.0, Mm(20.0), Mm(250.0), &font, );

// Trennlinie zeichnen 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)), );

// In Datei speichern let file = File::create("report.pdf").unwrap(); let writer = BufWriter::new(file); doc.save(&mut std::io::BufWriter::new(writer)).unwrap();

println!("PDF-Bericht erstellt: report.pdf");}


Dieser Code erstellt ein einseitiges PDF mit einer Überschrift, einem Datum und einer grauen Linie. Alle Koordinaten werden in Millimetern angegeben (es können auch Punkte verwendet werden).



Hinzufügen einer Tabelle mit Daten



Für Berichte werden oft Tabellen benötigt. In printpdf gibt es keine vorgefertigten Tabellenstrukturen, aber sie lassen sich leicht manuell implementieren:



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);

// Hintergrund für die Kopfzeile if row_idx == 0 { layer.set_fill_color(header_bg); layer.add_rectangle( start_x, y - row_height,

Empfehlungen