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

2024-02-19

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

            // 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 不直接支持,至少现在还不是),在文档的第 12.7.3.4 章中进行了描述。PDF 参考 http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf. <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 添加富文本支持(不是锐利的)。 SO 的贡献者万岁。 Paulo 最近在保持 iTextSharp 同步方面做得很好,所以这不应该是一个问题。下一个主干版本应该有这个功能......所以你可以写:

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

or

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 iTextSharp 将表单字段的不同部分设置为具有不同的字体 的相关文章

随机推荐