2010-12-10 10 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以降)と通常の値を持つことができます。

通常の値は、デフォルトの外観で定義されたフォント...単一のフォントを使用します。

PDF Referenceの12.7.3.4章では、豊富な値の形式(iTextでは少なくともまだサポートしていません)について説明しています。 <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の貢献者のためのHurray。パウロは、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)にするか、Acrobat/Readerに外観を構築させるためにフォームが開かれたときにフィールド値をリセットするJSを持っているでしょう。

+0

フィールドフォームのテキストはどこで区別されますか?これを設定することはどのようにして知ることができますか? – Jake

+0

@ Jake私の答えである12.7.4.3でリンクされたPDF Referenceに行くと、許可されているものの完全な説明が表示されます。これは基本的にHTMLのサブセットです。 –

0

richtextfieldが仮定したように動作しなかったのを知るには時間がかかりました acrofieldsとほとんどの場合、pdfは実行時に異なるフォントで編集できませんでした。

acrofieldsで異なるフォントを設定して値を渡し、実行時にitextsharpで編集する方法を考えました。他の人にとっては便利だと思いました。

  1. PDF1.pdfでテキストフィールド(私はあなたがPDFファイル内のフィールドを作成する方法を知っている願っています) 例えばでPDFを作成、txtComments プロパティセクションに移動し、プロパティをrichtext、Mulitilineに設定します。

  2. フォントまたは色を追加してテキストコンテンツをワードまたは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


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

・ホープ、このことができます。

関連する問題