1

创建时如何使用 iText 为字段设置字体,如下所示:

PdfReader pdf = new PdfReader("C:\\foo.pdf");
FileStream outs = new FileStream("C:\\bar.pdf", FileMode.Create, 
                  FileAccess.Write);
PdfStamper stamps = new PdfStamper(pdf, outs);
PdfFormField field = PdfFormField.CreateTextField(stamps.Writer, 
                     false, false, 50);
field.SetWidget(new iTextSharp.text.Rectangle(50, 400, 500, 600),
      PdfAnnotation.HIGHLIGHT_INVERT);
field.SetFieldFlags(PdfAnnotation.FLAGS_PRINT);
field.FieldName = "my_field";
stamps.AddAnnotation(field, 1);
stamps.Close();

我已经有一个 BaseFont 的引用,并且想设置字段字体,以便当我打开 Acrobat 并检查表单字段时,外观属性将显示此字体。

4

2 回答 2

0

请看一下 TextField 类的代码,更具体地说是 getTextField() 方法。您会看到字体是在默认外观 (DA) 中定义的。许多事情都在这种方法中发生。创建外观,添加 BaseFont。

要么您必须编写自己的 TextField 类中的实现,要么您必须切换到使用 TextField 类。

您避免使用 TextField 是否有特定原因?

于 2012-08-24T12:00:31.667 回答
0

您还有一个问题:

当我查看 Acrobat 时,我确实在字段中设置了字体,但我希望它说 Arial 而不是 SEBJIU+ArialMT

这是我使用的代码: BaseFont arial = BaseFont.CreateFont("c:\windows\fonts\arial.ttf", BaseFont.CP1252, BaseFont.NOT_EMBEDDED);

我有两点意见给你:

  1. ArialMT 是存储在 arial.ttf 文件中的字体名称。如果希望字体以不同的名称出现,则需要使用 BaseFont 类中的方法 setPostscriptFontName()。这是可能的,但我建议不要这样做,因为它具有误导性。

  2. SEBJIU+ 前缀意味着只使用字体的一个子集。如果您使用 setSubset(false) 前缀将消失。

我看到您没有嵌入字体,但前缀告诉我您正在嵌入一个子集。也许还有别的东西在起作用。在某些情况下,嵌入的参数会被忽略。这是记录在案的。例如,从不嵌入 Standard Type 1 字体(即使您使用 BaseFont.EMBEDDED);始终嵌入使用编码 IDENTITY-H 或 IDENTITY-V 的字体。

于 2012-09-03T07:01:04.503 回答