Saltar al contenido

¿Es posible modificar los nombres de los campos del formulario PDF?

Este grupo redactor ha pasado mucho tiempo investigando para darle espuestas a tu búsqueda, te ofrecemos la respuesta por esto nuestro objetivo es serte de mucha ayuda.

Solución:

La buena noticia: puede cambiar los nombres de los campos en iTextSharp.

Sin embargo, en realidad no puedes editar un PDF. Leería un PDF existente, actualizaría los nombres de los campos en la memoria y luego escribiría su PDF revisado. Para cambiar el nombre de un campo, llame al método AcroFields.RenameField.

Aquí hay un fragmento:

PdfReader reader = new PdfReader(PDF_PATH);
using (FileStream fs = new FileStream("Test Out.pdf", FileMode.Create)) 
    PdfStamper stamper = new PdfStamper(reader, fs);
    AcroFields fields = stamper.AcroFields;
    fields.RenameField("oldFieldName", "newFieldName");
    stamper.Close();

Ahora las malas noticias: parece haber limitaciones en los caracteres que puede usar en los campos renombrados.

Probé el fragmento anterior con su nombre de campo de ejemplo y no funcionó. Sin embargo, elimine los períodos y funciona. No estoy seguro de si hay una solución, pero esto puede ser un problema para usted,

El nombre completo de un campo de AcroForm no se almacena explícitamente dentro de un campo. En realidad, se deriva de una jerarquía de campos, con una lista de ancestros delimitada por puntos que aparece a la izquierda.

Simplemente cambiando el nombre de un campo de ‘topmostSubform[0].Página 1[0].Dirección web[0]’ a ‘WebsiteAddress’, por lo tanto, es poco probable que produzca un resultado correcto.

Encontrará la sección 8.6.2 ‘Diccionarios de campo’ de la referencia en PDF que proporciona una buena explicación de cómo funciona la denominación de campo 😉

Básicamente, cada campo en un AcroForm está definido por un diccionario, que puede contener ciertas entradas opcionales relacionadas con el nombre de un campo.

  • La tecla ‘/T’ especifica el nombre parcial. En su pregunta, ‘topmostSubform[0]’, ‘Página 1[0]’ y Dirección_del_sitio_web[0], todos representan nombres parciales.

  • La clave ‘/TU’ especifica un nombre alternativo ‘fácil de usar’ para los campos, que se puede usar en lugar del nombre de campo real para identificar campos en una interfaz de usuario.

En lugar de cambiar el nombre del campo en cuestión, piense en agregar una entrada /TU.

El siguiente ejemplo usa ABCpdf para recorrer todos los campos en un AcroForm e insertar un nombre alternativo en un campo basado en su nombre parcial.

VBScript:

Set theDoc = CreateObject("ABCpdf7.Doc")
theDoc.Read "myForm.pdf"

Dim theFieldIDs, theList
theFieldIDs = theDoc.GetInfo(theDoc.Root, "Field IDs")
theList = Split(theFieldIDs, ",")

For Each fieldID In theList
    thePartialName = theDoc.GetInfo(fieldID, "/T:text")
    theDoc.SetInfo fieldID, "/TU:text", thePartialName
Next

theDoc.Save "output.pdf"
theDoc.Clear

Cambiando "/TU:text" a "/T:text" establecerá el nombre parcial de un campo.

Ejemplos escritos en C# y VB.NET de las funciones utilizadas se pueden encontrar aquí: Doc.GetInfo, Doc.SetInfo. Consulte también la documentación sobre rutas de objetos.

Tuve el problema ayer y después de probar las respuestas en el foro y otros, pero no avancé. Mi código se veía así.

// Open up the file and read the fields on it.
var pdfReader = new PdfReader(PATH_TO_PDF);
var fs = new FileStream(pdfFilename, FileMode.Create, FileAccess.ReadWrite)
var stamper = new PdfStamper(pdfReader, fs);
var pdfFields = stamper.AcroFields;

//I thought this next line of code I commented out will do it
//pdfFields.RenameField("currentFieldName", "newFieldName");

// It did for some fields, but returned false for others.
// Then I looked at the AcroFields.RenameField method in itextSharp source and noticed some restrictions. You may want to do the same.
//  So I replaced that line  pdfFields.RenameField(currentFieldName, newFieldName); with these 5 lines

AcroFields.Item item = pdfFields.Fields[currentFieldName];
PdfString ss = new PdfString(newFieldName, PdfObject.TEXT_UNICODE);
item.WriteToAll(PdfName.T, ss, AcroFields.Item.WRITE_VALUE | AcroFields.Item.WRITE_MERGED);
item.MarkUsed(pdfFields, AcroFields.Item.WRITE_VALUE);
pdfFields.Fields[newFieldName] = item;

Y eso hizo el trabajo

Nos puedes avalar nuestra misión fijando un comentario y dejando una puntuación te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *