我该如何解决这个问题?当我创建一个未嵌入的字体时,我使用以下代码创建一个可编辑的文本框。
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);
允许用户键入任意数量的字符,只要它们仅限于初始文本中的字符。默认行为就像将空字符串“”作为文本输入一样。
答案 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
方法的文档。