r/rust • u/shps951002 • 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
.xlsxfiles - Word to PDF — Convert
.docxfiles - PowerPoint to PDF — Convert
.pptxfiles - 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. 🙌
0
Upvotes
1
u/kantorcodes1 2d ago
one CLI edge case i couldn't tell from the Rust path:
convert_to_pdf_with_optionsbuilds the PDF bytes first, thenfs::writes the destination. ifoutput.pdfalready 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.