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));
}
- 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"));
}
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:
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()
to
In src/document/forms/appearance-utils.ts update buildFontResources():
to