Skip to content

Latest commit

 

History

History
279 lines (205 loc) · 6.41 KB

File metadata and controls

279 lines (205 loc) · 6.41 KB

API Quick Reference

A condensed view of every public function in exis_pdfeditor. For full parameter docs see the PyPI page.


Initialization

import exis_pdfeditor

# Trial (14 days, no key required)
exis_pdfeditor.initialize()

# Licensed
exis_pdfeditor.initialize("XXXX-XXXX-XXXX-XXXX")

# Or via environment variable
# export EXIS_PDF_LICENSE_KEY=XXXX-XXXX-XXXX-XXXX

Inspect — license-free

info = exis_pdfeditor.inspect("file.pdf")
# -> info.version, info.pageCount, info.title, info.author,
#    info.isEncrypted, info.hasFormFields, info.formFieldCount,
#    info.fontsUsed, info.pages[]

Diagnostic dump — license-free

dump = exis_pdfeditor.dump_structure("file.pdf")
# -> dump.totalObjects, dump.streamObjectCount, dump.isEncrypted, ...

Text extraction

result = exis_pdfeditor.extract_text("file.pdf")
# -> result.fullText, result.pages[].text

result = exis_pdfeditor.extract_text("file.pdf", pages=[1, 3])

structured = exis_pdfeditor.extract_text_structured("file.pdf")
# -> structured.pages[].textBlocks[].x, .y, .fontName, .fontSize, .text

Find & Replace

# Single
exis_pdfeditor.find_replace("in.pdf", "out.pdf", "old", "new")

# Multiple pairs
exis_pdfeditor.find_replace("in.pdf", "out.pdf", pairs=[
    {"search": "{{NAME}}", "replace": "John"},
    {"search": "{{DATE}}", "replace": "2026-04-07"},
])

# Regex
exis_pdfeditor.find_replace("in.pdf", "out.pdf", pairs=[
    {"search": r"\d{3}-\d{2}-\d{4}", "replace": "[SSN]", "isRegex": True},
])

# All options
exis_pdfeditor.find_replace(
    "in.pdf", "out.pdf",
    "find", "replace",
    case_sensitive=False,
    whole_word=True,
    use_regex=False,
    page_range=[1, 2, 3],
    text_fitting="adaptive",   # none | preserve_width | fit_to_page | adaptive
    min_horizontal_scale=70,
    max_font_size_reduction=1.5,
    replacement_text_color={"r": 1, "g": 0, "b": 0},
    replacement_highlight_color={"r": 1, "g": 1, "b": 0},
    replacement_bold=True,
    replacement_underline=False,
    replacement_strikethrough=False,
    preserve_form_fields=True,
    use_incremental_update=True,
)

Merge / Split / Extract

exis_pdfeditor.merge(["a.pdf", "b.pdf", "c.pdf"], "merged.pdf")

exis_pdfeditor.split("doc.pdf", "out_dir/")
# -> result.pageCount, result.files[]

exis_pdfeditor.extract_pages("doc.pdf", "subset.pdf", pages=[1, 3, 5])

Forms

fields = exis_pdfeditor.list_fields("form.pdf")
# -> [field.name, field.type, field.value, field.displayName, field.options]

exis_pdfeditor.fill_form("form.pdf", "filled.pdf",
    fields={"FirstName": "John", "Email": "j@example.com"},
    flatten=True,  # optional - lock values into page content
)

Redaction

exis_pdfeditor.redact("doc.pdf", "redacted.pdf", redactions=[
    {"text": "John Doe", "replaceWith": "[NAME]"},
    {"text": r"\d{3}-\d{2}-\d{4}", "isRegex": True, "replaceWith": "[SSN]"},
    {"area": {"x": 100, "y": 700, "width": 200, "height": 20}, "pageNumber": 1},
])

Watermark / Stamp

exis_pdfeditor.watermark("in.pdf", "out.pdf", "DRAFT")

exis_pdfeditor.watermark("in.pdf", "out.pdf", "CONFIDENTIAL",
    position="across",     # top | bottom | center | across
    font_size=72,
    text_color={"r": 1, "g": 0, "b": 0},
    opacity=0.15,
    page_range=[1, 2],
)

exis_pdfeditor.stamp("in.pdf", "out.pdf", "letterhead.pdf",
    mode="overlay",        # overlay | underlay
    opacity=1.0,
    page_range=[1],
)

Optimize

exis_pdfeditor.optimize("in.pdf", "out.pdf")

exis_pdfeditor.optimize("in.pdf", "out.pdf",
    downsample_images=True,
    max_image_dpi=150,
    remove_metadata=True,
)

Encrypt / Decrypt

exis_pdfeditor.encrypt("in.pdf", "out.pdf",
    user_password="openme",
    owner_password="secret",
    permissions=["Print", "CopyText"],
    # Available: Print, ModifyContents, CopyText, AddAnnotations,
    #            FillForms, PrintHighQuality, All
)

exis_pdfeditor.decrypt("in.pdf", "out.pdf", password="openme")

Page editing

exis_pdfeditor.rotate("in.pdf", "out.pdf", angle=90)
exis_pdfeditor.rotate("in.pdf", "out.pdf", angle=180, pages=[2, 4])

exis_pdfeditor.crop("in.pdf", "out.pdf",
    rect={"x": 50, "y": 50, "width": 500, "height": 700},
)

exis_pdfeditor.reorder("in.pdf", "out.pdf", order=[3, 1, 2])

exis_pdfeditor.delete_pages("in.pdf", "out.pdf", pages=[2, 4])

Images

result = exis_pdfeditor.find_images("doc.pdf")
# -> result.totalImages, result.images[].index, .pixelWidth, .pixelHeight,
#    .colorSpace, .format, .pageNumbers

# Save extracted images to disk
exis_pdfeditor.find_images("doc.pdf", output_dir="extracted/")

# Replace all images
exis_pdfeditor.replace_image("doc.pdf", "out.pdf", "new_logo.png")

# Replace specific images by index, scoped to a page
exis_pdfeditor.replace_image("doc.pdf", "out.pdf", "new_logo.jpg",
    image_indices=[0, 2],
    page_range=[1],
    scale_mode="scale_to_fit",
    # match_original_size | preserve_aspect_ratio | scale_to_fit
)

Digital signatures

exis_pdfeditor.sign("in.pdf", "out.pdf",
    cert_path="cert.pfx",
    cert_password="certpass",
    reason="Approved",
    location="New York, NY",
    signer_name="John Doe",
)

# Visible signature box
exis_pdfeditor.sign("in.pdf", "out.pdf",
    cert_path="cert.pfx",
    cert_password="certpass",
    visible=True,
    page=1,
    rect={"x": 50, "y": 50, "width": 200, "height": 60},
)

# Verify
sig = exis_pdfeditor.verify("signed.pdf")
# -> sig.isSigned, sig.signerName, sig.isValid, sig.reason, sig.signDate

# Multi-signature
all_sigs = exis_pdfeditor.verify("signed.pdf", all_signatures=True)

PDF/A

result = exis_pdfeditor.pdfa_validate("doc.pdf", level="2b")
# Levels: 1b | 2b | 2u | 3b | 3u
# -> result.isCompliant, result.violations[].code, .message, .canAutoFix

exis_pdfeditor.pdfa_convert("doc.pdf", "archive.pdf", level="2b")

Licensing summary

Tier Behavior
Free (no init) inspect(), pdfa_validate(), dump_structure()
Trial (init with no key) All features, 14 days
Licensed (init with key) All features, no expiry
Evaluation (after trial) All features but limited to 3 pages per document

Purchase: pdfbatcheditor.com/developers — $499 / developer / year.