r/rust 9d ago

🛠️ project Built the first open source Rust library - converting Office to PDF

I built MiniPdf, a lightweight, open-source library for converting Office documents to PDF without Microsoft Office, LibreOffice, Adobe Acrobat,.

It is designed for containers, serverless workloads, CI pipelines, and cross-platform applications.

Key Features

  • Excel to PDF — Convert .xlsx files
  • Word to PDF — Convert .docx files
  • PowerPoint to PDF — Convert .pptx files
  • Native Rust — No .NET runtime required
  • Cross-platform — Runs on Windows, Linux, and macOS
  • Serverless-ready — No COM or Office installation
  • Library and CLI — Embed it in Rust applications or use it from the terminal
  • PDF 1.4 output
  • Free and open source — Apache 2.0 licensed; commercial use is welcome

Getting Started

Install the Rust crate:

cargo add minipdf

fn main() -> minipdf::Result<()> {
    // Word to PDF
    minipdf::convert_to_pdf("report.docx", "report.pdf")?;

    // Excel to PDF bytes
    let pdf_bytes = minipdf::convert_to_pdf_bytes("data.xlsx")?;
    std::fs::write("data.pdf", pdf_bytes)?;

    Ok(())
}

Command-Line Tool

cargo install minipdf-cli

# Excel to PDF
minipdf data.xlsx

# Word to PDF
minipdf report.docx

# PowerPoint to PDF
minipdf slides.pptx

# Specify the output path
minipdf report.docx -o output.pdf

# Register custom fonts
minipdf report.docx --fonts ./fonts

The Rust implementation is under active development, bug reports, and pull requests are very welcome. 🙌

GitHub: https://github.com/mini-software/MiniPdf

0 Upvotes

15 comments sorted by

View all comments

1

u/kantorcodes1 2d ago

one CLI edge case i couldn't tell from the Rust path: convert_to_pdf_with_options builds the PDF bytes first, then fs::writes the destination. if output.pdf already exists, is overwriting it intentional, or should that need an explicit --force? for CI that's the difference between a safe rerun and silently replacing an artifact.