Estoy usando pdftk para rellenar en un formulario PDF con un archivo XFDF. Sin embargo, para este proyecto no se sabe de antemano cuáles son los campos que estarán presentes, así que es necesario analizar el archivo PDF para ver qué campos deben ser llenados, presentan una interfaz para el usuario de acuerdo, y, a continuación, generar un archivo XFDF desde que rellenar el formulario en PDF.

¿Cómo puedo obtener los nombres de campo? Preferencia de línea de comandos, .NET o PHP soluciones.

  • Christopher, si usted ha encontrado una solución que me animo a publicar y se marca como una respuesta para que otros puedan beneficiarse de ella en el futuro. O usted puede elegir el delete link para eliminar tu pregunta.
  • Va a hacer. Saludos.

6 Comentarios

  1. 47

    Fácil! Usted está utilizando pdftk ya

    # pdftk input.pdf dump_data_fields

    Que es la salida de nombre de Campo, tipo de campo, algunas de sus propiedades (como lo son las opciones de la lista desplegable o de la alineación del texto) e incluso un texto de información sobre herramientas (que he encontrado para ser extremadamente útil)

    La única cosa que me falta es el campo de las coordenadas…

    • Esta debe ser la respuesta seleccionada. Alternativamente, si usted tiene Adobe Professional, usted puede haga clic en Formularios > Administrar el Formulario de Datos > Datos de Exportación para exportar los datos a un archivo FDF. A continuación, abra el archivo FDF y obtener los nombres de los campos relacionados con los valores de población.
    • Impresionante, me ha ayudado mucho (perdido un día en busca de la solución)
    • de dónde viene este comando ir? Está disponible en la versión Gratuita de pdftk?
    • Dios santo que bello hijo de puta. Gracias, gracias, gracias.
  2. 8

    Esto funcionó para mí:

     pdftk 1.pdf dump_data_fields output test2.txt

    Entonces cuando el archivo está cifrado con una contraseña, esta es la forma en que se puede leer de ella

     pdftk 1.pdf input_pw YOUR_PASSWORD_GOES_HERE dump_data_fields output test2.txt

    Esto me tomó 2 horas para llegar a la derecha, así que espero poder ahorrar algo de tiempo 🙂

  3. 1

    He utilizado el siguiente código, mediante ABCpdf de WebSupergoo, pero me imagino que la mayoría de las bibliotecas tienen clases comparables:

    protected void Button1_Click(object sender, EventArgs e)
        {
            Doc thedoc = new Doc();
            string saveFile = "~/docs/f1_filled.pdf";
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            thedoc.Read(Server.MapPath("~/docs/F1_2010.pdf"));
            foreach (Field fld in thedoc.Form.Fields)
            {
                if (!(fld.Page == null))
                {
                    sb.AppendFormat("Field: {0}, Type: {1},page: {4},x: {2},y: {3}\n", fld.Name, fld.FieldType.ToString(), fld.Rect.Left, fld.Rect.Top, fld.Page.PageNumber);
                }
                else
                {
                    sb.AppendFormat("Field: {0}, Type: {1},page: {4},x: {2},y: {3}\n", fld.Name, fld.FieldType.ToString(), fld.Rect.Left, fld.Rect.Top, "None");
                }
                if (fld.FieldType == FieldType.Text)
                {
                    fld.Value = fld.Name;
                }
    
            }
    
            this.TextBox1.Text = sb.ToString();
            this.TextBox1.Visible = true;
            thedoc.Save(Server.MapPath(saveFile));
            Response.Redirect(saveFile);
        }

    Esta hace 2 cosas:
    1) Rellena un cuadro de texto con el inventario de todos los Campos del Formulario, indicando su nombre, fieldtype, y su número de página y la posición en la página (0,0 es inferior a la izquierda, por el camino).
    2) Rellena todos los campos de texto con su nombre de campo en un archivo de salida – imprimir el archivo de salida, y todos los campos de texto serán etiquetados.

  4. 1

    Una muy tardía respuesta de mí, aunque mi solución no es PHP, pero tengo la esperanza de que podría venir bien si alguien está buscando una solución para Ruby.

    Primera es el uso de pdftk para extraer todos los campos de nombre, entonces necesitamos para la limpieza del volcado de texto, para tener una buena lectura de hash:

    def extract_fields(filename)
      field_output = `pdftk #{filename} dump_data_fields 2>&1`
      @fields = field_output.split(/^---\n/).map do |field_text|
        if field_text =~ /^FieldName: (\w+)$/
          $1
        end
      end.compact.uniq
    end

    Segundo, ahora podemos usar cualquier XML analizar para la construcción de nuestra XFDF:

    # code borrowed from `nguyen` gem [https://github.com/joneslee85/nguyen]
    # generate XFDF content
    def to_xfdf(fields = {}, options = {})
      builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
        xml.xfdf('xmlns' => 'http://ns.adobe.com/xfdf/', 'xml:space' => 'preserve') {
          xml.f(:href => options[:file]) if options[:file]
          xml.ids(:original => options[:id], :modified => options[:id]) if options[:id]
          xml.fields {
            fields.each do |field, value|
              xml.field(:name => field) {
                if value.is_a? Array
                  value.each { |item| xml.value(item.to_s) }
                else
                  xml.value(value.to_s)
                end
              }
            end
          }
        }
      end
      builder.to_xml
    end
    
    # write fdf content to path
    def save_to(path)
      (File.open(path, 'w') << to_xfdf).close
    end

    Viola, que es el de la lógica principal. Le recomiendo que dar nguyen (https://github.com/joneslee85/nguyen) gema una oportunidad si usted está buscando un ligero lib en Ruby.

  5. 0

    C# /ITextSharp

        public static void TracePdfFields(string pdfFilePath)
        {
            PdfReader pdfReader = new PdfReader(pdfFilePath);
            MemoryStream pdfStream = new MemoryStream();
            PdfStamper pdfStamper = new PdfStamper(pdfReader, pdfStream, '
        public static void TracePdfFields(string pdfFilePath)
    {
    PdfReader pdfReader = new PdfReader(pdfFilePath);
    MemoryStream pdfStream = new MemoryStream();
    PdfStamper pdfStamper = new PdfStamper(pdfReader, pdfStream, '\0', true);
    int i = 1;
    foreach (var f in pdfStamper.AcroFields.Fields)
    {
    pdfStamper.AcroFields.SetField(f.Key, string.Format("{0} : {1}", i, f.Key));
    i++;
    //DoTrace("Field = [{0}] | Value = [{1}]", f.Key, f.Value.ToString());
    }
    pdfStamper.FormFlattening = false;
    pdfStamper.Writer.CloseStream = false;
    pdfStamper.Close();
    FileStream fs = File.OpenWrite(string.Format(@"{0}/{1}-TracePdfFields_{2}.pdf", 
    ConfigManager.GetInstance().LogConfig.Dir, 
    new FileInfo(pdfFilePath).Name, 
    DateTime.Now.Ticks));
    fs.Write(pdfStream.ToArray(), 0, (int)pdfStream.Length);
    fs.Flush();
    fs.Close();
    }
    '
    , true); int i = 1; foreach (var f in pdfStamper.AcroFields.Fields) { pdfStamper.AcroFields.SetField(f.Key, string.Format("{0} : {1}", i, f.Key)); i++; //DoTrace("Field = [{0}] | Value = [{1}]", f.Key, f.Value.ToString()); } pdfStamper.FormFlattening = false; pdfStamper.Writer.CloseStream = false; pdfStamper.Close(); FileStream fs = File.OpenWrite(string.Format(@"{0}/{1}-TracePdfFields_{2}.pdf", ConfigManager.GetInstance().LogConfig.Dir, new FileInfo(pdfFilePath).Name, DateTime.Now.Ticks)); fs.Write(pdfStream.ToArray(), 0, (int)pdfStream.Length); fs.Flush(); fs.Close(); }
  6. -1

    Puedo obtener mi cliente para exportar el archivo XFDF (que contiene los nombres de campo) utilizando Acrobat junto con el PDF, que evita este problema completamente.

    • A qué te refieres Acrobat Reader o algunos de los productos de Acrobat?
    • Por favor diga el nombre de su cliente, y cómo generar el Archivo XFDF

Dejar respuesta

Please enter your comment!
Please enter your name here