2010-10-18 30 views
10

Có ai đã tuân thủ thành công thư viện Apache FOP v1.0 với một tệp DLL .NET không? Tôi đang sử dụng cú pháp IKVM có tại số http://onjava.com/pub/a/onjava/2004/08/18/ikvm.html; tuy nhiên, DLL đã biên dịch có vẻ không đầy đủ. Ví dụ, tôi không thể nhanh chóng đối tượng FopFactory như:Sử dụng ApacheFOP v1.0 trong ứng dụng .NET

using org.apache.fop.apps; 

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

bạn đã thử http://fonet.codeplex.com/ thay vào đó? –

+0

xem thêm: http://stackoverflow.com/questions/1099485/generating-pdf-in-net-using-xsl-fo –

+0

Chúng tôi hiện đang sử dụng nFop, nhưng muốn chuyển sang ApacheFOP v1.0 để tận dụng 508 tính năng trợ năng. – ClayB

Trả lời

8

(Courtesy of folks trên Users FOP Group)

Điều kiện tiên quyết: IKVM 0.44.0.5 cài đặt.

  1. Tải FOP 1,0 từ http://xmlgraphics.apache.org/fop/1.0/index.html#download
  2. Sao chép tất cả các tập tin JAR để C:\Fop\Build\
  3. Mở một dấu nhắc lệnh và chạy như sau: ikvmc -target:library -reference:IKVM.OpenJDK.Core.dll -recurse:C:\Fop\Build\\*.jar -version:1.0 -out:C:\Fop\fop.dll
  4. Trong dự án Visual Studio của bạn, thêm tài liệu tham khảo để fop.dll, IKVM.OpenJDK.*.dllIKVM.Runtime.dll
+0

Làm việc cho tôi :) Cảm ơn –

+0

+1. Điều này làm việc cho tôi cũng như sử dụng FOP 1.0 và IKVM 0.46.0.1. Trong quá trình chuyển đổi, tôi đã có rất nhiều cảnh báo cuộn qua nhưng mọi thứ dường như hoạt động. Sử dụng mã ví dụ từ [hướng dẫn nhúng FOP] (http://xmlgraphics.apache.org/fop/1.0/embedding.html) đã làm việc với rất ít sửa đổi (cần các câu lệnh USING cần thiết và chỉ định kiểu MIME bằng cách sử dụng một chuỗi) . –

+0

Bạn có thể bỏ qua công tắc '-reference' gây ra lỗi cho tôi. Nhưng nó tiếp tục làm việc với thân cây fop mới nhất của ngày hôm nay và ikvm mới nhất. Hiệu suất có vẻ gần như bằng nhau. Net chậm hơn một chút nhưng sử dụng ít bộ nhớ hơn. Tôi đã sử dụng một ứng dụng dòng lệnh chỉ gọi phương thức main.main được chuyển đổi. – Peterdk

5

Tôi đã thử phương pháp được đề xuất bởi ClayB mà không thành công.

Tôi đã sử dụng kết hợp IKVM 0,44 và 0,46 với FOP 0,95 và 1,0. Nhưng không có gì làm việc! Có một số thư viện java bị thiếu và gây ra lỗi. Ngoài ra còn có một ngoại lệ .net xảy ra: không thể tải loại trong không gian tên System.Security. Tôi thậm chí còn cố gắng biên dịch từng tệp .jar thành một dll theo đề xuất của Avik Sengupta tại số http://onjava.com/pub/a/onjava/2004/08/18/ikvm.html, nhưng bị kẹt trên lib \ batik-all-1.7.jar. Trừ khi bất cứ ai có thêm bất kỳ workround, tôi tin rằng cách tiếp cận này không còn làm việc với các bộ dụng cụ mới nhất.

Tuy nhiên, tôi đã tìm thấy một cách tiếp cận khác cho phép một người gọi FOP từ .net. Tôi hy vọng điều này sẽ giúp ai đó:

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() { 
} 

Vui lòng đọc bài viết gốc tại địa chỉ: http://www.ptperalta.net/index.php/technology/using-apache-fop-in-net.html

0

ClayB của làm việc cho tôi. Hãy ghi nhớ điểm 2 "Sao chép tất cả các tệp JAR vào C: \ Fop \ Build \".
"tất cả" là rất quan trọng. Xem ở đây danh sách các jar của tôi cần:
- fop.jar
- avalon-framework-4.2.0.jar
- batik-all-1.7.jar
- commons-io-1.3.1.jar
- commons-logging-1.0.4.jar
- serializer-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
Tất cả các lọ khác với fop bạn sẽ tìm thấy trong thư mục "lib".

+0

Lưu ý rằng bạn cần các jars trong 'lib' không phải' lib \ build'. Điều này gây ra một số lớp không tìm thấy khi chạy phiên bản .net của fop. – Peterdk

0

ClatB`s cũng đã làm việc ở đây. Chỉ cần remmeber để thêm ALL IKVM libs vào dự án của bạn (Làm việc với Fop 1.1 và IKVM 7.2.4630.5).

3

Tôi biết đây là một chủ đề cũ nhưng vẫn cần một số nghiên cứu để làm việc này. Nó bây giờ đã có với NuGet trong Visual Studio 2013. Gói NuGet được gọi là crispin.fop. Trong mã của tôi dưới đây, tôi vượt qua trong một "fop" tập tin và tập tin PDF mới tôi muốn tạo ra và "thì đấy", nó được tạo ra.

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

Phương thức 'newInstance' trong' FopFactory fopFactory = FopFactory.newInstance(); 'mong đợi ít nhất một tham số. Có lẽ là một thay đổi đột phá được giới thiệu sau đó –