Définir différentes parties d’un champ de formulaire pour avoir différentes fonts à l’aide de iTextSharp

Je ne suis pas sûr que ce soit possible, mais je me suis dit que cela valait la peine de demander. J’ai compris comment définir la police d’un formulaire avec les méthodes pdfstamper et acrofields, mais j’aimerais vraiment pouvoir définir la police de différentes parties du texte dans le même champ. Voici comment définir la police des champs de formulaire:

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

Ce que j’aimerais pouvoir faire lorsque le texte ci-dessus est défini est défini comme “This:” en gras et que le “Sera affiché dans le champ” n’est pas en gras. Je ne suis pas sûr que ce soit réellement possible, mais je me suis dit que cela valait la peine de poser la question, car ce serait vraiment utile dans le cadre de mes travaux actuels.

Merci d’avance!

Oui, un peu. Les champs PDF peuvent avoir une valeur de texte enrichi (depuis acrobat 6 / pdf1.5) ainsi qu’une valeur régulière.

La valeur normale utilise la police définie dans les apparences par défaut … une seule police.

Le format de valeur riche (qu’iText ne prend pas directement en charge, du moins pas encore) est décrit au chapitre 12.7.3.4 du document PDF Reference . , ,

et de nombreux atsortingbuts de texte css2. Cela nécessite un avec différents atsortingbuts.

Pour activer les valeurs riches, vous devez définir le bit 26 des indicateurs de champ ( PdfName.FF ) pour un champ de texte. PdfFormField n’a pas de “setRichValue”, mais ce sont des dictionnaires, vous pouvez donc simplement:

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

Si vous essayez d’append du texte enrichi à un champ existant qui ne le prend pas déjà en charge:

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

En fait, j'ajoute un support de texte enrichi à iText (non net) au fur et à mesure que je tape ce message. Vive les consortingbuteurs sur SO. Paulo a bien fait de garder iTextSharp en phase ces derniers temps, donc ça ne devrait pas être un problème. La prochaine version du coffre devrait avoir cette fonctionnalité ... pour pouvoir écrire:

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

ou

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

REMARQUE: la génération d’apparence iText n’a pas été mise à jour, mais uniquement la valeur. Cela prendrait beaucoup plus de travail. Vous aurez donc besoin de acroFields.setGenerateAppearances(false) ou d’avoir JS qui réinitialise la valeur du champ lorsque le formulaire est ouvert pour forcer Acrobat / Reader à créer l’apparence [s] pour vous.

Il m’a fallu du temps pour comprendre que richtextfield ne fonctionnait pas comme il était supposé avec acrofields et que la plupart des cas où le fichier pdf n’était pas éditable avec différentes fonts au moment de l’exécution.

J’ai travaillé sur la manière de définir différentes fonts dans acrofields et de transmettre des valeurs et de les éditer à l’exécution avec itextsharp et j’ai pensé que cela serait utile pour les autres.

  1. Créez un pdf avec un champ texte en PDF1.pdf (j’espère que vous savez comment créer un champ en pdf), par exemple, txtComments Accédez à la section de la propriété et définissez la propriété sur richtext, Mulitiline

  2. Formatez le contenu du texte en Word ou en PDF en ajoutant les fonts et les couleurs. Si cela est fait en word, copiez et collez le contenu en pdf – txtcomments field.

    Remarque: Si vous souhaitez append du contenu dynamic. Définissez le paramètre «{0}» sur le champ txtComment du fichier pdf. en utilisant la méthode de format de chaîne, vous pouvez lui atsortingbuer des valeurs. C’est ce que montre le code ci-dessous.

      eg, "Set different parts of a form field to have different fonts using {0}" 
  3. Ajoutez le code suivant à un événement bouton (non spécifique) par référence dans le fichier 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; ssortingng comments = field .GetFieldRichValue("txtcomments"); ssortingng Name = "Test1"; ssortingng value = ssortingng.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() 

J’espère que cela t’aides.