Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Quick Start Guide

Get up and running with rust-pdf-box in your Rust project in just a few minutes.


1. Installation

Add rust-pdf-box to your Cargo.toml:

[dependencies]
rust-pdf-box = "0.1.0"

Or using Cargo CLI:

cargo add rust-pdf-box

2. Your First Document

Create a blank PDF document, add a page, write text, and save:

use rust_pdf_box::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. Initialize a new PDF document
    let mut doc = PdfDocument::new();

    // 2. Add an A4 page
    let page_id = doc.add_blank_page(PDRectangle::a4())?;

    // 3. Write text onto the page
    let mut cs = doc.page_content_stream(page_id, AppendMode::Overwrite)?;
    cs.begin_text()?
        .set_font(PDType1Font::HelveticaBold, 22.0)?
        .set_non_stroking_color(Color::rgb(0.05, 0.45, 0.40))? // Techwasti Teal
        .set_text_matrix(Matrix::translation(50.0, 750.0))?
        .show_text("Hello from rust-pdf-box!")?
        .end_text()?;
    cs.finish()?;

    // 4. Save to file
    doc.save("hello_world.pdf")?;
    println!("Successfully generated hello_world.pdf");

    Ok(())
}

3. Watermarking in 3 Lines

Apply a semi-transparent diagonal watermark across all pages:

use rust_pdf_box::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut doc = PdfDocument::open("invoice.pdf")?;

    doc.stamp()
        .pages(PageRange::All)
        .watermark("CONFIDENTIAL", 54.0, Color::rgb(0.85, 0.1, 0.1), 45.0, 0.25)
        .apply(&mut doc.inner)?;

    doc.save("invoice_watermarked.pdf")?;
    Ok(())
}

4. Digital Signature with In-Memory Key

Digitally sign a PDF document adhering to ISO 32000 CMS/PKCS#7 with a visual appearance stamp:

use rust_pdf_box::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut doc = PdfDocument::open("contract.pdf")?;

    // Generate an in-memory X.509 v3 self-signed RSA-2048 signing key
    let key = SigningKey::generate_self_signed(
        "CN=Techwasti Signer, O=Techwasti Infotech, C=IN"
    )?;

    // Configure visual signature appearance
    let appearance = SignatureAppearance::new(1, PDRectangle::new(50.0, 50.0, 250.0, 100.0))
        .with_signer_name("Techwasti Infotech")
        .with_reason("Contract Approval")
        .with_location("Bangalore, India");

    // Apply detached PKCS#7 signature
    doc.signer()
        .with_key(key)
        .with_appearance(appearance)
        .sign_to_file("contract.pdf", "contract_signed.pdf")?;

    println!("Signed document successfully created!");
    Ok(())
}

5. Merging Documents

Merge multiple PDF files into one combined output:

use rust_pdf_box::manipulation::PDFMerger;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut merger = PDFMerger::new();
    merger.add_source("cover.pdf")?;
    merger.add_source("report.pdf")?;
    merger.add_source("appendix.pdf")?;

    merger.merge("complete_report.pdf")?;
    println!("Merged report generated!");
    Ok(())
}

6. Text Extraction

Extract plain text from an existing document:

use rust_pdf_box::prelude::*;
use rust_pdf_box::text::PDFTextStripper;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let doc = PdfDocument::open("sample.pdf")?;
    let stripper = PDFTextStripper::new();
    let text = stripper.get_text(&doc.inner)?;

    println!("Extracted Text:\n{}", text);
    Ok(())
}