2011-02-22 9 views
8

Hace poco compilé una aplicación de Android usando FOP porque quiero convertir un poco de XML en un archivo PDF. Sin embargo, no creo que los archivos FOP JAR no sean adecuados para Android. ¿Hay alguna versión de FOP disponible para Android? ¿O cualquier otro convertidor XML a PDF que pueda usar dentro de mi aplicación en lugar de conectarme a un servidor habilitado para FOP en Internet?FOP para Android?

He intentado incluir fop.jar y xmlgraphics.jar, pero incluso con los añadidos a mi proyecto, falla la llamada al FopFactory.newInstance().

Aquí es mi fragmento de código para el clic de botón que llama a la 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(); 
      } 
     });

El compilador también me está dando un un montón de Dxwarning: Ignoring InnerClasses attribute... errores. Aquí está el error al hacer clic en el botón para crear el 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) 
+0

Nunca he usado FOP, pero ¿Qué sucede realmente cuando ejecutas el código que te hace creer que no funcionará? Si es solo el hecho de que funciona a través de Internet en lugar de localmente, ese es un enfoque bastante común para las cosas con Android. – tangentstorm

+0

Agregué el resultado de error cuando hago clic en el botón. El compilador me dio un montón de advertencias que me llevaron a creer que los JAR eran incompatibles con Android. – Zac

Respuesta

8

Con Android, no se puede simplemente tomar un .jar de una biblioteca de Java y utilizarlo en una aplicación para Android. Android usa la JVM de Dalvik (http://en.wikipedia.org/wiki/Dalvik_(software)) que no es 100% compatible con la API completa de la API de Java SE, y en su lugar solo es compatible con un subconjunto de la API. Por esta razón, muchas de las bibliotecas de Java que podría utilizar, como FOP, no son compatibles con Android tal como están y requieren especialización antes de que tales bibliotecas funcionen correctamente en un dispositivo Android. Buena suerte.

+0

Ok, eso tiene sentido. Supongo que eso sería explicar todos los Dxwarnings del compilador. – Zac

+0

Eso es correcto. –

+0

Estoy teniendo el mismo problema. ¿Alguna recomendación sobre cómo resolver este problema? ¿Es posible o debo renunciar a la esperanza? –

Cuestiones relacionadas