A tool for font replacement in PDFs.
Project description
swapfont
A PDF font replacer
swapfont is a unified toolkit for analyzing and replacing legacy fonts (such as bitmapped Type 3 fonts) in PDF files with modern TrueType or OpenType fonts.
It performs a direct vector replacement by rewriting PDF content streams. It automatically adjusts horizontal character scaling (Tz) to ensure the original visual layout—including text reflow and spacing—is preserved, even when the new font has significantly different metrics.
Features
- Interactive Wizard: A "dashboard" style CLI to quickly identify and replace fonts without writing config files.
- Content Stream Rewriting: Replaces font names and character codes in text-showing operators (
Tj,',"). - Layout Preservation: Calculates
Tzscaling to squash or stretch new text to fit the original bounding box (defaulting to a liberal 50%–200% range to ensure fit). - Kerning Preservation: Converts complex spacing arrays (
[ (A) 50 (V) ] TJ) into explicit positioning (Td) if necessary to maintain exact spacing. - TrueType Font Embedding: Embeds the target font file into the resulting PDF.
Installation
pip install swapfont
Quick Start (The Wizard)
The easiest way to use swapfont is the interactive wizard. It scans your PDF and lets you pick replacements font-by-font.
swapfont wizard input.pdf
Note: the interactive wizard is a work in progress, and the user interface is not yet particularly pleasant.
CLI Reference
swapfont is a single binary with multiple subcommands.
1. Run (The Core Replacer)
Executes a replacement using a configuration file. Ideally used for automation pipelines.
swapfont run input.pdf config.json [-o output.pdf]
2. Inspect
Analyzes a PDF to identify unembedded or Type 3 fonts and generates a "skeleton" configuration file for you to edit.
swapfont inspect input.pdf
3. Glue
An intermediate tool to generate a swapfont compatible JSON from the inspector's output, filtering only for the fonts you provide mappings for.
swapfont glue inspector_output.json output_config.json --mapping mapping.json
Configuration (config.json)
For automated pipelines (using swapfont run), you define replacements in a JSON file.
Example Configuration
{
"description": "Standard replacement of Type 3 fonts with local TrueType files.",
"rules": [
{
"source_font_name": "/R136",
"target_font_file": "fonts/Roboto-Regular.ttf",
"target_font_name": "Roboto-Regular"
},
{
"source_font_name": "/R20",
"target_font_file": "fonts/Arial.ttf",
"target_font_name": "ArialMT",
"strategy_options": {
"min_scale": 50.0,
"max_scale": 150.0
}
}
]
}
Replacement Rule Details
| Field | Type | Description |
|---|---|---|
source_font_name |
String | The internal name of the font in the PDF's resources (e.g., /F1, /R136). |
target_font_file |
String | The path to the replacement TrueType/OpenType font file. |
target_font_name |
String | The new internal name to use in the PDF resources (e.g., /F_NEW_ROB). |
strategy |
Literal | scale_to_fit (Default): Calculates Tz scaling to match the original width. |
strategy_options |
Object | Defines the limits for horizontal scaling. • min_scale: Minimum allowed scaling % (Default: 50.0)• max_scale: Maximum allowed scaling % (Default: 200.0) |
encoding_map |
Dictionary | Advanced: Maps source character codes (e.g., "0x41") to target characters (e.g., "A"). Essential for Type 3 fonts with non-standard encodings. |
Advanced Usage: The Inspection Workflow
If you have a complex PDF and don't know the font names:
- Inspect: Run
swapfont inspect document.pdf. This generates a report and afont_rules.jsontemplate. - Edit: Open
font_rules.json. Fill intarget_font_filefor the fonts you want to replace. Remove the blocks for fonts you want to keep. - Run: Execute
swapfont run document.pdf font_rules.json.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file swapfont-0.1.0.tar.gz.
File metadata
- Download URL: swapfont-0.1.0.tar.gz
- Upload date:
- Size: 284.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff0effdbdea467791f29692a75dbc643a0a8bf4a03ecea882c3f787f6de8b72c
|
|
| MD5 |
e3543cc6a78c80602f240cb8f629d001
|
|
| BLAKE2b-256 |
275479e08e814da053acc10c495e40562bc34a42132581d4fb44f6e10203b1d1
|
File details
Details for the file swapfont-0.1.0-py3-none-any.whl.
File metadata
- Download URL: swapfont-0.1.0-py3-none-any.whl
- Upload date:
- Size: 42.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc8cd7aaf7705fe10e65180de049f9b3a1ed618ceb9dc893cdc3b0a0bbdf94e0
|
|
| MD5 |
d4a61ca6797652081fb86a87889a2f63
|
|
| BLAKE2b-256 |
2523655644831a3f94939e45c07e6f73e86d0e5d4f08109ec3caf592f1b396ef
|