9

I recently compiled an Android app using FOP as I want to convert some XML into a PDF file. However I don't think the FOP JAR files are mean't to work on Android. Are there any versions of FOP available for Android? Or any other XML to PDF converter I could use within my app instead of connecting to a FOP enabled server on the Internet?

I've tried including fop.jar and the xmlgraphics.jar but even with those added to my project, the call to FopFactory.newInstance() fails.

Here's my code snippet for the button click that calls FOP:

// Add button listener
btnCreatePDF.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {   
                FopFactory fopFactory = FopFactory.newInstance();
                OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("/sdcard/test.pdf")));
                Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
                TransformerFactory factory = TransformerFactory.newInstance();
                Transformer transformer = factory.newTransformer();
                Source src = new StreamSource(new File("/sdcard/test.fo"));
                Result res = new SAXResult(fop.getDefaultHandler());

                transformer.transform(src, res);

                out.close();
            }
        });

The compiler is also giving a me a bunch of Dxwarning: Ignoring InnerClasses attribute... errors. Here's the error when I click the button to create the PDF:

02-22 14:16:23.641: WARN/System.err(5590): java.lang.UnsupportedOperationException: Don't know how to handle "application/pdf" as an output format. Neither an FOEventHandler, nor a Renderer could be found for this output format.
02-22 14:16:23.641: WARN/System.err(5590):     at org.apache.fop.render.RendererFactory.createFOEventHandler(RendererFactory.java:361)
02-22 14:16:23.641: WARN/System.err(5590):     at org.apache.fop.fo.FOTreeBuilder.(FOTreeBuilder.java:105)
02-22 14:16:23.641: WARN/System.err(5590):     at org.apache.fop.apps.Fop.createDefaultHandler(Fop.java:101)
02-22 14:16:23.641: WARN/System.err(5590):     at org.apache.fop.apps.Fop.(Fop.java:79)
02-22 14:16:23.641: WARN/System.err(5590):     at org.apache.fop.apps.FopFactory.newFop(FopFactory.java:271)
02-22 14:16:23.641: WARN/System.err(5590):     at org.apache.fop.apps.FopFactory.newFop(FopFactory.java:248)
02-22 14:16:23.641: WARN/System.err(5590):     at com.zebdor.signal88.ProposalCalculator$3.onClick(ProposalCalculator.java:158)
02-22 14:16:23.641: WARN/System.err(5590):     at android.view.View.performClick(View.java:2501)
02-22 14:16:23.641: WARN/System.err(5590):     at android.view.View$PerformClick.run(View.java:9107)
02-22 14:16:23.641: WARN/System.err(5590):     at android.os.Handler.handleCallback(Handler.java:587)
02-22 14:16:23.641: WARN/System.err(5590):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-22 14:16:23.641: WARN/System.err(5590):     at android.os.Looper.loop(Looper.java:123)
02-22 14:16:23.641: WARN/System.err(5590):     at android.app.ActivityThread.main(ActivityThread.java:3812)
02-22 14:16:23.641: WARN/System.err(5590):     at java.lang.reflect.Method.invokeNative(Native Method)
02-22 14:16:23.641: WARN/System.err(5590):     at java.lang.reflect.Method.invoke(Method.java:507)
02-22 14:16:23.641: WARN/System.err(5590):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
02-22 14:16:23.641: WARN/System.err(5590):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
02-22 14:16:23.641: WARN/System.err(5590):     at dalvik.system.NativeStart.main(Native Method)
Zac
  • 2,325
  • 3
  • 23
  • 33
  • I've never used FOP, but What actually happens when you run the code that leads you to believe that it won't work? If it's just the fact that it works over the internet instead of locally, that's a pretty common approach to things with android. – tangentstorm Feb 22 '11 at 22:10
  • I added the error output from when I click on the button. The compiler was giving me a ton of warnings which led me to believe the JARs were incompatible with Android. – Zac Feb 22 '11 at 22:27
  • I have created an issue on fop project regarding this https://issues.apache.org/jira/browse/FOP-2915 – Binoy Babu Mar 05 '20 at 07:49

1 Answers1

9

With Android, you can't just take a .jar from a Java library and use it in an Android application. Android uses the Dalvik JVM (http://en.wikipedia.org/wiki/Dalvik_(software)) which is not 100% compatible with the full API from the Java SE API, and instead only supports a subset of the API. For this reason, many of the Java libraries you might be use to, like FOP, are not Android compatible as-is and require specialization before such libraries will function properly on an Android device. Good luck.

Jeremy Whitlock
  • 3,808
  • 26
  • 16
  • Ok that makes sense. I guess that would explaing all the Dxwarnings from the compiler. – Zac Feb 22 '11 at 22:24
  • I'm having the same problem. Any recommendations on how to solve this issue? Is it even possible or should I give up hope? –  Aug 04 '13 at 16:15