PDF formu PDF form alan adlarını ayıklamak

4 Cevap ûnet

Ben bir XFDF dosyası ile bir PDF formu doldurmak PDFTK kullanıyorum. Ancak, bu proje için ben alanlar mevcut olacak önceden ne bilmiyorum, bu yüzden alanların doldurulması gereken görmek için PDF kendisi analiz etmek gerekir, buna göre kullanıcıya bir arayüz sunmak, ve sonra bir XFDF dosyası dan oluşturmak Bu PDF formu doldurmak.

Nasıl alan adları alabilirim? Tercihen komut satırı,. NET veya PHP çözümleri.

4 Cevap

Ben müvekkilimin bu sorunu tamamen ortadan kaldırır PDF, birlikte Acrobat kullanarak (alan adları) XFDF dosyasını dışa alabilirsiniz.

Kolay! Zaten PDFTK kullanıyorsunuz

# pdftk input.pdf dump_data_fields

Bu çıktısı Alan adı, alan tipi, bir kısmı (ben son derece yararlı olduğu bulundu) (açılan liste veya metin hizalama için seçenekleri nelerdir gibi) ve hatta bir Tooltip metin özellikleri bulunuyor

Kaçırdığım tek şey alan koordinatlar olduğunu ...

Ben WebSupergoo gelen ABCpdf kullanarak, aşağıdaki kodu kullanılmış, ama çoğu kütüphaneler karşılaştırılabilir sınıfları var düşünün:

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

This does 2 things: 1) Populates a textbox with the inventory of all Form Fields, showing their name, fieldtype, and their page number and position on the page (0,0 is lower left, by the way). 2) Populates all the textfields with their field name in an output file - print the output file, and all of your text fields will be labelled.

Benim çözüm PHP değil, ama kullanışlı gelebilir umut olsa benden çok geç cevap, herkes Ruby için bir çözüm arıyor gerekir.

Öncelikle tüm alanlar daha sonra biz iyi bir karma okunabilir olması için, Temizlenecek dökümü metin gerekir dışarı isim ayıklamak için PDFTK kullanmaktır:

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

İkincisi, şimdi bizim XFDF'den oluşturmak için herhangi bir XML ayrıştırma kullanabilirsiniz:

# 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

Viyola, bu ana mantık bu. Ben çok Ruby hafif lib arıyorsanız eğer nguyen (https://github.com/joneslee85/nguyen) gem deneyin öneriyoruz.