加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用iTextSharp将表单字段的不同部分设置为具有不同的字体

发布时间:2020-12-15 08:21:56 所属栏目:百科 来源:网络整理
导读:我不确定这是否可行,但我认为值得一提.我已经弄清楚如何使用pdfstamper和acrofields方法设置一个formfield的字体,但我真的希望能够在同一个字段中设置文本的不同部分的字体.这是我如何设置当前表单字段的字体: // Use iTextSharp PDF Reader,to get the fie
我不确定这是否可行,但我认为值得一提.我已经弄清楚如何使用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 Reference的第12.7.3.4节中描述.??< b>,< i>,< p>,以及相当多的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版本应具有此功能…所以你可以写:

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].

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读