使用嵌入字体创建可编辑字段的iText 7无法看到键入

时间:2018-04-25 22:39:31

标签: itext7

我该如何解决这个问题?当我创建一个未嵌入的字体时,我使用以下代码创建一个可编辑的文本框。

var myPdfField = PdfTextFormField.CreateText(pdfDoc, textBoxRect, sAssignedName).SetFont(fieldFont).SetVisibility(PdfFormField.VISIBLE);

当我在PDF字段中输入内容时,我会看到输入的文字,并且所有文字都按预期工作

当我在PDF中嵌入字体时,我看不到输入到字段中的文本。我已经使用多种方法来创建字体,并使用一对来添加具有相同结果的文本框。这就是我目前创建字体的方式。

fontPgmTimes = FontProgramFactory.CreateFont(sFontTimes);
timesFontBold = timesFontNorm = PdfFontFactory.CreateFont(fontPgmTimes, PdfEncodings.WINANSI, true);

如果我输入嵌入字体的字段并退出PDF而不保存,则会提示我保存更改。如果我退出更改,则没有提示。因此,我认为文本已输入到字段中,我无法在屏幕上看到它。

已添加2018.05.01 我发现在文本字段中添加文本会改变行为。在文本字段中输入的每个字符都可以用作新文本。例如,添加文本“abcABCdef789。, - ”如图所示

var myPdfField = PdfTextFormField.CreateText(pdfDoc, textBoxRect, sAssignedName, "abcABCdef789.,-").SetFont(fieldFont).SetVisibility(PdfFormField.VISIBLE);

允许用户键入任意数量的字符,只要它们仅限于初始文本中的字符。默认行为就像将空字符串“”作为文本输入一样。

1 个答案:

答案 0 :(得分:0)

每当您在iText 7中创建嵌入的PDF字体时,默认情况下它只会将实际使用的字形的定义子集嵌入到文档中。当您在字段中添加初始值时,您自己观察到了这一点:

var myPdfField = PdfTextFormField.CreateText(pdfDoc, textBoxRect, sAssignedName, "abcABCdef789.,-").SetFont(fieldFont).SetVisibility(PdfFormField.VISIBLE);

由于iText使用了字符"abcABCdef789.,-"(并且只有它们)的字形(用于创建字段的外观),它们构成了嵌入字体的字形子集。

如果要嵌入整个字体以允许用户输入字体中的任何字形,则必须禁用子集:

fieldFont.SetSubset(false);

(在生成fieldFont字体后尽早执行此操作以防止iText错误地开始创建子集。)

如果你想从字体中嵌入预定义的字形范围(例如,如果你定义的编码不包含整套字体字形),你可以这样做:

fieldFont.SetSubset(false);
fieldFont.AddSubsetRange(new int[] { 32, 255 });

(再次,在生成fieldFont字体后尽早执行此操作,以防止iText错误地开始创建自定义子集。)

这可能看起来有点奇怪,因为您首先将子集设置为false"然后"添加一个子集范围"。如果考虑SetSubset的含义是"只允许创建使用过的字形的自定义子集",那么它是有意义的。

顺便说一下,这对应于SetSubset方法的文档。