2010-12-10 138 views
6

我不確定這是否可能,但我認爲這值得提問。我已經想出瞭如何使用pdfstamper和acrofields方法來設置表單字體,但是我真的希望能夠在同一個字段中設置文本不同部分的字體。下面是我如何設置表單域的當前字體:使用iTextSharp設置表單字段的不同部分以使其具有不同的字體

  // 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(); 

我想什麼可以做,我設置文本上方設置了「這樣的:」大膽,離開「將在現場顯示「非粗體。我不確定這實際上是否可行,但我認爲這值得提問,因爲這對我目前的工作非常有幫助。

提前致謝!

回答

8

是的,有點兒。 PDF字段可以具有豐富的文本值(自acrobat 6/pdf1.5以來)以及常規值。

常規值使用在默認外觀中定義的字體......單個字體。

豐富的數值格式(iText不直接支持,至少現在不支持)在PDF Reference的章節12.7.3.4中有描述。 <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添加富文本支持(不是尖銳的)。對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爲您創建外觀[s]。

+0

它在哪裏區分字段形式的文本?它是如何知道將這個設置爲不同的字體? – Jake 2015-08-11 15:37:28

+0

@Jake如果您在我的答案第12.7.4.3節中查看鏈接的PDF參考資料,您會看到完整的描述。它基本上是HTML的一個子集。 – 2015-09-28 18:18:57

0

花了一段時間才發現,richtextfield沒有按照 acrofields的方式工作,大多數情況下pdf在運行時不能用不同的字體進行編輯。

我想出了在acrofields中設置不同字體和傳遞值並在運行時用itextsharp編輯的方法,我認爲這對其他人很有用。

  1. 與PDF1.pdf(我希望你知道如何創建PDF場) 例如文本字段創建PDF,txtComments 轉到屬性部分並將屬性設置爲richtext,Mulitiline

  2. 通過添加字體和顏色來設置word或pdf中的文本內容的格式。 如果在word中完成,請複製並粘貼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


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() 

希望這有助於。

相關問題