Get your API key
How to convert PowerPoint to PDF (LibreOffice, Python, Node.js, and API)

How to convert PowerPoint to PDF (LibreOffice, Python, Node.js, and API)

Convert PPTX to PDF for free with PowerPoint, LibreOffice CLI, Python, or Node.js. Fix missing fonts, notes pages, and slide sizing, plus batch conversion.

11 min read

Converting a PowerPoint deck (.pptx or .ppt) to PDF produces a fixed-layout file that opens the same on every device, cannot be edited by mistake, and does not need PowerPoint to view. This guide covers five methods: PowerPoint's built-in export, LibreOffice headless CLI, Python automation, Node.js automation, and Google Slides. It also fixes the two problems that trip up most slide exports: substituted fonts and missing speaker notes.

How to convert PowerPoint to PDF in Microsoft PowerPoint

Microsoft PowerPoint has a built-in PDF export under File, Export. It produces one PDF page per slide at the deck's exact slide size, with vector text and shapes.

Windows:

  1. Open the .pptx file in PowerPoint.
  2. Click File, then Export, then Create PDF/XPS Document, and click Create PDF/XPS.
  3. In the dialog, click Options to choose what to publish: slides, handouts, notes pages, or an outline, plus the slide range.
  4. Pick a location and click Publish.

macOS:

  1. Open the .pptx file in PowerPoint.
  2. Click File, then Export, and choose PDF from the File Format dropdown.
  3. Set the range if needed, then click Export.

PowerPoint's own export produces the most faithful PDF because it uses the same layout engine that displays the slides on screen. It preserves gradients, shadows, SmartArt, and charts. This is the best option for one-off conversions when you have a PowerPoint license.

How to convert PowerPoint to PDF with LibreOffice (free, no license)

LibreOffice is a free, open-source office suite that reads .pptx and .ppt files and exports PDF from the command line without a GUI. It runs on Linux, macOS, and Windows and is the standard choice for servers and CI pipelines.

Install LibreOffice

# macOS
brew install --cask libreoffice
 
# Ubuntu / Debian
sudo apt install libreoffice
 
# Windows (winget)
winget install LibreOffice

Convert a single file

libreoffice --headless --convert-to pdf deck.pptx

The --headless flag runs LibreOffice without opening a window. The output deck.pdf appears in the current directory, one slide per page. Shapes and text render as vector graphics, and images keep their embedded resolution.

Convert every .pptx in a directory

libreoffice --headless --convert-to pdf --outdir ./pdfs *.pptx

LibreOffice processes files one at a time. On a 2024 MacBook Pro (M3), a 20-slide deck with images and charts converts in about 2 to 4 seconds. A 60-slide deck with dense graphics takes 6 to 12 seconds. The same LibreOffice headless workflow applies to Word and Excel files.

LibreOffice reads the slide size stored in the .pptx and produces a PDF page of matching dimensions. It renders slides only, not the notes layout. To include speaker notes, use PowerPoint or Google Slides, covered below.

How to fix fonts so slides look right

The most common PowerPoint to PDF problem is font substitution: text that looks correct in PowerPoint shifts, wraps differently, or spills off the slide in the PDF. This happens when the font used in the deck is not installed on the machine doing the conversion.

Two fixes cover almost every case:

FixHowWhen to use
Embed fonts in the deckFile, Options, Save, tick Embed fonts in the fileYou control the .pptx and export with PowerPoint
Install fonts on the serverAdd the .ttf/.otf files to the OS font directoryYou convert with LibreOffice on Linux or CI

For LibreOffice on Linux, install the Microsoft core fonts package so Calibri, Cambria, and Arial resolve correctly. Calibri is the default PowerPoint body font, so a server without it substitutes a wider or narrower face and every text box reflows. After installing fonts, clear the LibreOffice font cache by removing the user profile directory, then re-run the conversion.

Embedding fonts in the .pptx is the most portable fix because the file carries its own typefaces. It adds roughly 1 to 4 MB per deck depending on how many font families are used, and it only works for fonts whose license permits embedding.

How to convert PowerPoint to PDF with speaker notes

To keep speaker notes in the PDF, export from PowerPoint or Google Slides with a notes layout, because LibreOffice's CLI exports slides only.

In PowerPoint: File, Export, Create PDF/XPS, click Options, and under Publish what choose Notes Pages. Each PDF page then shows the slide at the top and the notes below it. Choose Handouts instead to fit two, three, or six slides per page for printing.

In Google Slides: File, Download is limited to slides, but File, Print, then Notes view in the print dialog, produces a notes-per-page PDF through the browser's print-to-PDF. For automation with notes, PowerPoint COM on Windows is the only method that exposes the notes layout programmatically.

How to convert PowerPoint to PDF in Python

Python has two practical approaches: call LibreOffice through subprocess for cross-platform servers, or drive PowerPoint through COM automation on Windows for exact fidelity.

Using subprocess with LibreOffice

This works on any operating system with LibreOffice installed and needs no PowerPoint license.

import subprocess
from pathlib import Path
 
def pptx_to_pdf(input_path: str, output_dir: str = ".") -> str:
    """Convert a .pptx file to PDF using LibreOffice headless."""
    subprocess.run(
        ["libreoffice", "--headless", "--convert-to", "pdf",
         "--outdir", output_dir, input_path],
        check=True,
        timeout=120,
    )
    stem = Path(input_path).stem
    return str(Path(output_dir) / f"{stem}.pdf")
 
pdf_path = pptx_to_pdf("q3-review.pptx", "./output")
print(f"Saved: {pdf_path}")

Batch convert a directory

from pathlib import Path
import subprocess
 
input_dir = Path("./decks")
output_dir = Path("./pdfs")
output_dir.mkdir(exist_ok=True)
 
pptx_files = list(input_dir.glob("*.pptx"))
 
for pptx in pptx_files:
    subprocess.run(
        ["libreoffice", "--headless", "--convert-to", "pdf",
         "--outdir", str(output_dir), str(pptx)],
        check=True,
        timeout=180,
    )
 
print(f"Converted {len(pptx_files)} files")

Using PowerPoint COM on Windows

When exact PowerPoint fidelity matters and the script runs on Windows with PowerPoint installed, drive PowerPoint directly through pywin32. This is the only Python path that can export notes pages.

import win32com.client
 
powerpoint = win32com.client.Dispatch("PowerPoint.Application")
deck = powerpoint.Presentations.Open(
    r"C:\decks\q3-review.pptx", WithWindow=False
)
 
# 32 = ppFixedFormatTypePDF
deck.ExportAsFixedFormat(r"C:\decks\q3-review.pdf", 32)
 
deck.Close()
powerpoint.Quit()

LibreOffice does not support concurrent conversions from one install directory. For parallel processing, give each worker its own --user-install profile, or run conversions sequentially in a queue.

How to convert PowerPoint to PDF in Node.js

The libreoffice-convert npm package wraps the LibreOffice CLI and returns a Buffer, which fits backends that already handle uploaded decks.

npm install libreoffice-convert
import { readFileSync, writeFileSync } from "fs";
import { convert } from "libreoffice-convert";
import { promisify } from "util";
 
const convertAsync = promisify(convert);
 
async function pptxToPdf(inputPath: string, outputPath: string) {
  const input = readFileSync(inputPath);
  const pdf = await convertAsync(input, ".pdf", undefined);
  writeFileSync(outputPath, pdf);
  console.log(`Saved: ${outputPath}`);
}
 
pptxToPdf("pitch.pptx", "pitch.pdf");

This spawns a LibreOffice process per conversion, so it fits low-volume or batch workloads rather than a high-throughput API endpoint. For a request-per-second API, keep a warm LibreOffice pool or move to direct HTML rendering (covered below).

How to convert PowerPoint to PDF with Google Slides

Google Slides converts .pptx to PDF in the browser with no local software. Upload the file to Google Drive, open it in Slides, then use File, Download, PDF document. Each slide becomes one PDF page at the deck's slide size.

For automation, the Google Slides export URL returns a PDF for a presentation you own:

https://docs.google.com/presentation/d/PRESENTATION_ID/export/pdf

This is a practical path when your decks already live in Google Drive. It exports slides only, not notes, so use the print-to-PDF route for notes pages.

Comparison: which PowerPoint to PDF method to use?

MethodRequires PowerPoint licenseRuns headlessLayout fidelityNotes pagesBest for
Microsoft PowerPointYesNoExactYesOne-off, highest fidelity
LibreOffice CLINoYesHighNoServers, CI/CD, batch
Python (subprocess)NoYesHighNoLinux and cross-platform scripts
Python (win32com)Yes (Windows)YesExactYesWindows servers with PowerPoint
Node.js (libreoffice-convert)NoYesHighNoNode.js backends
Google SlidesNoYes (cloud)GoodVia printNo local install, cloud-first

For production servers that need no license, LibreOffice with the deck's fonts installed is the standard choice. PowerPoint's own export is the most accurate and the only option that includes notes pages without extra work. Both produce vector text and shapes, so slides stay sharp at any zoom.

Common PowerPoint to PDF issues and fixes

Fonts look wrong or text overflows the slide. The font used in the deck is not installed on the conversion machine, so LibreOffice substitutes a different one. Fix: install the exact fonts (Microsoft core fonts for Calibri and Cambria on Linux), or embed fonts in the .pptx via File, Options, Save.

Animations and transitions are gone. A PDF is static, so every animation collapses to its final frame and each slide becomes one page. This is expected. To keep motion, export to video with File, Export, Create a Video instead.

The PDF page is the wrong shape. The PDF matches the deck's slide size. A 16:9 deck gives a landscape page, a 4:3 deck gives a squarer one. Fix: set the size in Design, Slide Size before exporting.

Embedded video or audio is missing. PDF does not support playable media, so PowerPoint drops it and keeps only the poster image. Link to the media externally if viewers need it.

The PDF is very large. Decks with high-resolution photos produce large PDFs. After conversion, run the file through the PDF4.dev compress tool. A 30 MB slide deck with photos typically drops to 4 to 8 MB. To combine several exported decks into one document, use the merge PDF tool, and to pull out a single section use the split PDF tool.

When to generate a PDF from data instead of PowerPoint

PowerPoint to PDF works well for decks a person built and wants to share as a fixed document. But for reports, one-pagers, and pitch summaries you generate from data on a schedule, starting from a .pptx is fragile. Font substitution, slide-size drift, and manual layout compound when you produce hundreds of documents a day.

PDF4.dev takes a different path: you write an HTML template with CSS for exact layout, inject the values through Handlebars variables, and render the PDF with a headless browser. The rendering engine (Chromium) is the same one that displays the template in a browser, so the output is identical every time, with no font-cache or slide-size guesswork.

const response = await fetch("https://api.pdf4.dev/v1/render", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.PDF4_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    template_id: "sales-one-pager",
    data: {
      client: "Acme Corp",
      quarter: "Q3 2026",
      highlights: [
        { metric: "Revenue", value: "$1.24M" },
        { metric: "New logos", value: "18" },
      ],
    },
  }),
});
 
const pdf = await response.arrayBuffer();

This produces a landscape page with exact fonts, exact positioning, and no font-substitution surprises, because you control the layout in CSS instead of a slide editor. For data-driven documents at scale, HTML to PDF with PDF4.dev is more predictable than converting .pptx files. It is the same reasoning that applies to converting Excel to PDF for generated reports.

Try the free HTML to PDF toolTry it free

Summary

  • Embed fonts or install them on the server first, so text does not reflow when the deck moves to another machine.
  • For one-off conversions with a license, use PowerPoint's File, Export, Create PDF/XPS. It is the only method that includes notes pages without extra work.
  • For free conversions without PowerPoint, install LibreOffice and run libreoffice --headless --convert-to pdf deck.pptx.
  • For Python automation, call LibreOffice through subprocess, or use win32com on Windows with PowerPoint installed.
  • For Node.js backends, use the libreoffice-convert npm package.
  • For cloud-first workflows, export from Google Slides via File, Download, PDF document.
  • For documents you generate from data, skip the slide file and render directly from an HTML template with PDF4.dev for exact control over layout, fonts, and page size. See the complete guide to PDF conversion for the full picture, and convert Word to PDF for the document side of Office.

Free tools mentioned:

Html To PdfTry it freeCompress PdfTry it freeMerge PdfTry it freeSplit PdfTry it free

Start generating PDFs

Build PDF templates with a visual editor. Render them via API from any language in ~300ms.