Skip to content

Multiline text fields drop German umlauts/special characters #80

Description

@JohannesNekes

Description

When filling a multiline text field with a value containing a line break (\n), the second line is rendered, but German special characters such as ö, ä, ü, and ß are rendered as blanks/spaces in the output pdf.

The field value itself appears to be stored correctly. The issue seems to happen during appearance generation for multiline text fields.

Reproduction

Given a PDF with a multiline text field:

import { PDF } from "@libpdf/core";

const pdf = await PDF.load(bytes);
const form = pdf.getForm();

form.fill({
  myTextField: "First line\nFähre Öl süß äöüß",
});

const output = await pdf.save();

The text field should render both lines correctly, including German special characters. The second line is rendered, but the characters such as ä, ö, ü, and ß appear as blanks/spaces. This only happens when \n is present in the input string.

Fix

I asked the AI for a suggestion and this solution works, at least in my particular case.

In src/document/forms/appearance-utils.ts, update encodeTextForFont()

if (isExistingFont(font) && font.isCIDFont) {
  return PdfString.fromBytes(font.encodeTextToBytes(text));
}

to

if (isExistingFont(font)) {
  return PdfString.fromBytes(font.encodeTextToBytes(text));
}
  1. Add /Encoding /WinAnsiEncoding for synthesized Standard 14 fallback fonts
    In src/document/forms/appearance-utils.ts update buildFontResources():
fontDict.set("Type", PdfName.of("Font"));
fontDict.set("Subtype", PdfName.of("Type1"));
fontDict.set("BaseFont", PdfName.of(mapToStandardFont(cleanName) ?? cleanName));

to

const baseFont = mapToStandardFont(cleanName) ?? cleanName;

fontDict.set("Type", PdfName.of("Font"));
fontDict.set("Subtype", PdfName.of("Type1"));
fontDict.set("BaseFont", PdfName.of(baseFont));

if (baseFont !== "Symbol" && baseFont !== "ZapfDingbats") {
  fontDict.set("Encoding", PdfName.of("WinAnsiEncoding"));
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions