【问题标题】:Set different parts of a form field to have different fonts using iTextSharp使用 iTextSharp 将表单字段的不同部分设置为具有不同的字体
【发布时间】:2011-05-23 14:12:52
【问题描述】:

我不确定这是否可行,但我认为这值得一问。我已经弄清楚如何使用 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();

我希望能够在上面设置文本的地方将“此:”设置为粗体,并将“将在字段中显示”保持为非粗体。我不确定这实际上是否可行,但我认为值得一问,因为这对我目前的工作很有帮助。

提前致谢!

【问题讨论】:

    标签: c# .net pdf fonts itextsharp


    【解决方案1】:

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

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

    PDF Reference 的第 12.7.3.4 章描述了丰富的值格式(iText 不直接支持,至少目前还不支持)。 <b>, <i>, <p>,还有不少 css2 文本属性。它需要具有各种属性的 a。

    要启用丰富的值,您必须为文本字段设置字段标志 (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 添加富文本支持(不清晰)。为 SO 上的贡献者欢呼。 Paulo 最近在保持 iTextSharp 同步方面做得很好,所以这应该不是问题。下一个主干版本应该有这个功能......所以你可以写:

    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 为您构建外观。

    【讨论】:

    • 它在哪里区分字段表单中的文本?它如何知道将 This: 设置为不同的字体?
    • @Jake 如果您转到我的回答中链接的 PDF 参考,第 12.7.4.3 节,您将看到允许的内容的完整描述。它基本上是 HTML 的一个子集。
    【解决方案2】:

    我花了一些时间才弄明白,richtextfield 的工作方式也没有像想象的那样工作 acrofields 和大多数情况是 pdf 在运行时无法使用不同的字体进行编辑。

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

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

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

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

              e.g., "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()
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-14
      • 2012-06-18
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 2015-03-24
      • 1970-01-01
      相关资源
      最近更新 更多