2010-12-10 67 views
6

No estoy seguro de que esto sea posible, pero pensé que valdría la pena preguntar. He descubierto cómo configurar la fuente de un formfield usando los métodos pdfstamper y acrofields, pero me gustaría poder establecer la fuente de diferentes partes del texto en el mismo campo. Así es como estoy configurando el tipo de letra de los campos del formulario actualmente:Establecer diferentes partes de un campo de formulario para tener diferentes tipos de letra utilizando 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(); 

Lo que me gustaría ser capaz de hacer cuando me puse el texto anterior está el "Este" en negrita y dejar la " Se mostrará en el campo "sin negrita". No estoy seguro de que esto sea realmente posible, pero pensé que valía la pena preguntar, porque realmente sería útil en lo que estoy trabajando actualmente.

¡Gracias de antemano!

Respuesta

8

Sí, un poco. Los campos PDF pueden tener un valor de texto enriquecido (desde acrobat 6/pdf1.5) junto con un valor regular.

El valor normal utiliza la fuente definida en las apariencias predeterminadas ... una sola fuente.

El formato de valor enriquecido (que iText no admite directamente, al menos no todavía), se describe en el capítulo 12.7.3.4 del PDF Reference. <b>, <i>, <p>, y bastantes atributos de texto css2. Requiere un con varios atributos.

Para habilitar valores enriquecidos, debe establecer el bit 26 de los indicadores de campo (PdfName.FF) para un campo de texto. PdfFormField no tiene una "setRichValue", pero son los diccionarios, lo que sólo puede:

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

Si usted está tratando de añadir texto enriquecido a un campo existente que aún no son compatibles con ella:

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 realidad estoy agregando soporte de texto enriquecido a iText (no nítido) mientras escribo este mensaje. Hurra por los contribuyentes en SO. Paulo ha sido bueno para mantener iTextSharp sincronizado últimamente, por lo que no debería ser un problema. La próxima apertura del maletero debe tener esta función ... por lo que sería capaz de escribir:

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 generación de la apariencia de iText no se ha actualizado, sólo el lado valor de cosas. Eso requeriría mucho más trabajo. Por lo tanto, querrá acroFields.setGenerateAppearances(false) o JS que restablece el valor del campo cuando se abre el formulario para obligar a Acrobat/Reader a crear el aspecto [s] para usted.

+0

¿Dónde se distingue entre el texto en el formulario de campo? ¿Cómo sabe establecer esto: a una fuente diferente? – Jake

+0

@Jake Si va a la referencia de PDF vinculada en mi respuesta, sección 12.7.4.3, verá la descripción completa de lo que está permitido. Básicamente es un subconjunto de HTML. –

0

Me tomó un tiempo darme cuenta después de que richtextfield no funcionó de la manera en que se suponía que también con acrofields y la mayoría de los casos era que el pdf no se podía editar con diferentes fuentes en tiempo de ejecución.

Trabajé manera de configurar diferentes fuentes en acrofields y pasando valores y edición en tiempo de ejecución con itextsharp y pensé que sería útil para otros.

  1. Crear PDF con un campo de texto en PDF1.pdf (espero que sabe cómo crear campo en pdf), por ejemplo , txtComments Vaya a la sección de propiedades y Establezca la propiedad en richtext, Mulitiline

  2. Formatee el contenido del texto en Word o PDF agregando las fuentes y los colores. Si está hecho en Word, copie y pegue el contenido en el campo pdf - txtcomments.

    Nota: Si desea agregar contenido dinámico. Establezca el parámetro "{0}" en el campo txtComment en el pdf. utilizando el método de formato de cadena, puede establecer valores para él. Esto se muestra en el código a continuación.

     e.g., "Set different parts of a form field to have different fonts using {0}" 
    
  3. Agregue el código siguiente en un botón (esto no es específico) por evento de referencia en el 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() 

Espero que esto ayude.

Cuestiones relacionadas