Skip to main content

A-PDF

A-PDF is a fast, command-line tool designed to replace Unicode and Hex text directly within PDF content streams.

Features

  • Direct Stream Replacement: Modifies the underlying PDF streams directly for fast and precise text replacement.
  • Unicode & Hex Support: Replace text using standard string replacements that are automatically encoded to the document's fonts.
  • Spacing Compensation: Automatically compensates for TJ (Text Justification) width adjustments after text replacements to preserve document layout (can be disabled).
  • Strict Mode: Optionally fail replacements if text is missing or the font cannot encode the requested characters.
  • Fallback Font Support: Embed a custom TrueType font when the PDF's subset font lacks a glyph, or disable fallback entirely.
  • Page Selection: Select specific pages to process.

Installation

You can run the tool directly using uv, which will automatically handle dependencies:

uv add apdf # or As a tool: uv tool install apdf
# then Run it
uv run apdf --help

Or simply use it in your standard Python environment.

pip install apdf

# Run 
apdf --help

Usage As Library

from apdf import replace_pdf_text_detailed

rep = replace_pdf_text_detailed(
    input_pdf="Test1.pdf",
    output_pdf="Test1_out.pdf",
    replacements={
        "Old Text": "New Text",
        # "Hello": "World",
        # "2026": "2027", 
    },

    # Optional parameters:
    #pages={2, 3, 4},       # Only these pages
    # pages=2,             # Only page 2
    # pages=range(1, 6),   # Pages 1 through 5
    # pages=None,          # All pages (default)

    # fallback_font="FONT.ttf",
    # font_fallback=True,
    # strict=True,
)

print("Replacements:", rep.replacements)
print("Changed streams:", rep.changed_streams)
print("Scanned streams:", rep.scanned_streams)
print("Missing:", rep.missing)
print("Encoding failures:", rep.encoding_failures)

Usage As CLI Tool

apdf [-h] [-r OLD=NEW] [-nopa] [-s] [-ff FONT.ttf] [-no-ff] [-p PAGELIST] input [output]

Examples

Basic replacement:

apdf input.pdf output.pdf -r "OldText=NewText"

Multiple replacements:

apdf document.pdf updated_document.pdf \
    -r "Draft=Final" \
    -r "2023=2024"

Disable width compensation (if characters are bunching up or spacing is incorrect):

apdf input.pdf output.pdf -r "foo=bar" -nopa

Strict mode (fails if the replacement target is not found):

apdf input.pdf output.pdf -r "foo=bar" -s

Arguments

  • input: The source PDF file.
  • output: (Optional) The destination PDF file. Defaults to output.pdf.
  • -r OLD=NEW: Replace. The text replacement pair. You can supply this argument multiple times.
  • -p 2, -p 2,3,4, or -p 1-5 to edit only selected pages. Without -p, all pages are processed.
  • -nopa: No preserve advance. Do not compensate TJ text widths after making replacements.
  • -s: Strict. Fail if the original text is missing or the selected font cannot encode the new text.
  • -ff FONT.ttf: Fallback font. TrueType font to embed when the PDF's subset font lacks a glyph.
  • -no-ff: No font fallback. Reject missing glyphs instead of embedding a fallback font.

Metadata

Release files for apdf 1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for apdf 1.5
File Size Uploaded
apdf-1.5.tar.gz 29.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for apdf 1.5
File Interpreter ABI Platform
apdf-1.5-py3-none-any.whl Python 3 none any Details

Total release size: 56.1 kB

Release files / apdf-1.5.tar.gz

Download URL apdf-1.5.tar.gz
Size 29.0 kB
Tags Source
SHA-256 checksum
How to use checksums
897a7f86efbc6d062627adf1f66f7489a6700e100b538bc0bf338e5357baf7b3
BLAKE2b-256 checksum
How to use checksums
0b74d2a04472a0b57881e41d5f482f7d4fa7f462d713988ea9a82883cbc24507
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / apdf-1.5-py3-none-any.whl

Download URL apdf-1.5-py3-none-any.whl
Size 27.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
987993249a70eabfb56ac18cb2ad33c4d996fc6f9c05e415a2a4b8479b44370c
BLAKE2b-256 checksum
How to use checksums
fbce318dfc046054e1384b0c25381e7d1dc1d42e8037e119d5920c4ff99157a3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

1.6

2 release files

This release

1.5 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page