office2pdf
Pure-Rust library and CLI for converting DOCX, XLSX, and PPTX files to PDF.
No LibreOffice, no Chromium, no Docker — just a single binary powered by Typst.
Features
- DOCX — paragraphs, inline formatting (bold/italic/underline/color), tables, images, drawing shapes, ordered/nested lists, syntax-highlighted code, headers/footers, page setup
- PPTX — slides, text boxes, shapes, tables (with theme-based table styles), images, slide masters, speaker notes, gradient backgrounds, shadow/reflection effects
- XLSX — sheets, cell formatting, merged cells, column widths, row heights, conditional formatting (DataBar, IconSet, and formula rules)
- PDF/A-2b — archival-compliant output via
--pdf-a - Embedded font extraction — fonts embedded in PPTX/DOCX are automatically extracted, deobfuscated, and used during conversion
- macOS Office font auto-discovery — PowerPoint/Word/Excel bundled fonts and Office cloud font caches are searched automatically
- WASM — runs in browsers and Node.js via WebAssembly, with optional caller-provided or feature-gated Simplified Chinese fonts
- Zero external dependencies — runs as a standalone executable
Installation
Library
[]
= "0.6.7"
CLI
Prebuilt binaries
Every GitHub release ships standalone CLI binaries — no Rust toolchain needed:
| Platform | Asset |
|---|---|
| Linux x86_64 (glibc) | office2pdf-<version>-x86_64-unknown-linux-gnu.tar.gz |
| Linux x86_64 (static musl) | office2pdf-<version>-x86_64-unknown-linux-musl.tar.gz |
| Linux ARM64 | office2pdf-<version>-aarch64-unknown-linux-gnu.tar.gz |
| macOS Apple Silicon | office2pdf-<version>-aarch64-apple-darwin.tar.gz |
| macOS Intel | office2pdf-<version>-x86_64-apple-darwin.tar.gz |
| Windows x86_64 | office2pdf-<version>-x86_64-pc-windows-msvc.zip |
On Linux and macOS, download, extract, and place the binary on your PATH:
VERSION=v0.6.7
TARGET=x86_64-unknown-linux-gnu # pick your platform's target from the table above
|
On Windows, unzip the archive and add office2pdf.exe to your PATH.
The macOS binaries are not notarized. Binaries downloaded with a browser are quarantined by Gatekeeper; clear the flag with xattr -d com.apple.quarantine office2pdf (downloads via curl are unaffected).
Quick Start
As a library
// Simple one-liner
let result = convert.unwrap;
write.unwrap;
// With options
use ;
let options = ConvertOptions ;
let result = convert_with_options.unwrap;
write.unwrap;
// In-memory conversion
use Format;
let docx_bytes = read.unwrap;
let result = convert_bytes.unwrap;
write.unwrap;
CLI
# Single file
# Explicit output path
# Batch conversion
# With options
On macOS, office2pdf automatically searches Microsoft Office app fonts and local Office font caches before falling back to regular system fonts. --font-path is only needed as an override for custom local fonts.
WASM (Browser / Node.js)
Build with wasm-pack:
The default build does not add a CJK font. For zero-configuration Simplified
Chinese fallback, opt in to the 3.3 MiB GB2312 subset (this feature implies
wasm):
Use from JavaScript:
import init from './pkg/office2pdf.js';
await ;
const docxBytes = ;
const pdfBytes = ;
// Or use the generic API with a format string
const pdfBytes2 = ;
// Register a font for this converter and make it the final fallback for every
// emitted font chain. The result-bearing API preserves structured warnings.
const fontBytes = ;
const converter = ;
converter.;
converter.;
const result = converter.;
const pdfBytes3 = result.;
The compatibility functions return PDF bytes directly:
convertToPdf(data, format), convertDocxToPdf(data),
convertPptxToPdf(data), and convertXlsxToPdf(data). Their
*WithResult counterparts return ConversionResult, which exposes pdf,
warningCount, and warningAt(index). Office2PdfConverter provides the same
result-bearing methods together with registerFont, clearFonts,
setLastResortFontFamily, and clearLastResortFontFamily.
Browser and Node.js builds use the bundled Typst fallback fonts and also honor
font faces embedded inside DOCX and PPTX files. Filesystem font paths remain
unavailable in WASM, but callers can supply standalone TTF, OTF, or TTC bytes
through Office2PdfConverter. When no registered or embedded face covers a
CJK run, the result-bearing API emits a fallback-used warning whose to
value is .notdef in the default build.
With wasm-cjk-font, Noto Sans CJK SC is automatically appended when the
caller has not configured another last-resort family. The subset covers the
complete GB2312 repertoire (7,445 characters, including 6,763 Han characters)
plus printable ASCII. It is not full Traditional Chinese, Japanese, or Korean
coverage. The warning to value identifies Noto Sans CJK SC when the bundle
is used. An explicit setLastResortFontFamily call takes precedence.
Native Rust callers can use the same per-conversion path through
ConvertOptions::font_bytes and ConvertOptions::last_resort_font_family.
CLI Options
| Flag | Description |
|---|---|
-o, --output <PATH> |
Output file path (single input only) |
--outdir <DIR> |
Output directory for batch conversion |
--paper <SIZE> |
Paper size: a4, letter, legal |
--landscape |
Force landscape orientation |
--pdf-a |
Produce PDF/A-2b compliant output |
--sheets <NAMES> |
XLSX sheet filter (comma-separated) |
--slides <RANGE> |
PPTX slide range (e.g. 1-5 or 3) |
--font-path <DIR> |
Additional font directory override (repeatable) |
Supported Formats
| Format | Status | Key Features |
|---|---|---|
| DOCX | Supported | Text, tables, images, drawing shapes, lists, code highlighting, headers/footers, page setup |
| PPTX | Supported | Slides, text boxes, shapes, tables, images, masters, gradients, effects |
| XLSX | Supported | Sheets, formatting, merged cells, column/row sizing, conditional formatting |
License
Licensed under Apache License, Version 2.0.