2010-10-18 26 views
10

Qualcuno ha eseguito correttamente la libreria v1.0 Apache FOP in una DLL .NET? Sto usando la sintassi IKVM trovata a http://onjava.com/pub/a/onjava/2004/08/18/ikvm.html; tuttavia, la DLL compilata sembra essere incompleta. Ad esempio, non posso istanziare oggetto FopFactory come:Utilizzo di ApacheFOP v1.0 nell'applicazione .NET

using org.apache.fop.apps; 

namespace Utils 
{ 
    public class PdfRender 
    { 
      public void Render() 
      { 
      FOUserAgent foUserAgent = fop.getUserAgent(); 
      FopFactory fopFactory = FopFactory.newInstance(); 
      } 
    } 
} 
+1

Hai provato http://fonet.codeplex.com/ invece? –

+0

vedi anche: http://stackoverflow.com/questions/1099485/generating-pdf-in-net-using-xsl-fo –

+0

Attualmente stiamo usando nFop, ma vorremmo passare ad ApacheFOP v1.0 per sfruttare il 508 caratteristiche di accessibilità. – ClayB

risposta

8

(Per gentile concessione delle persone sul Gruppo FOP Utenti)

Prerequisito: IKVM 0.44.0.5 installato.

  1. Scarica FOP 1.0 da http://xmlgraphics.apache.org/fop/1.0/index.html#download
  2. Copiare tutti i file JAR per C:\Fop\Build\
  3. Aprire un prompt dei comandi ed eseguire il seguente: ikvmc -target:library -reference:IKVM.OpenJDK.Core.dll -recurse:C:\Fop\Build\\*.jar -version:1.0 -out:C:\Fop\fop.dll
  4. Nel progetto Visual Studio, aggiungere riferimenti a fop.dll, IKVM.OpenJDK.*.dll e IKVM.Runtime.dll
+0

Funziona per me :) Grazie –

+0

+1. Questo ha funzionato anche con me usando FOP 1.0 e IKVM 0.46.0.1. Durante la conversione ho ricevuto molti avvisi, ma tutto sembra funzionare. L'utilizzo del codice di esempio dalle [istruzioni di incorporamento FOP] (http://xmlgraphics.apache.org/fop/1.0/embedding.html) ha funzionato con pochissime modifiche (necessarie istruzioni USING necessarie e specificato il tipo MIME utilizzando una stringa) . –

+0

È possibile ignorare l'opzione '-reference', che ha causato errori per me. Ma ha ulteriormente funzionato con l'ultimo fop trunk di oggi e l'ultimo ikvm. Le prestazioni sembrano essere quasi uguali, .net un po 'più lento ma usando meno memoria. Ho usato una linea di comando a linea singola che chiama solo il metodo Main.main degli Fops convertiti. – Peterdk

5

Ho provato l'approccio suggerito da ClayB senza alcun successo.

Ho usato le combinazioni di IKVM 0.44 e 0.46 con FOP 0.95 e 1.0. Ma niente ha funzionato! Ci sono alcune librerie Java mancanti e che causano errori. Esiste anche un'eccezione .net: impossibile caricare il tipo nello spazio dei nomi System.Security. Ho anche provato a compilare ogni file .jar in una DLL come suggerito da Avik Sengupta a http://onjava.com/pub/a/onjava/2004/08/18/ikvm.html, ma sono rimasto bloccato su lib \ batik-all-1.7.jar. A meno che qualcuno non abbia altre soluzioni, sono convinto che questo approccio non stia più lavorando con gli ultimi kit.

Tuttavia, ho trovato un approccio diverso che consente di chiamare FOP da .net. Spero che questo vi aiuterà qualcuno:

try { 
    ProcessStartInfo p = new ProcessStartInfo(fopPath + "fop.bat"); 
    p.Arguments = String.Format("{0} {1}", foFilePath, pdfFilePath); 
    p.WindowStyle = ProcessWindowStyle.Hidden; 
    p.WorkingDirectory = fopPath; 
    Process proc = new System.Diagnostics.Process(); 
    proc.StartInfo = p; 

    proc.Start(); 
    proc.WaitForExit(); 
    } 
catch() { 
} 

Si prega di leggere l'articolo originale su: http://www.ptperalta.net/index.php/technology/using-apache-fop-in-net.html

0

ClayB ha lavorato per me. Tieni presente il punto 2 "Copia tutti i file JAR in C: \ Fop \ Build \".
"tutto" è molto importante. Vedi qui la lista dei vaso di cui avevo bisogno:
- fop.jar
- Avalon-quadro-4.2.0.jar
- batik-all-1.7.jar
- commons-io-1.3.1.jar
- commons-logging-1.0.4.jar
- serializzatore-2.7.0.jar
- xalan-2.7.0.jar
- xercesImpl-2.7.1.jar
- xml-apis-1.3. 04.jar
- xml-apis-ext-1.3.04.jar
- xmlgraphics-commons-1.4.jar
Tutti gli altri vasi oltre al fop si trovano nella cartella "lib".

+0

Nota che hai bisogno dei vasi in 'lib' non' lib \ build'. Ciò ha causato alcune classi non trovate durante l'esecuzione della versione .net di fop. – Peterdk

0

ClatB`s ha lavorato anche qui. Ricordatevi di aggiungere TUTTE le librerie IKVM al vostro progetto (Funzionante con Fop 1.1 e IKVM 7.2.4630.5).

3

So che questo è un thread vecchio ma ci sono voluti ancora delle ricerche per farlo funzionare. Ora è disponibile con NuGet in Visual Studio 2013. Il pacchetto NuGet si chiama crispin.fop. Nel mio codice qui sotto, passo in un file "fop" e il nuovo file PDF che voglio creato e "voilà", viene creato.

using org.apache.fop.tools; 
    using org.apache.fop.apps; 
    using org.xml.sax; 
    using java.io; 

    public void GeneratePDF(string foFile, string pdfFile) 
    { 
     OutputStream os = new BufferedOutputStream(new FileOutputStream(new java.io.File(pdfFile))); 

     try 
     { 
      FopFactory fopFactory = FopFactory.newInstance(); 
      Fop fop = fopFactory.newFop("application/pdf", os); 
      FOUserAgent foUserAgent = fop.getUserAgent(); 
      javax.xml.transform.TransformerFactory factory = javax.xml.transform.TransformerFactory.newInstance(); 
      javax.xml.transform.Transformer transformer = factory.newTransformer(); 
      javax.xml.transform.Source src = new javax.xml.transform.stream.StreamSource(new java.io.File(foFile)); 
      javax.xml.transform.Result res = new javax.xml.transform.sax.SAXResult(fop.getDefaultHandler()); 
      transformer.transform(src, res); 
     } 

     catch (Exception ex) 
     {     
      throw ex; 
     } 

     finally 
     { 
      os.close(); 
     } 
    } 
+0

Il metodo 'newInstance' in' FopFactory fopFactory = FopFactory.newInstance(); 'si aspetta almeno un parametro. Probabilmente un cambio di rottura che viene introdotto in seguito –