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

时间:2010-12-10 16:16:57

标签: c# .net pdf fonts 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:”设置为粗体,并将“将在场中显示”非粗体。我不确定这实际上是否可行,但我认为值得一提,因为这对我目前的工作非常有帮助。

提前致谢!

2 个答案:

答案 0 :(得分:8)

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

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

PDF Reference的第12.7.3.4节描述了丰富的价值格式(iText不直接支持,至少尚未支持)。 <b>, <i>, <p>,以及相当多的css2文本属性。它需要具有各种属性。

要启用丰富的值,您必须为文本字段设置字段标志(PdfName.FF)的第26位。 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]。

答案 1 :(得分:0)

我花了一些时间来弄清楚richtextfield没有按照假设的方式工作 acrofields和大多数情况是pdf在运行时不能用不同的字体编辑。

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

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

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

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

            e.g., "Set different parts of a form field to have different fonts using {0}"
    
  3. 在itextsharp.dll 5.4.2

  4. 中通过引用在按钮(这不是特定的)中添加以下代码
    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()
    

    希望这有帮助。