使用iTextSharp将表单域的不同部分设置为具有不同的字体

我不确定这是可能的,但我认为值得一提。 我已经弄清楚如何使用pdfstamper和acrofields方法设置formfield的字体,但我真的希望能够在同一个字段中设置文本的不同部分的字体。 这是我如何设置当前表单字段的字体:

// Use iTextSharp PDF Reader, to get the fields and send to the //Stamper to set the fields in the document PdfReader pdfReader = new PdfReader(fileName); // Initialize Stamper (ms is a MemoryStream object) PdfStamper pdfStamper = new PdfStamper(pdfReader, ms); // Get Reference to PDF Document Fields AcroFields pdfFormFields = pdfStamper.AcroFields; //create a bold font iTextSharp.text.Font bold = FontFactory.GetFont(FontFactory.COURIER, 8f, iTextSharp.text.Font.BOLD); //set the field to bold pdfFormFields.SetFieldProperty(nameOfField, "textfont", bold.BaseFont, null); //set the text of the form field pdfFormFields.SetField(nameOfField, "This: Will Be Displayed In The Field"); // Set the flattening flag to false, so the document can continue to be edited pdfStamper.FormFlattening = true; // close the pdf stamper pdfStamper.Close(); 

我想在上面设置文本的地方做的是将“This:”设置为粗体,并将“将在场中显示”非粗体。 我不确定这实际上是否可行,但我认为值得一提,因为它对我目前正在进行的工作非常有帮助。

提前致谢!

是的,有点。 PDF字段可以具有富文本值(自acrobat 6 / pdf1.5起)以及常规值。

常规值使用默认外观中定义的字体…单个字体。

富值格式(iText不直接支持,至少尚未支持)在PDF参考的第12.7.3.4章中描述。 , ,

和相当多的css2文本属性。 它需要具有各种属性。

要启用丰富的值,您必须为文本字段设置字段标志的第26位( PdfName.FF )。 PdfFormField没有“setRichValue”,但它们是字典,所以你可以:

 myPdfFormField.put(PdfName.RV, new PdfString( richTextValue ) ); 

如果您尝试将富文本添加到尚不支持它的现有字段:

 AcroFields fields = stamper.getAcroFields(); AcroFields.Item fldItem = fields.getFieldItem(fldName); PdfDictionary mergedDict = item.getMerged(0); int flagVal = mergedDict.getAsNumber(PdfName.FF).intValue(); flagVal |= (1 << 26); int writeFlags = AcroFields.Item.WRITE_MERGED | AcroFields.Item.WRITE_VALUE; fldItem.writeToAll(PdfName.FF, new PdfNumber(flagVal), writeFlags); fldItem.writeToAll(PdfName.RV, new PdfString(richTextValue), writeFlags); 

当我输入此消息时,我实际上正在向iText(不是尖锐的)添加富文本支持。 Hurray为SO的贡献者。 Paulo最近保持了iTextSharp的同步,所以这应该不是问题。 下一个trunk版本应具有此function...所以你可以写:

 myPdfFormField.setFieldFlags( PdfFormField.FF_RICHTEXT ); myPdfFormField.setRichValue( richTextValue ); 

要么

 // note that this will fail unless the rich flag is set acroFields.setFieldRichValue( richTextValue ); 

注意:iText的外观生成尚未更新,只是价值方面。 这将需要更多的工作。 因此,您需要acroFields.setGenerateAppearances(false)或让JS在打开表单时重置字段值,以强制Acrobat / Reader为您构建外观[s]。

我花了一些时间来弄清楚richtextfield没有像acrofields那样工作的方式,并且大多数情况下pdf在运行时不能用不同的字体编辑。

我设法在acrofields中设置不同的字体,并在运行时使用itextsharp传递值和编辑,我认为它对其他人有用。

  1. 使用PDF1.pdf中的文本字段创建pdf(我希望您知道如何在pdf中创建字段),例如,txtComments转到属性部分并将属性设置为richtext,Mulitiline

  2. 通过添加字体和颜色,以word或pdf格式化文本内容。 如果在word中完成,请将内容复制并粘贴到pdf – txtcomments字段中。

    注意:如果要添加动态内容。 将参数“{0}”设置为pdf中的txtComment字段。 使用字符串格式方法,您可以为其设置值。这将在下面的代码中显示。

      eg, "Set different parts of a form field to have different fonts using {0}" 
  3. 在itextsharp.dll 5.4.2中通过引用在按钮(这不是特定的)事件中添加以下代码


 Response.ContentType = "application/pdf"; Response.AddHeader("Content-disposition","attachment; filename=your.pdf"); PdfReader reader = new PdfReader(@"C:\test\pdf1.pdf"); PdfStamper stamp = new PdfStamper(reader, Response.OutputStream); AcroFields field = pdfStamp.AcroFields; string comments = field .GetFieldRichValue("txtcomments"); string Name = "Test1"; string value = string.Format(comments,Name); field.SetField("txtComment", value ); field.GenerateAppearances = false;//Pdf knows what to do; stamp.FormFlattening = false;//available for edit at run time stamp.FreeTextFlattening = true; stamp.Close(); reader.Close() 

希望这可以帮助。