I have several adobe fill-in forms that I use in my practice, often with info that comes from another program. Using Win32::GUITest::SendKeys, I have scripts that fill in the data for me. It doesn't take very long to set up, just tab through a document and write descriptive names. Other scripts export the data to a .pl file that is just a bunch of Scalar assignments.
ie: $DueDate = 'January 31, 2002;
Code looks like this, (CA Sales Tax Form):
use win32::GuiTest; $MyPhone = "xxx-xxx-xxxx"; do "STData.dat"; if ( $Client eq " TEST " ) # fill in company specific data { do "TEST.dat"; } system("start \"C:\Program Files\Adobe\Acrobat 5.0\Reader\AcroRd32.exe +\" Current_Sales_Tax"); sleep 10; Tab(); Send("$DueDate"); Tab(); Send("$Period"); Tab(); Send("$Year"); Tab(); Send("$PermitNum"); Tab(); Send("$Name"); Tab(); Send("$Street"); Tab(); Send("$City"); Tab(); Send("$State"); Tab(); Send("$Zip"); Tab(); Send("$GrossSales"); Tab(2); Send("$GrossSales"); Tab(); Send("$Resale"); Tab(); Send("$Food"); Tab(); Send("$Labor"); Tab(); Send("$SalesToGov"); Tab(10); Send("$TotalNonTaxable"); Tab(); Send("$SubjectToST"); Tab(2); Send("$StateTax"); Tab(); Send("$SubjectToST"); Tab(); Send("$CountyTax"); Tab(2); Send("$SubjectToST"); Tab(); Send("$LocalTax"); Tab(); Send("$DistrictTax"); Tab(); Send("$TotalST"); Tab(2); Send("$TotalST"); Tab(); Send("$PmtOne"); Tab(); Send("$PmtTwo"); Tab(); Send("$TotalPmt"); Tab(); Send("$RemaningTax"); Tab(3); Send("$RemaningTax"); Tab(2); Send("$CoPhone"); Tab(3); Send("$MyPhone"); Tab(3); Send("$SubjectToST"); Tab(2); Send("$SubjectToST"); Tab(); Send("$PermitNum"); Tab(); Send("$Period $Year"); #------------------------- Subroutines ------------------------- sub Send { Win32::GuiTest::SendKeys("$_[0]"); } sub Tab { #USAGE: Tab() or Tab(3) or any other number if ($_[0]) { Win32::GuiTest::SendKeys("{TAB $_[0]}"); } else { Win32::GuiTest::SendKeys("{TAB}"); } }
Any suggestions?

Replies are listed 'Best First'.
(Ovid) Re: Ghost fill in adobe forms
by Ovid (Cardinal) on Jan 03, 2002 at 05:14 UTC

    He Who Must Not Be Named asked if we had any suggestions.

    Um, yes. The tired old saw of use strict needs to be brought out. Using warnings would be a good idea. What if one of those variables is undefined and the person submitting the form doesn't notice? Also, from what I can tell, the global variables are apparently being populated with one of your do statements. Ugh. That's a great way to obfuscate the data source and to ensure that your variables are more like to be misspelled. Further, you should factor out common code elements:

    # this is too repetitive Tab(); Send("$DueDate"); Tab(); Send("$Period"); Tab(); Send("$Year"); Tab(); Send("$PermitNum");

    Instead of the above, try this:

    my @vars = ( $DueDate, $Period, $Year, $PermitNum ); foreach ( @vars ) { Tab(); Send( $_ ); }

    Cheers,
    Ovid

    Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.

      Thank you for your comments, it was my code. (I had not joined yet.)
      The use strict; is a good point. I was quite suprised when I looked back and did not find it in there.
      The comment to factor out common elements is on target, but the required output is not consistant. (Often two tabs, or same variable repeated; this is a government form, after all.)
      The reason the variables are being populated from the do statement is that they are coming from a text file generated by a VB script in an Excel worksheet. If there is a better way to handle this I would love to hear it.

        Since you already stepped down the slippery slope of Windows automation, you might as well go the full step and automate Excel from Perl, using Win32::OLE (for Windows) or Spreadsheet::ParseExcel (for Windows or Linux/other *nixes?) and some code grabbed from here (untested code):

        use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; # die on errors... $Win32::OLE::Warn = 3; # get already active Excel application or open new my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); # open Excel file my $Book = $Excel->Workbooks->Open("c:/komodo projects/test.xls"); # You can dynamically obtain the number of worksheets, rows, # and columns through the Excel OLE interface. Excel's # Visual Basic Editor has more information on the Excel OLE # interface. Here we just use the first worksheet, rows 1 # through 4 and columns 1 through 3. select worksheet # number 1 (you can also select a worksheet by name) my $Sheet = $Book->Worksheets(1); foreach my $row (1..4) { foreach my $col (1..3) { # skip empty cells next unless defined $Sheet->Cells($row,$col)->{'Value'}; # print out the contents of a cell printf "At ($row, $col) the value is %s and the formula is %s\n", $Sheet->Cells($row,$col)->{'Value'}, $Sheet->Cells($row,$col)->{'Formula'}; } } # clean up after ourselves $Book->Close;

        Of course, you could also use Perl to manipulate that workbook :

        $sheet->Cells($row, $col)->{'Value'} = 1;
        perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The $d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider ($c = $d->accept())->get_request(); $c->send_response( new #in the HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web