mirror of
https://github.com/nicoverbruggen/kobo-font-fix.git
synced 2026-04-01 15:00:08 +02:00
Update README, skip OTF
This commit is contained in:
29
README.md
29
README.md
@@ -1,8 +1,8 @@
|
||||
# KoboFix Font Processor
|
||||
# Kobo Font Fix
|
||||
|
||||
## Overview
|
||||
|
||||
`kobofix.py` is a Python script designed to process TTF and OTF fonts for Kobo e-readers.
|
||||
`kobofix.py` is a Python script designed to process TTF fonts for Kobo e-readers.
|
||||
|
||||
It generates a renamed font, fixes PANOSE information based on the filename, adjusts the baseline with the `font-line` utility, and adds a legacy `kern` table which allows the `kepub` engine for improved rendering of kerned pairs.
|
||||
|
||||
@@ -37,14 +37,31 @@ source ~/.zshrc
|
||||
```
|
||||
3. The script will:
|
||||
|
||||
* Validate filenames.
|
||||
* Validate the file names (must end with `-Regular`, `-Bold`, `-Italic` or `-BoldItalic` so they're valid for Kobo devices).
|
||||
* Process each font (e.g. "Lora" becomes "KF Lora").
|
||||
* Apply kerning, rename, PANOSE adjustments, and baseline shift.
|
||||
* Save output as `KF_<original_filename>`.
|
||||
|
||||
Example:
|
||||
### Generating KF fonts
|
||||
|
||||
This applies the KF prefix, applies 20 percent line spacing and adds a Kobo `kern` table. Ideal if you have an existing TrueType font and you want it on your Kobo device. The `--name` parameter is used to change the name of the font family.
|
||||
|
||||
```bash
|
||||
./kobofix.py --prefix KF --name="Fonty" --line-percent 20 *.ttf
|
||||
```
|
||||
|
||||
### Generating NV fonts
|
||||
|
||||
Tight spacing, with a custom font family name, as is required via the OFL license:
|
||||
|
||||
```bash
|
||||
./kobofix.py --prefix NV --name="Fonty" --line-percent 20 --skip-kobo-kern *.ttf
|
||||
```
|
||||
Original: Lora-BoldItalic.ttf
|
||||
Processed: KF_Lora-BoldItalic.ttf
|
||||
|
||||
Relaxed spacing, with a custom font family name, as is required via the OFL license:
|
||||
|
||||
```bash
|
||||
./kobofix.py --prefix NV --name="Fonty" --line-percent 50 --skip-kobo-kern *.ttf
|
||||
```
|
||||
|
||||
You can play around with `--line-percent` to see what works for you.
|
||||
|
||||
51
kobofix.py
51
kobofix.py
@@ -2,7 +2,7 @@
|
||||
"""
|
||||
Font processing utility for Kobo e-readers.
|
||||
|
||||
This script processes TrueType/OpenType fonts to improve compatibility with
|
||||
This script processes TrueType fonts to improve compatibility with
|
||||
Kobo e-readers by:
|
||||
- Adding a custom prefix to font names
|
||||
- Extracting GPOS kerning data and creating legacy 'kern' tables
|
||||
@@ -29,8 +29,10 @@ from fontTools.ttLib.tables._k_e_r_n import KernTable_format_0
|
||||
# Constants
|
||||
DEFAULT_PREFIX = "KF"
|
||||
DEFAULT_LINE_PERCENT = 20
|
||||
DEFAULT_KOBO_KERN = True
|
||||
|
||||
VALID_SUFFIXES = ("-Regular", "-Bold", "-Italic", "-BoldItalic")
|
||||
SUPPORTED_EXTENSIONS = (".ttf", ".otf")
|
||||
SUPPORTED_EXTENSIONS = (".ttf")
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(message)s')
|
||||
@@ -40,16 +42,18 @@ logger = logging.getLogger(__name__)
|
||||
class FontProcessor:
|
||||
"""Main font processing class."""
|
||||
|
||||
def __init__(self, prefix: str = DEFAULT_PREFIX, line_percent: int = DEFAULT_LINE_PERCENT):
|
||||
def __init__(self, prefix: str = DEFAULT_PREFIX, line_percent: int = DEFAULT_LINE_PERCENT, kobo_kern_fix: bool = DEFAULT_KOBO_KERN):
|
||||
"""
|
||||
Initialize the font processor.
|
||||
|
||||
Args:
|
||||
prefix: Prefix to add to font names
|
||||
line_percent: Percentage for baseline adjustment
|
||||
kobo_kern_fix: Apply `kern` table fix for Kobo devices
|
||||
"""
|
||||
self.prefix = prefix
|
||||
self.line_percent = line_percent
|
||||
self.kobo_kern_fix = kobo_kern_fix
|
||||
|
||||
# ============================================================
|
||||
# Kerning extraction methods
|
||||
@@ -417,7 +421,7 @@ class FontProcessor:
|
||||
# Main processing method
|
||||
# ============================================================
|
||||
|
||||
def process_font(self, font_path: str, new_name: Optional[str] = None) -> bool:
|
||||
def process_font(self, kern: bool, font_path: str, new_name: Optional[str] = None) -> bool:
|
||||
"""
|
||||
Process a single font file.
|
||||
|
||||
@@ -445,17 +449,21 @@ class FontProcessor:
|
||||
|
||||
# Fix PANOSE
|
||||
self.check_and_fix_panose(font, font_path)
|
||||
|
||||
# Handle kerning
|
||||
kern_pairs = self.extract_kern_pairs(font)
|
||||
if kern_pairs:
|
||||
written = self.add_legacy_kern(font, kern_pairs)
|
||||
logger.info(
|
||||
f" Kerning: extracted {len(kern_pairs)} pairs; "
|
||||
f"wrote {written} to legacy 'kern' table"
|
||||
)
|
||||
|
||||
if kern:
|
||||
# Handle kerning
|
||||
kern_pairs = self.extract_kern_pairs(font)
|
||||
if kern_pairs:
|
||||
written = self.add_legacy_kern(font, kern_pairs)
|
||||
logger.info(
|
||||
f" Kerning: extracted {len(kern_pairs)} pairs; "
|
||||
f"wrote {written} to legacy 'kern' table"
|
||||
)
|
||||
else:
|
||||
logger.info(" Kerning: no GPOS kerning found")
|
||||
else:
|
||||
logger.info(" Kerning: no GPOS kerning found")
|
||||
# Skip kerning step
|
||||
logger.info(" Skipping `kern` step")
|
||||
|
||||
# Generate output filename
|
||||
output_path = self._generate_output_path(font_path, new_name)
|
||||
@@ -538,16 +546,15 @@ def main():
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog="""
|
||||
Examples:
|
||||
%(prog)s font-Regular.ttf font-Bold.ttf
|
||||
%(prog)s --name "My Font" *.ttf
|
||||
%(prog)s --prefix KOBO --line-percent 25 font.ttf
|
||||
%(prog)s --name="Fonty" --line-percent 20 *.ttf
|
||||
%(prog)s --prefix NV --name="Fonty" --line-percent 20 --skip-kobo-kern *.ttf
|
||||
"""
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"fonts",
|
||||
nargs="+",
|
||||
help="Font files to process (*.ttf, *.otf)"
|
||||
help="Font files to process (*.ttf)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--name",
|
||||
@@ -566,6 +573,11 @@ Examples:
|
||||
default=DEFAULT_LINE_PERCENT,
|
||||
help=f"Line spacing adjustment percentage (default: {DEFAULT_LINE_PERCENT})"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--skip-kobo-kern",
|
||||
action="store_true",
|
||||
help="Skip the creation of the legacy 'kern' table from GPOS data."
|
||||
)
|
||||
parser.add_argument(
|
||||
"--verbose",
|
||||
action="store_true",
|
||||
@@ -601,12 +613,13 @@ Examples:
|
||||
# Process fonts
|
||||
processor = FontProcessor(
|
||||
prefix=args.prefix,
|
||||
line_percent=args.line_percent
|
||||
line_percent=args.line_percent,
|
||||
)
|
||||
|
||||
success_count = 0
|
||||
for font_path in valid_files:
|
||||
if processor.process_font(
|
||||
not args.skip_kobo_kern,
|
||||
font_path,
|
||||
args.name,
|
||||
):
|
||||
|
||||
Reference in New Issue
Block a user