Impostare diverse parti di un campo modulo per avere diversi tipi di carattere utilizzando iTextSharp

Non sono sicuro che sia ansible, ma ho pensato che valesse la pena di chiedermelo. Ho capito come impostare il font di un campo form utilizzando i metodi pdfstamper e acrofield, ma mi piacerebbe molto poter impostare il font di diverse parti del testo nello stesso campo. Ecco come imposto il carattere dei campi del modulo al momento:

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

Quello che mi piacerebbe essere in grado di fare dove ho impostato il testo sopra è impostare “This:” in grassetto e lasciare “The Be Be Displayed In The Field” non in grassetto. Non sono sicuro che sia effettivamente ansible, ma ho pensato che valesse la pena chiedere perché sarebbe davvero utile in quello che sto attualmente lavorando.

Grazie in anticipo!

Sì, un pò. I campi PDF possono avere un valore rich text (poiché acrobat 6 / pdf1.5) insieme a un valore normale.

Il valore normale usa il carattere definito nelle apparenze di default … un singolo font.

Il formato rich value (che iText non supporta direttamente, almeno non ancora), è descritto nel capitolo 12.7.3.4 del riferimento PDF . , ,

e alcuni attributi di testo css2. Richiede un con vari attributi.

Per abilitare i valori rich, devi impostare il bit 26 dei flag di campo ( PdfName.FF ) per un campo di testo. PdfFormField non ha un “setRichValue”, ma sono dizionari, quindi puoi semplicemente:

 myPdfFormField.put(PdfName.RV, new PdfString( richTextValue ) ); 

Se stai tentando di aggiungere il rich text a un campo esistente che non lo supporta già:

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

In realtà sto aggiungendo il supporto di testo avanzato a iText (non nitido) mentre scrivo questo messaggio. Evviva i contributori su SO. Paulo è stato bravo a mantenere iTextSharp sincronizzato ultimamente, quindi non dovrebbe essere un problema. La prossima versione del trunk dovrebbe avere questa funzione ... quindi potresti scrivere:

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

o

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

NOTA: la generazione di aspetto di iText non è stata aggiornata, solo il lato valore delle cose. Ciò richiederebbe molto più lavoro. Quindi dovrai acroFields.setGenerateAppearances(false) o JS che reimposta il valore del campo quando il modulo è aperto per forzare Acrobat / Reader a creare l'aspetto [s] per te.

Mi ci è voluto un po ‘di tempo per capire dopo che il richtextfield non funzionava nel modo in cui era supposto anche con acrofield e la maggior parte dei casi in cui il pdf non era modificabile con caratteri diversi in fase di esecuzione.

Ho elaborato il modo di impostare diversi tipi di carattere in acrofield e passare valori e modifiche in fase di esecuzione con itextsharp e ho pensato che sarebbe utile per gli altri.

  1. Crea pdf con un campo di testo in PDF1.pdf (spero tu sappia come creare campo in pdf) ad esempio, txtComments Vai alla sezione delle proprietà e imposta la proprietà a richtext, Mulitiline

  2. Formatta il contenuto del testo in formato word o pdf aggiungendo font e colors. Se fatto a parole, copia e incolla il contenuto nel campo pdf – txtcomments.

    Nota: se si desidera aggiungere un contenuto dinamico. Impostare il parametro “{0}” nel campo txtComment nel pdf. utilizzando il metodo del formato stringa è ansible impostare dei valori. Questo è mostrato nel codice qui sotto.

      eg, "Set different parts of a form field to have different fonts using {0}" 
  3. Aggiungere il seguente codice in un pulsante (questo non è specifico) evento per riferimento in 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() 

Spero che questo ti aiuti.