Skip to main content

Multi-Format Documents

paperjam is not limited to PDF. It can open, extract content from, and convert between six document formats: PDF, DOCX, XLSX, PPTX, HTML, and EPUB.

Opening any document​

paperjam.open() detects the format automatically from the file extension or magic bytes. For PDF files it returns a Document; for everything else it returns an AnyDocument:

import paperjam

# PDF — returns Document
pdf = paperjam.open("report.pdf")

# DOCX — returns AnyDocument
docx = paperjam.open("proposal.docx")

# XLSX — returns AnyDocument
xlsx = paperjam.open("budget.xlsx")

This works with in-memory bytes too. When the format cannot be inferred from a file extension, pass it explicitly:

doc = paperjam.open(raw_bytes, format="docx")

Format detection​

If you need to know the format before opening, use detect_format():

fmt = paperjam.detect_format("mystery_file")
print(fmt) # "pdf", "docx", "xlsx", "pptx", "html", "epub", or None

It inspects magic bytes first, then falls back to the file extension. Returns None when the format is unrecognised.

Document vs AnyDocument​

paperjam has two document classes:

ClassReturned forCapabilities
DocumentPDFFull feature set: forms, signatures, rendering, annotations, redaction, encryption, page manipulation, and everything in AnyDocument
AnyDocumentDOCX, XLSX, PPTX, HTML, EPUBText extraction, table extraction, structure extraction, image extraction, Markdown conversion, format conversion

PDF-specific operations like redact_text(), encrypt(), fill_form(), sign(), render_page(), and add_watermark() are only available on Document. The extraction and conversion methods are shared.

Opening each format​

PDF​

doc = paperjam.open("report.pdf")
print(doc.page_count)
print(doc.pages[0].extract_text())

DOCX (Word)​

doc = paperjam.open("proposal.docx")
print(doc.page_count)
print(doc.extract_text())

XLSX (Excel)​

Each sheet is treated as a page. Tables are extracted natively from the spreadsheet structure:

doc = paperjam.open("budget.xlsx")
print(f"{doc.page_count} sheets")

tables = doc.extract_tables()
for table in tables:
print(table.to_csv())

PPTX (PowerPoint)​

Each slide is a page:

doc = paperjam.open("deck.pptx")
for i in range(doc.page_count):
text = doc.extract_text(pages=[i + 1])
print(f"Slide {i + 1}: {text[:80]}...")

HTML​

doc = paperjam.open("article.html")
md = doc.to_markdown()

EPUB​

doc = paperjam.open("book.epub")
print(doc.metadata)
text = doc.extract_text()

Common extraction methods​

All document types (both Document and AnyDocument) support these extraction methods:

doc = paperjam.open("any_file.docx")

# Plain text
text = doc.extract_text()

# Text with line positions
lines = doc.extract_text_lines()

# Tables
tables = doc.extract_tables()
for table in tables:
print(table.headers)
for row in table.rows:
print(row)

# Structured content (headings, paragraphs, list items, tables)
blocks = doc.extract_structure()

# Embedded images
images = doc.extract_images()

# Markdown conversion
md = doc.to_markdown()

Context manager support​

Both Document and AnyDocument support the context manager protocol for automatic cleanup:

with paperjam.open("data.xlsx") as doc:
tables = doc.extract_tables()
# resources are released when the block exits

When to use AnyDocument directly​

In most cases, paperjam.open() is all you need. If you want to be explicit, you can instantiate AnyDocument directly:

from paperjam import AnyDocument

doc = AnyDocument("report.docx")
doc = AnyDocument(raw_bytes, format="pptx")

See the AnyDocument API reference for the full method list and the Format Conversion guide for converting between formats.