c# - PDFSharp rellenando campos de formulario
(5)
Me gustaría rellenar los campos del formulario en un documento PDF prefabricado, pero recibo un error de Nence Refrence con AcroForm cuando se ejecuta.
string fileN4 = TextBox1.Text + " LOG.pdf";
File.Copy(Path.Combine(textBox4.Text + "//", fileN4),
Path.Combine(Directory.GetCurrentDirectory(), fileN4), true);
// Open the file
PdfDocument document = PdfReader.Open(fileN4, PdfDocumentOpenMode.Modify);
PdfTextField currentField = (PdfTextField)(document.AcroForm.Fields["<CASENUM>"]);
//const
string caseName = TextBox1.Text;
PdfString caseNamePdfStr = new PdfString(caseName);
//set the value of this field
currentField.Value = caseNamePdfStr;
// Save the document...
document.Save(fileN4);
Así que PdfTextField currentField = (PdfTextField)(document.AcroForm.Fields["<CASENUM>"]);
Es donde ocurre el error. Parece que AcroForm ni siquiera reconoce los campos.
Otra opción sería buscar y reemplazar texto en un PDF (sin usar itextsharp como no se puede usar debido a la licencia).
¡Cualquier ayuda sería increíble!
¿Ha intentado colocar el directorio actual cuando intenta abrirlo?
Cambio
PdfDocument document = PdfReader.Open(fileN4, PdfDocumentOpenMode.Modify);
a
PdfDocument document = PdfReader.Open(Path.Combine(Directory.GetCurrentDirectory(), fileN4), PdfDocumentOpenMode.Modify);
Estoy bastante seguro de que PdfReader necesitará una ruta de archivo completa, aunque solo uso ASPOSE para la creación de pdf.
Acabo de experimentar algo similar a esto. El primer archivo pdf que abrí no contenía datos de acroforma y resultó en una excepción nula como se describe anteriormente. El problema no está en la apertura del pdf, sino en la referencia a la variable miembro Acroform que tiene un valor nulo. Puedes probar tu pdf usando el siguiente ejemplo de código:
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
PdfDocument _document = null;
try
{
_document = PdfReader.Open(ofd.FileName, PdfDocumentOpenMode.Modify);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message,"FATAL");
//do any cleanup and return
return;
}
if (_document != null)
{
if (_document.AcroForm != null)
{
MessageBox.Show("Acroform is object","SUCCEEDED");
//pass acroform to some function for processing
_document.Save(@"C:/temp/newcopy.pdf");
}
else
{
MessageBox.Show("Acroform is null","FAILED");
}
}
else
{
MessageBox.Show("Uknown error opening document","FAILED");
}
}
ADENDUM
También noté que la clave en esta línea de código no debería tener corchetes angulares
document.AcroForm.Fields["<CASENUM>"]
Cambiarlo a
document.AcroForm.Fields["CASENUM"]
He estado trabajando en esto hoy y he logrado crear una solución de trabajo. He pegado mi código de trabajo a continuación. Las únicas diferencias reales que puedo ver entre mi código y los OP son las siguientes:
- Incluí el código de Marc Ferree para establecer NeedAppearances (+1 y ¡Muchas gracias!)
- Establecí la propiedad de Texto del campo usando una variable de Cadena , y no la propiedad de Valor usando una PdfString .
Esperemos que esto sea de utilidad para alguien que intenta hacer lo mismo.
string templateDocPath = Server.MapPath("~/Documents/MyTemplate.pdf");
PdfDocument myTemplate = PdfReader.Open(templateDocPath, PdfDocumentOpenMode.Modify);
PdfAcroForm form = myTemplate.AcroForm;
if (form.Elements.ContainsKey("/NeedAppearances"))
{
form.Elements["/NeedAppearances"] = new PdfSharp.Pdf.PdfBoolean(true);
}
else
{
form.Elements.Add("/NeedAppearances", new PdfSharp.Pdf.PdfBoolean(true));
}
PdfTextField testField = (PdfTextField)(form.Fields["TestField"]);
testField.Text = "012345";
myTemplate.Save(Server.MapPath("~/Documents/Amended.pdf")); // Save to new file.
La solución para superar la NullReferenceException
es abrir su PDF prefabricado con Adobe Acrobat y asignar a los campos de formulario un valor predeterminado, cambiando su tipo de propiedad para que sea algo distinto de null
.
También necesita esto si está intentando rellenar campos de formulario PDF, también necesita establecer el elemento NeedsAppearances en verdadero. De lo contrario, el PDF "ocultará" los valores en el formulario. Aquí está el código VB.
If objPdfSharpDocument.AcroForm.Elements.ContainsKey("/NeedAppearances") = False Then
objPdfSharpDocument.AcroForm.Elements.Add("/NeedAppearances", New PdfSharp.Pdf.PdfBoolean(True))
Else
objPdfSharpDocument.AcroForm.Elements("/NeedAppearances") = New PdfSharp.Pdf.PdfBoolean(True)
End If