From 3f104445396a6416fb8bfa810090f07f7aa71062 Mon Sep 17 00:00:00 2001 From: Pete Story Date: Tue, 20 Oct 2026 20:50:16 +0200 Subject: [PATCH] Cures a font substition failure (Brush Script MT) Cures wrong line breaks when letter spacing is used. --- README.md | 10 +- fonts/manager.py | 25 +++- .../test_fontFamilyResolution.py | 69 ++++++++++ tests/testLetterSpacing/test_spacingLayout.py | 90 +++++++++++++ tests/testTextBox/cewe2pdf.ini | 4 +- .../testTextBox.mcf.20261020S.pdf | Bin 0 -> 104531 bytes tests/testTextBox/testTextBox.mcf | 92 ++++++++----- .../testTextBox_mcf-Dateien/folderid.xml | 2 +- texts/outlines.py | 11 ++ texts/spacing.py | 123 +++++++++++++++++- 10 files changed, 380 insertions(+), 46 deletions(-) create mode 100644 tests/testFontSubstitution/test_fontFamilyResolution.py create mode 100644 tests/testLetterSpacing/test_spacingLayout.py create mode 100644 tests/testTextBox/previous_result_pdfs/testTextBox.mcf.20261020S.pdf diff --git a/README.md b/README.md index f668eeb..c6bbb54 100644 --- a/README.md +++ b/README.md @@ -238,6 +238,10 @@ Example for linux font file and directory paths: ``` #### Missing-font substitutions +Family names are resolved to their loaded faces before missing-font substitution. +If a family has no regular face, an available italic, bold, or bold italic face +is used, in that order. No manual substitution is needed for such a family. + To choose a replacement when a requested font is unavailable, add name pairs to `cewe2pdf.ini`: @@ -323,9 +327,9 @@ the MCF also supplies a positive width and a non-transparent colour. #### Letter spacing -The area-wide `textFormat.letterSpacing` setting is supported. Per-span letter -spacing and wrapping-aware measurement are not implemented, so heavily spaced -text near the edge of a narrow frame deserves visual checking. +The area-wide `textFormat.letterSpacing` setting is supported, including line +breaking and horizontal alignment. Positive spacing can move words to the next +line; negative spacing can let more text fit. Per-span letter spacing is not implemented. #### Tabs diff --git a/fonts/manager.py b/fonts/manager.py index 879b2ed..5e7c17c 100644 --- a/fonts/manager.py +++ b/fonts/manager.py @@ -2,6 +2,7 @@ import os from fontTools import ttLib +from reportlab.lib.fonts import tt2ps from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont @@ -397,11 +398,21 @@ def noteFontSubstitution(family, replacement, state: ConversionState): def getAvailableFont(family, pdf, additional_fonts, state: ConversionState): reportlabFonts = pdf.getAvailableFonts() - if family in reportlabFonts: - bodyfont = family - elif family in additional_fonts: - bodyfont = family - else: - bodyfont = getMissingFontSubstitute(family, state) - noteFontSubstitution(family, bodyfont, state) + if family in reportlabFonts or family in additional_fonts: + return family + + # CEWE names families, whereas the available-font lists contain faces. + # A family with only an italic/bold face still has a usable normal mapping + # from registerFontFamilies. Resolve it before declaring the font missing. + try: + normalFace = tt2ps(family, 0, 0) + except ValueError: + normalFace = None + # ReportLab keeps family mappings across conversions; accept this alias + # only when its face was loaded for the current album. + if normalFace in additional_fonts: + return normalFace + + bodyfont = getMissingFontSubstitute(family, state) + noteFontSubstitution(family, bodyfont, state) return bodyfont diff --git a/tests/testFontSubstitution/test_fontFamilyResolution.py b/tests/testFontSubstitution/test_fontFamilyResolution.py new file mode 100644 index 0000000..e75632f --- /dev/null +++ b/tests/testFontSubstitution/test_fontFamilyResolution.py @@ -0,0 +1,69 @@ +"""Resolve CEWE family names whose only installed face is not regular.""" + +from io import BytesIO +from pathlib import Path +import sys + +import pytest +from reportlab.lib import fonts +from reportlab.lib.styles import ParagraphStyle +from reportlab.pdfbase import pdfmetrics +from reportlab.pdfbase.ttfonts import TTFont +from reportlab.pdfgen.canvas import Canvas +from reportlab.platypus import Paragraph + +PROJECT_ROOT = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(PROJECT_ROOT)) +from testutils import configureTestImportPaths +configureTestImportPaths(__file__) + +from conversionState import ConversionState +from fonts.manager import getAvailableFont, registerFontFamilies + + +@pytest.fixture +def isolatedFontRegistry(monkeypatch): + # ReportLab's mappings are process-wide. Test registrations must not + # affect later album conversions or depend on earlier test registrations. + for module, name in ((pdfmetrics, '_fonts'), (pdfmetrics, '_dynFaceNames'), + (fonts, '_tt2ps_map'), (fonts, '_ps2tt_map')): + monkeypatch.setattr(module, name, getattr(module, name).copy()) + + +@pytest.mark.parametrize('onlyStyle', ['italic', 'bold', 'boldItalic']) +def test_familyWithNoRegularFaceUsesChosenAlternate(isolatedFontRegistry, onlyStyle): + family = f'Fallback test family {onlyStyle}' + face = f'{family} face' + fontFile = PROJECT_ROOT / 'tests/Resources/photofun/fonts/LiberationSansItalic-RJre.ttf' + pdfmetrics.registerFont(TTFont(face, str(fontFile))) + members = dict.fromkeys(('normal', 'bold', 'italic', 'boldItalic')) + members[onlyStyle] = face + registerFontFamilies({family: members}, []) + pdf = Canvas(BytesIO()) + state = ConversionState() + # Even an explicit missing-font rule must not override an available family. + state.missing_font_substitutions[family] = 'Courier' + + selectedFace = getAvailableFont(family, pdf, {face: str(fontFile)}, state) + + assert selectedFace == face + assert state.noted_font_substitutions == set() + paragraph = Paragraph('Normal bold italic both', + ParagraphStyle('family fallback', fontName=selectedFace)) + assert all(fragment.fontName == face for fragment in paragraph.frags) + paragraph.wrap(300, 100) + paragraph.drawOn(pdf, 10, 10) + pdf.save() + + +def test_familyMappingFromEarlierConversionIsNotEnough(isolatedFontRegistry): + family = 'Unavailable family from earlier conversion' + pdfmetrics.registerFontFamily(family, normal='Courier') + state = ConversionState() + + assert getAvailableFont(family, Canvas(BytesIO()), {}, state) == 'Helvetica' + assert state.noted_font_substitutions == {f'{family}/Helvetica'} + + +if __name__ == '__main__': + sys.exit(pytest.main([__file__])) diff --git a/tests/testLetterSpacing/test_spacingLayout.py b/tests/testLetterSpacing/test_spacingLayout.py new file mode 100644 index 0000000..8085749 --- /dev/null +++ b/tests/testLetterSpacing/test_spacingLayout.py @@ -0,0 +1,90 @@ +"""Measure line breaks and alignment with PDF character spacing enabled.""" + +from io import BytesIO +from pathlib import Path +import sys + +import pytest +from reportlab.lib.styles import ParagraphStyle +from reportlab.lib.enums import TA_CENTER +from reportlab.pdfbase.pdfmetrics import stringWidth +from reportlab.pdfgen.canvas import Canvas + +PROJECT_ROOT = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(PROJECT_ROOT)) +from testutils import configureTestImportPaths +configureTestImportPaths(__file__) + +from texts.outlines import TextEffectsParagraph + + +def makeParagraph(text, spacing): + style = ParagraphStyle('spacing test', fontName='Helvetica', fontSize=36, leading=42, + alignment=TA_CENTER, splitLongWords=True) + style.letterSpacing = spacing + return TextEffectsParagraph(text, style) + + +def lineTexts(paragraph): + return [''.join(fragment.text for fragment in line.words) for line in paragraph.blPara.lines] + + +def test_spacedTextWrapsAndCentresUsingVisibleWidth(): + paragraph = makeParagraph('Text with shadow', 10) + paragraph.wrap(330, 500) + assert lineTexts(paragraph) == ['Text with', 'shadow'] + for line in paragraph.blPara.lines: + text = ''.join(fragment.text for fragment in line.words) + visibleWidth = stringWidth(text, 'Helvetica', 36) + (len(text) - 1) * 10 + assert line.extraSpace == pytest.approx(330 - visibleWidth) + assert paragraph.height == 84 + paragraph.wrap(330, 500) + assert lineTexts(paragraph) == ['Text with', 'shadow'] + paragraph.wrap(700, 500) + assert lineTexts(paragraph) == ['Text with shadow'] + + +def test_negativeSpacingAllowsMoreTextOnTheLine(): + paragraph = makeParagraph('Text with shadow', -1) + width = stringWidth('Text with shadow', 'Helvetica', 36) - 5 + paragraph.wrap(width, 500) + assert lineTexts(paragraph) == ['Text with shadow'] + + +def test_inlineStylesAndExplicitBreaksArePreserved(): + paragraph = makeParagraph('Text with shadow
Next line', 10) + paragraph.wrap(330, 500) + assert lineTexts(paragraph) == ['Text with', 'shadow', 'Next line'] + assert [fragment.fontName for fragment in paragraph.blPara.lines[0].words if fragment.text.strip()] == [ + 'Helvetica', 'Helvetica-Bold'] + assert paragraph.blPara.lines[1].lineBreak + pdf = Canvas(BytesIO()) + paragraph.drawOn(pdf, 20, 20) + pdf.save() + + +def test_overlongWordSplitsWithoutLosingStyleOrCharacters(): + paragraph = makeParagraph('abcdefghij', 10) + paragraph.wrap(100, 500) + assert ''.join(lineTexts(paragraph)) == 'abcdefghij' + assert len(paragraph.blPara.lines) > 1 + assert all(line.extraSpace >= 0 for line in paragraph.blPara.lines) + assert paragraph.blPara.lines[-1].words[-1].fontName == 'Helvetica-Bold' + + +def test_existingHyphenRemainsAnAvailableBreak(): + paragraph = makeParagraph('Text-with-shadow', 10) + paragraph.style.embeddedHyphenation = 1 + paragraph.wrap(330, 500) + assert lineTexts(paragraph) == ['Text-with-', 'shadow'] + + +def test_zeroWidthSpaceAdvanceStillPreservesTheSpace(): + spacing = -stringWidth(' ', 'Helvetica', 36) + paragraph = makeParagraph('abc def', spacing) + paragraph.wrap(500, 500) + assert lineTexts(paragraph) == ['abc def'] + + +if __name__ == '__main__': + sys.exit(pytest.main([__file__])) diff --git a/tests/testTextBox/cewe2pdf.ini b/tests/testTextBox/cewe2pdf.ini index d603639..a67a233 100644 --- a/tests/testTextBox/cewe2pdf.ini +++ b/tests/testTextBox/cewe2pdf.ini @@ -1,5 +1,7 @@ [DEFAULT] -#cewe_folder = C:\Program Files\Elkjop fotoservice_6.3\elkjop fotoservice +#cewe_folder = C:\Program Files\Elkjop fotoservice\elkjop fotoservice +#noShadows = False +#loadSystemFonts = True cewe_folder = tests hpsFolder = tests/hps diff --git a/tests/testTextBox/previous_result_pdfs/testTextBox.mcf.20261020S.pdf b/tests/testTextBox/previous_result_pdfs/testTextBox.mcf.20261020S.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0db7c41d981715b667cc8e131ecdbcc749d16db2 GIT binary patch literal 104531 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 JS;U5b{sOpmlS%*p literal 0 HcmV?d00001 diff --git a/tests/testTextBox/testTextBox.mcf b/tests/testTextBox/testTextBox.mcf index f5f2a21..fc06e19 100644 --- a/tests/testTextBox/testTextBox.mcf +++ b/tests/testTextBox/testTextBox.mcf @@ -1,7 +1,7 @@ - - - + + + @@ -9,9 +9,10 @@ + - - + + @@ -21,8 +22,8 @@ -

Front title: Testing text boxes
Including: Horizontal and vertical alignment and margins

]]> - +

Front title: Testing text boxes
Including: Horizontal and vertical alignment and margins

]]> +
@@ -58,8 +59,8 @@ -

This is left and top aligned text with a 0.0 mm edge margin set

]]> - +

This is left and top aligned text with a 0.0 mm edge margin set

]]> +
@@ -67,8 +68,8 @@ -

This is left and top aligned text with a 2.1 mm edge margin set

]]> - +

This is left and top aligned text with a 2.1 mm edge margin set

]]> +
@@ -76,8 +77,8 @@ -

This is centred and centred text with a 0.0 mm edge margin set

]]> - +

This is centred and centred text with a 0.0 mm edge margin set

]]> +
@@ -85,8 +86,8 @@ -

This is centred and centred text with a 2.1 mm edge margin set

]]> - +

This is centred and centred text with a 2.1 mm edge margin set

]]> +
@@ -94,8 +95,8 @@ -

This is right and bottom aligned text with a 0.0 mm edge margin set

]]> - +

This is right and bottom aligned text with a 0.0 mm edge margin set

]]> +
@@ -103,8 +104,8 @@ -

This is right and bottom aligned text with a 2.1 mm edge margin set

]]> - +

This is right and bottom aligned text with a 2.1 mm edge margin set

]]> +
@@ -112,8 +113,8 @@ -

Single line left, top, 0.0

]]> - +

Single line left, top, 0.0

]]> +
@@ -121,8 +122,8 @@ -

Single line left, top, 2.1

]]> - +

Single line left, top, 2.1

]]> +
@@ -130,8 +131,8 @@ -

Single line ctr, ctr, 0.0

]]> - +

Single line ctr, ctr, 0.0

]]> +
@@ -139,8 +140,8 @@ -

Single line ctr, ctr, 0.0

]]> - +

Single line ctr, ctr, 0.0

]]> +
@@ -148,8 +149,8 @@ -

Single, right, bottom, 0.0

]]> - +

Single, right, bottom, 0.0

]]> +
@@ -157,8 +158,35 @@ -

Single, right, bottom, 2.1

]]> - +

Single, right, bottom, 2.1

]]> + +
+ + + + + + +

Text with shadow

]]> + +
+ + + + + + +

Text with shadow

]]> + +
+ + + + + + +

The boxes above check that letter spacing is taken into account in calculating line breaks. The second one happens to check font substitution for Brush Italic MT which only has an italic entry in the family, but you can only see that when executing locally with a full font set, and not on the github tests

]]> +
@@ -313,5 +341,5 @@ - +
diff --git a/tests/testTextBox/testTextBox_mcf-Dateien/folderid.xml b/tests/testTextBox/testTextBox_mcf-Dateien/folderid.xml index 254eeb3..ffbe290 100644 --- a/tests/testTextBox/testTextBox_mcf-Dateien/folderid.xml +++ b/tests/testTextBox/testTextBox_mcf-Dateien/folderid.xml @@ -1,2 +1,2 @@ - + diff --git a/texts/outlines.py b/texts/outlines.py index 01af71f..098f36b 100644 --- a/texts/outlines.py +++ b/texts/outlines.py @@ -6,6 +6,7 @@ from reportlab.platypus import Paragraph from colorUtils import ReorderColorBytesMcf2Rl +from texts.spacing import breakSpacedLines @dataclass(frozen=True) @@ -65,6 +66,16 @@ def getTextOutline(text_tag, mcf_to_reportlab): class TextEffectsParagraph(Paragraph): """A ReportLab paragraph which applies CEWE text effects when requested.""" + def breakLines(self, width): + letter_spacing = getattr(self.style, 'letterSpacing', 0.0) + if letter_spacing: + lines = breakSpacedLines(self, width, letter_spacing) + # ReportLab uses this measured width when sizing/splitting the + # finished paragraph, alongside the normal FragLine structures. + self._width_max = max((line.maxWidth - line.extraSpace for line in lines.lines), default=0) # pylint: disable=attribute-defined-outside-init + return lines + return super().breakLines(width) + def beginText(self, x, y): text_object = super().beginText(x, y) letter_spacing = getattr(self.style, 'letterSpacing', 0.0) diff --git a/texts/spacing.py b/texts/spacing.py index 674a713..25f16b7 100644 --- a/texts/spacing.py +++ b/texts/spacing.py @@ -1,6 +1,11 @@ """CEWE letter-spacing parsing.""" import logging +from collections import deque + +from reportlab.pdfbase.pdfmetrics import getAscentDescent, stringWidth +from reportlab.platypus.paragraph import ( + FragLine, ParaLines, _getFragWords, _HSFrag, sameFrag) def getLetterSpacing(text_format, mcf_to_reportlab): @@ -12,8 +17,7 @@ def getLetterSpacing(text_format, mcf_to_reportlab): avoids an otherwise undocumented pixel-to-point conversion. This initial implementation deliberately applies one value to the whole - text area. Per-span character spacing and wrapping-aware measurement are - separate enhancements. + text area. Per-span character spacing is not implemented. """ if text_format is None: return 0.0 @@ -27,3 +31,118 @@ def getLetterSpacing(text_format, mcf_to_reportlab): except ValueError: logging.warning(f"Ignoring invalid text letterSpacing setting {spacing_text!r}") return 0.0 + + +def _textAdvance(fragment, spacing): + """Include the advance after the last character, as PDF text does.""" + return (stringWidth(fragment.text, fragment.fontName, fragment.fontSize) + + len(fragment.text) * spacing) + + +def _splitSpacedWord(fragments, width, spacing): + """Split an overlong word without losing its inline font/style changes.""" + head = [] + tail = [] + advance = 0.0 + full = False + for fragment in fragments: + prefix = '' + for index, character in enumerate(fragment.text): + characterAdvance = stringWidth(character, fragment.fontName, fragment.fontSize) + spacing + if full or ((head or prefix) and advance + characterAdvance - spacing > width): + tail.append(fragment.clone(text=fragment.text[index:])) + full = True + break + prefix += character + advance += characterAdvance + if prefix: + head.append(fragment.clone(text=prefix)) + return head, tail + + +def _getSpacedWords(fragments, embeddedHyphenation): + words = deque() + # _getFragWords and _HSFrag are ReportLab's word/style representation: + # _HSFrag marks a word followed by a collapsible space, not a visible glyph. + for word in _getFragWords(fragments): + fragments = [fragment.clone(text=text) for fragment, text in word[1:]] + portions = [[]] + for fragment in fragments: + # Preserve the configured opportunity to break after existing + # hyphens, including hyphenated words spanning inline styles. + parts = fragment.text.split('-') if embeddedHyphenation else [fragment.text] + for index, part in enumerate(parts): + hasHyphen = index < len(parts) - 1 + portions[-1].append(fragment.clone(text=part + ('-' if hasHyphen else ''))) + if hasHyphen: + portions.append([]) + for index, portion in enumerate(portions): + trailingSpace = index == len(portions) - 1 and isinstance(word, _HSFrag) + words.append((portion, trailingSpace)) + + return words + + +def breakSpacedLines(paragraph, widths, spacing): + """Lay out spaced words using ReportLab's parsed text/style fragments. + + ReportLab's ordinary breaker measures glyph widths without PDF character + spacing. Keep its fragment parser and drawing/height machinery, but measure + each line's actual advance here. Nothing in ReportLab's shared registries or + module-level measurement functions is changed for this paragraph. + """ + if not isinstance(widths, (tuple, list)): + widths = [widths] + words = _getSpacedWords(paragraph.frags, paragraph.style.embeddedHyphenation) + + lines = [] + line = [] + advance = 0.0 + pendingSpace = None + + def finishLine(explicitBreak=False): + nonlocal line, advance, pendingSpace + width = widths[min(len(lines), len(widths) - 1)] + textWidth = advance - spacing if line else 0 + bounds = [getAscentDescent(fragment.fontName, fragment.fontSize) for fragment in line] + lines.append(FragLine( + extraSpace=width - textWidth, wordCount=1 + sum(fragment.text.count(' ') for fragment in line), + lineBreak=explicitBreak, words=line, + fontSize=max((fragment.fontSize for fragment in line), default=paragraph.style.fontSize), + ascent=max((bound[0] for bound in bounds), default=paragraph.style.fontSize), + descent=min((bound[1] for bound in bounds), default=0), maxWidth=width)) + line = [] + advance = 0.0 + pendingSpace = None + + while words: + fragments, trailingSpace = words.popleft() + if getattr(fragments[0], 'lineBreak', False): + finishLine(explicitBreak=True) + continue + wordAdvance = sum(_textAdvance(fragment, spacing) for fragment in fragments) + gap = _textAdvance(pendingSpace, spacing) if line and pendingSpace else 0 + width = widths[min(len(lines), len(widths) - 1)] + if line and advance + gap + wordAdvance - spacing > width: + finishLine() + width = widths[min(len(lines), len(widths) - 1)] + gap = 0 + if not line and wordAdvance - spacing > width and paragraph.style.splitLongWords: + fragments, remainder = _splitSpacedWord(fragments, width, spacing) + if remainder: + words.appendleft((remainder, trailingSpace)) + trailingSpace = False + wordAdvance = sum(_textAdvance(fragment, spacing) for fragment in fragments) + if line and pendingSpace is not None: + line.append(pendingSpace) + advance += gap + for fragment in fragments: + if line and sameFrag(line[-1], fragment): + line[-1].text += fragment.text + else: + line.append(fragment.clone()) + advance += wordAdvance + pendingSpace = fragments[-1].clone(text=' ') if trailingSpace else None + if line: + finishLine() + return ParaLines(kind=1, lines=lines)