in reply to Re^2: inline::java error
in thread inline::java error

"template, report and xmlData are supposed to be parameters passed to the method. did I not do that correctly?"

You did, but then you also defined them as part of the class definition, outside the method, which makes them object properties.

"or when I try to add arguments I get the error:

"'can't convert arg to object'"

That's because the generatePdfReport method expects to be passed three Java objects as parameters. This is totally possible with Inline::Java, but generally speaking I find it much easier to pass plain old strings back and forth over the language barrier.

In your case, the FileInputStream and FileOutputStream objects can easily be constructed from a filename (i.e. a string), so it certainly makes a lot of sense to pass them into the method as plain old strings instead of instantiating InputStream/OutputStream objects at the Perl end and passing them in.

Anyway, this is how I'd do it...

#!/usr/bin/perl use strict; use warnings; BEGIN { $ENV{CLASSPATH}='.:/usr/share/java/*:/the paths to the jars used/' +; } use Inline Java => <<'END', CLASSPATH => $ENV{CLASSPATH}; import java.datasource.dom4j.Dom4jDataSource; import java.xmlreport.ProcessPdf; import java.xmlreport.ProcessReport; import java.io.InputStream; import java.io.OutputStream; import org.dom4j.Element; public class PdfReportGenerator { public static void generatePdfReport( String template_filename, String report_filename, String xmlData_filename ) throws Exception { // This function gets passed its parameters as strings // (makes it easier to call from Perl), so turn them into // InputStream and OutputStream objects. InputStream template = new FileInputStream(template_filename); OuputStream report = new FileOutputStream(report_filename); InputStream xmlData = new FileInputStream(xmlData_filename); ProcessReport.init(); // create the report. ProcessPdf proc = new ProcessPdf(template, report); proc.processSetup(); proc.processData(new Dom4jDataSource(xmlData), ""); proc.processComplete(); } } END my $generator = PdfReportGenerator->new; $generator->generatePdfReport( "/path/template.docx", "/path/report.pdf", "/path/datasource.xml", );

This is obviously untested, as I don't have the required Java libraries on this system. But, based on my fairly limited experience of Inline::Java, I think it ought to work (or at least be close to working).

perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

Replies are listed 'Best First'.
Re^4: inline::java error
by cliffrubinmusic (Novice) on Jul 14, 2012 at 18:50 UTC
    Hi; Thank you so much..I feel like it's starting to make sense..BUT, this is the error I'm receiving now..

    PdfReportGenerator.java:20: cannot find symbol symbol : class FileInputStream location: class PdfReportGenerator InputStream template = new FileInputStream(template_filename); ^ PdfReportGenerator.java:21: cannot find symbol symbol : class OuputStream location: class PdfReportGenerator OuputStream report = new FileOutputStream(report_filename); ^ PdfReportGenerator.java:21: cannot find symbol symbol : class FileOutputStream location: class PdfReportGenerator OuputStream report = new FileOutputStream(report_filename); ^ PdfReportGenerator.java:22: cannot find symbol symbol : class FileInputStream location: class PdfReportGenerator InputStream xmlData = new FileInputStream(xmlData_filename);

    maybe the strings added to the streams need to happen sooner?

      Hi again; I can't tell you how excited I am!!

      I changed the import to "import java.io.*;"

      and it made the pdf file!

      However, it's empty..But, geez, I feel so close. Any thoughts on why it's not picking up the other 2 variables? If that is the problem..

        I imagine the other two filenames are getting across just fine. You could add a few debugging statements to your Java to make sure (System.err.println(report_filename)).

        The problem is more likely to be at the Java end. Things to check:

        • Your xmlData input path refers to a file that actually exists.
        • Your xmlData input path refers to a file that is readable.
        • That these classes actually work as you'd expect in Java, independently of Perl:
          • java.datasource.dom4j.Dom4jDataSource
          • java.xmlreport.ProcessPdf
          • java.xmlreport.ProcessReport
        perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

        Just a blind suggestion from a passer-by: You should first make a stand-alone Java program that does what you want. Take the code you have in class PdfRecordGenerator, add a bare-bones public static void main(String[] argv) method that calls the real method (like you would in Perl). Muck around with it until you get it working. After that, remove the main method and try again through Perl.

        Besides, there's always System.out.println() to debug and check that everything from Perl gets passed correctly.