Skip to content

API overview

Full docstrings live in the package (help(pylopdf.Document)); this page is a map. All page numbers are 0-based except get_toc / set_toc (1-based, pymupdf-compatible). All coordinates are top-left-origin display space. The API stability policy defines the public boundary and deprecation lifecycle.

Document

pylopdf.Document(filename=None, stream=None, password=None, max_decompressed_size=None, *, limits=None)pylopdf.open() is an alias constructor. Context-manager support included. Password input stops at 127 UTF-8 bytes.

Member Purpose
doc[i] / load_page(pno) / iteration Page views (negative indices; re-fetch after structural changes)
page_count / len(doc) number of pages
limits / complexity immutable open-time resource policy / cheap structural facts without stream decoding
needs_pass / is_encrypted / authenticate(pw) encryption state & unlock with a 127-byte password boundary (pymupdf semantics)
is_repaired whether opening repaired an incorrect final classic startxref; saving normalizes the xref data
metadata / set_metadata(dict) eight standard Info fields (UTF-16BE aware); 1 MiB aggregate text boundary and atomic writes
get_page_text(pno, option) "text" / "words" / "blocks" / "dict"
get_text(pages=None) batched plain text for up to 4,096 pages sharing one interpreter font cache (None means every page)
to_markdown(pages=None, table_strategy="lines", max_size=64 MiB) page-at-a-time two-pass Markdown with a bounded linear entry builder; max 4,096 pages and cumulative UTF-8 output (None opts out), with headings, CJK, emphasis, lists, columns, vertical order, and table controls
render_page(..., max_size=64 MiB) / render_pages(..., workers=, max_size=512 MiB) / render_page_svg(..., max_size=64 MiB) bounded PNG bytes, ordered parallel batches capped at 4,096 pages and cumulative encoded output, or bounded UTF-8 SVG (None opts out)
compress_images(dpi=150, quality=75) lossy, placement-aware downsampling and JPEG recompression of safe DCT or Flate raster XObjects; returns typed byte/count statistics
set_fallback_font(font, kind=, index=, max_font_size=64 MiB) bounded CJK fallback for non-embedded fonts; None opts trusted font input out
select / delete_page(s) / insert_pdf / new_page / copy_page page management; select/delete/insert batches are capped at 4,096 entries
get_toc() / set_toc(toc) cycle-aware bounded outlines (1-based pages; 4,096 entries/nodes, 8,192 edges, 64 levels, 1 MiB text)
get_page_labels() / set_page_labels(labels) page label ranges; fixed caps: 4,096 entries/nodes, 32 levels, 1 MiB label text
get_form_fields() / set_form_field(name, value, fontfile=, fontbuffer=, fontindex=, max_font_size=64 MiB) bounded AcroForm list & fill with 1 MiB caller name/value input plus native, bounded widget appearances and font input
embfile_add(..., max_size=64 MiB) / embfile_names / embfile_get(name, max_size=64 MiB) / embfile_del attachments with symmetric input/decoded-output defaults plus 1 MiB caller text, bounded metadata, and inline FileSpec clone shapes; max_size=None explicitly opts out
get_pdfa_claim(max_size=1 MiB) bounded XMP PDF/A declaration read; max_size=None explicitly opts out, and this is not validation
save(...) / tobytes(..., max_size=512 MiB) atomic replacement after a complete same-directory streamed write / bounded PDF bytes; garbage= deflate= object_streams= and 127-byte-bounded user_pw= / owner_pw=; max_size=None opts out
close() also via with

compress_images() interprets every page to find each indirect raster object's largest placement, then edits a lopdf clone atomically. dpi=None disables downsampling but retains quality recompression. The conservative boundary is direct, single-filter, 8-bit DeviceGray/DeviceRGB DCT or Flate streams without masks or custom decode arrays. DCT decode parameters are excluded; Flate may use no predictor or a consistent PNG predictor. Unsupported interpreted indirect images and encodings that would not be smaller are skipped; inline images are not considered. One call rejects more than 65,536 interpreted indirect raster placements. Repeating the same settings is idempotent.

Page

Member Purpose
number / parent / get_label() identity & display label
get_text(option) / search_for(needle, max_hits=4096) extraction and bounded case-insensitive search; terms stop at 4,096 UTF-8 bytes and None opts trusted result sets out
get_text_ocr(dpi=, engine=, tile_size=, overlap=, min_confidence=, rotation=, clip=) local PP-OCRv6 positioned words without editing; rotation corrects input clockwise and clip uses display coordinates
apply_ocr(..., rotation=, clip=, skip_existing=True) recognize and insert an orientation-aware invisible searchable layer; skip existing text in the selected region by default
find_tables(strategy="lines", clip=None) complete or conservatively refined vector-bordered grids and merged cells; "text" opts into borderless detection; clip is a display-coordinate region
to_markdown(table_strategy="lines", max_size=64 MiB) single-page Markdown with the same table and UTF-8 output controls
get_images() drawn images (bbox, JPEG passthrough / PNG); rejects partial output above 4,096 placements, 64,000,000 cumulative pixels, or 64 MiB of payloads
get_drawings() interpreted vector fill/stroke paths with display-space line/cubic geometry and normalized paint/stroke properties; rejects partial output above 8,192 paths, 131,072 commands, or 131,072 aggregate dash values
get_pixmap(scale=, dpi=, background=, clip=) / render(max_size=64 MiB) / render_svg(max_size=64 MiB) bounded PNG / UTF-8 SVG rendering; clip uses display coordinates
rotation / set_rotation(deg) display rotation
mediabox / cropbox / rect / set_mediabox / set_cropbox page boxes
insert_image(rect, filename= / stream= / pixmap=, rotate=, keep_proportion=, overlay=, max_size=64 MiB, max_pixels=64,000,000) draw bounded JPEG/PNG or reuse an already bounded RGBA Pixmap; None opts trusted encoded input or PNG pixels out; rotate turns clockwise in 90-degree steps
show_pdf_page(rect, src, pno=, keep_proportion=, overlay=) overlay a PDF page as vectors; src may be the same document
insert_text(point, text, fontsize=, fontname=, fontfile=, fontbuffer=, fontindex=, color=, overlay=, max_font_size=64 MiB, max_text_size=1 MiB) bounded UTF-8 and 4,096-line standard-14 WinAnsi or shaped subset text; pylopdf[cjk] auto-selects its JP font; None opts the corresponding trusted input out
insert_textbox(rect, text, fontsize=, fontname=, fontfile=, fontbuffer=, fontindex=, color=, align=, expandtabs=, lineheight=, overlay=, max_font_size=64 MiB, max_text_size=1 MiB) bounded UAX #14 wrapping with Core 14, OpenType, or auto-selected JP metrics; physical and wrapped layout stop at 4,096 lines, tab expansion is preflighted, and overflow draws nothing
insert_ocr_text_layer(words, rotation=) orientation-aware invisible OCR layer; fixed caps: 4,096 words and 1 MiB UTF-8 text per call
replace_text(search, replacement, default_char=, max_size=64 MiB) atomic copy-on-write simple-encoded replacement with bounded input/output
annots() / get_links() / add_highlight_annot(...) / add_link_annot(rect, uri) bounded annotation/link reads and creation; rendering conservatively supplies missing appearances for bounded RGB Highlight, Underline, StrikeOut, and Squiggly dictionaries with valid QuadPoints without changing the source PDF

get_drawings() returns DrawingInfo dictionaries with type="f", "s", or "fs", self-contained line/cubic items, rect, RGB/opacity, fill rule, width, cap, join, and dashes. Pattern paints retain their geometry with None color and opacity. Clipping paths, clip-resolved visibility, group and soft-mask structure, optional-content layer names, text, images, and annotations are not returned; optional-content visibility is still applied. The result is rejected rather than truncated above 8,192 paths or 131,072 commands.

Embedded-font insert_text requires one font containing every glyph. If no source is passed, pylopdf[cjk] auto-selects its JP-subset Noto Sans for Japanese/Han, or Noto Serif for a Times fontname. This is one whole-run font, not per-glyph fallback. Pass an explicit OpenType font for Hangul, locale-specific Chinese glyph forms, other scripts, or another typeface. Each line is shaped, but bidirectional paragraph layout and wrapping remain outside this primitive. RTL shaping renders correctly; extraction currently follows visual rather than logical order.

insert_textbox adds wrapping without becoming a rich-text engine. It preserves explicit newlines, expands tabs, breaks CJK at Unicode opportunities, and uses grapheme-safe emergency breaks for overlong words. Alignment constants are TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT, and TEXT_ALIGN_JUSTIFY. A negative return value is the vertical deficit; no page content or font resource is added in that case.

set_form_field generates appearances for text, combo/list choice, checkbox, and radio widgets. WinAnsi text auto-fits in Helvetica; pass an OpenType fontfile or fontbuffer for subset-embedded Unicode. With pylopdf[cjk] installed, non-WinAnsi values try its JP-subset sans font; pass a matching font for Hangul or locale-specific Chinese typography. Existing non-empty checkbox/radio appearances are preserved and missing states receive vector marks. Missing appearances on other WinAnsi fields are completed at the same time; NeedAppearances is cleared only when every fillable widget is self-contained. Comb text fields honor inherited MaxLen and alignment, center each Unicode grapheme in its position, and reject overlength values atomically. Rich text, pushbutton actions, and signatures are not generated.

Table.confidence is a deterministic 0–1 ranking heuristic, not a calibrated probability. Table.diagnostics is a TableDiagnostics tuple containing the strategy and, for borderless text tables, em-normalized alignment error, minimum gutter and row-gap variation. Complete vector grids score 1.0, sparse-rule hybrid grids score 0.95, and both have None for those text-only metrics. TableFinder.strategy and TableFinder.clip preserve the settings used.

Module level

Name Purpose
peek_metadata(filename=None, stream=None, password=None, *, max_file_size=None) fast metadata/page-count probe with optional input-size rejection and a 127-byte password boundary; repaired reports bounded classic-startxref recovery
Permissions encryption permission flags (IntFlag)
Rect rectangle NamedTuple with width / height
TextPage / TextBlock / TextLine / TextSpan get_text("dict") TypedDict hierarchy
ImageInfo / ImageCompressionResult / DrawingInfo / AnnotationInfo / LinkInfo / FormFieldInfo TypedDict contracts for mapping-shaped page, document-operation, and form results
PageLabelInfo / PageLabelSpec normalized page-label output / setter input contracts
DocumentMetadata / MetadataUpdate / MetadataProbe metadata output / partial update / fast-probe contracts
DocumentLimits / DocumentComplexity immutable untrusted-input budgets, including max_interpretation_size for the PDF snapshot and max_text_glyphs for positioned layout / cheap structural TypedDict
OcrEngine / OcrWord reusable pure-Rust PP-OCR engine / positioned result contract
OcrRotation / DrawingItem / WordEntry / BlockEntry / FormFieldType runtime-importable OCR-rotation, vector-command, tuple and literal type aliases
TableFinder / Table / TableDiagnostics owned table geometry, cell text (None for merged continuations), strategy and confidence evidence; Table.to_markdown(max_size=64 MiB) preflights escaped UTF-8 output
PdfError / LimitError / PasswordError / OcrError / DocumentClosedError / EncryptedDocumentError / StalePageError exception hierarchy; limit failures expose a stable .code (ValueError-compatible base)
Pixmap Immutable RGBA8 pixels: samples / width / height / stride / n / tobytes(max_size=64 MiB) / streaming, failure-atomic PNG-only save(path); cp314t also supports read-only zero-copy memoryview()
PylopdfWarning recoverable interpretation warnings (xref repair, font resolution, image decode)

The TypedDict contracts affect static typing only; values remain ordinary pymupdf-style dictionaries. LinkInfo requires kind and from, with destination-specific optional keys. PageLabelSpec requires startpage; style, prefix, and firstpagenum retain their runtime defaults.