如何在iText中设置PdfFormField的字体?

时间:2012-08-21 18:10:56

标签: .net itextsharp

如何在创建时使用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并检查表单字段时,外观属性将显示该字体。

2 个答案:

答案 0 :(得分:0)

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

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

您是否有避免使用TextField的具体原因?

答案 1 :(得分: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),前缀将消失。

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