List all field names on a PDF using iText from Rails


#1

Hello everyone,

Has anyone used iText to list all fields on a PDF AcroForm?
There are plenty of java examples to do it, but I do not know how to
translate that into ruby. I’m using Rjb.

The Java example I’ve found is:

AcroFields form = reader.getAcroFields();
HashMap fields = form.getFields();
String key;
for (Iterator i = fields.keySet().iterator(); i.hasNext(); ) {
key = (String) i.next();
System.out.print(key + ": ");
switch(form.getFieldType(key)) {
case AcroFields.FIELD_TYPE_CHECKBOX:
System.out.println(“Checkbox”);
break;
case… (other types)
}
}

TIA,
Dan


#2

Check out this code: http://github.com/jaywhy/pdf-stamper/tree/master
I haven’t used it, as it wasn’t around when I needed it, so I wrote my
own,
but this code looks very similar to what I wrote, so it may work well
for
what you need.

The highlighted line in this link shows how the fields can be listed:

http://github.com/jaywhy/pdf-stamper/blob/3f1f6bd7867994bd9124b8b1ffa613007903d22a/lib/pdf/stamper/rjb.rb#L35


Benjamin C.
http://railskits.com/ - Ready-made Rails code
http://catchthebest.com/ - Team-powered recruiting
http://www.bencurtis.com/ - Personal blog

On Sun, May 24, 2009 at 11:59 PM, Dan S. <


#3

Benjamin,

Thanks for the tip.

Here is the complete code. The big hangup was the .to_string. I kept
trying to use .to_s thinking Rjb would translate for me. NOT!

Note that the output can be cut and pasted into a db migration file.
*------------------------------------------------------------------------
class ListfieldsController < ApplicationController

require ‘lib/pdfstamper’

protect_from_forgery :only => [:create, :update, :destroy]

def index
end

def output
template = params[:pdffile]
logger.info(“Here in listfields.output with PDFfile =>#{template}”)
filestream = Rjb::import(‘java.io.FileOutputStream’)
acrofields = Rjb::import(‘com.lowagie.text.pdf.AcroFields’)
pdfreader = Rjb::import(‘com.lowagie.text.pdf.PdfReader’)
treemap = Rjb::import(‘java.util.TreeMap’)

reader = pdfreader.new( template )
@form = reader.getAcroFields()
@fields = @form.getFields()
fs = treemap.new(@fields)
@k = fs.keySet()  # @k gets sorted list of field names

end
end
*------------------------------------------------------------------------

and the view:
*------------------------------------------------------------------------

Untitled Document Field Name|Type

 

  <% itr = @k.iterator()
       while itr.hasNext()
  %>
  <%= "t.string : #{itr.next().to_string}" -%>
  <% end %>
*------------------------------------------------------------------------

HTH,
Dan