2010-10-18 4 views
10

Кто-нибудь успешно выполнил библиотеку Apache FOP v1.0 в .NET DLL? Я использую синтаксис IKVM, найденный в http://onjava.com/pub/a/onjava/2004/08/18/ikvm.html; однако скомпилированная DLL кажется неполной. Например, я не могу создать экземпляр объекта FopFactory как:Использование ApacheFOP v1.0 в приложении .NET

using org.apache.fop.apps; 

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

Вы попробовали http://fonet.codeplex.com/ вместо этого? –

+0

см. Также: http://stackoverflow.com/questions/1099485/generating-pdf-in-net-using-xsl-fo –

+0

В настоящее время мы используем nFop, но хотим перейти на ApacheFOP v1.0, чтобы использовать 508 удобства для инвалидов. – ClayB

ответ

8

(Courtesy из людей на группах ФОПА пользователей)

Предпосылка: IKVM 0.44.0.5 установлено.

  1. Скачать ФОП 1,0 из http://xmlgraphics.apache.org/fop/1.0/index.html#download
  2. Скопируйте все файлы JAR в C:\Fop\Build\
  3. Откройте командную строку и выполните следующие действия: ikvmc -target:library -reference:IKVM.OpenJDK.Core.dll -recurse:C:\Fop\Build\\*.jar -version:1.0 -out:C:\Fop\fop.dll
  4. В вашем Визуальный проект студии, добавлять ссылки на fop.dll, IKVM.OpenJDK.*.dll и IKVM.Runtime.dll
+0

Работает для меня :) Спасибо –

+0

+1. Это сработало и для меня, используя FOP 1.0 и IKVM 0.46.0.1. Во время преобразования у меня было много предупреждений, но все, похоже, работает. Использование кода примера из [FOB-встраивания инструкций] (http://xmlgraphics.apache.org/fop/1.0/embedding.html) работало с очень небольшой модификацией (необходимые необходимые операторы USING и указали тип MIME с использованием строки) , –

+0

Вы можете игнорировать переключатель '-reference', который вызвал ошибки для меня. Но он также работал с последним fop trunk сегодня и последним ikvm. Производительность выглядит почти равным .net немного медленнее, но использует меньше памяти. Я использовал однострочное приложение командной строки, которое просто вызывает преобразованный метод main.main fops. – Peterdk

5

Я пробовал подход, предложенный ClayB, без каких-либо успехов.

Я использовал комбинации IKVM 0.44 и 0.46 с FOP 0.95 и 1.0. Но ничего не получилось! Есть некоторые java-библиотеки, которые отсутствуют и вызывают ошибки. Также произошло исключение .net: невозможно загрузить тип в пространстве имен System.Security. Я даже попытался скомпилировать каждый файл .jar в dll, как предложил Авик Сенгупта в http://onjava.com/pub/a/onjava/2004/08/18/ikvm.html, но застрял в lib \ batik-all-1.7.jar. Если у кого-нибудь не будет никаких дополнительных рабочих мест, я убежден, что этот подход больше не работает с последними наборами.

Однако я нашел другой подход, который позволяет называть FOP из .net. Я надеюсь, что это поможет кому-то:

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

Пожалуйста, прочитайте оригинальную статью по адресу: http://www.ptperalta.net/index.php/technology/using-apache-fop-in-net.html

0

ClayB работал для меня. Пожалуйста, обратите внимание на пункт 2 «Скопируйте все файлы JAR в C: \ Fop \ Build \».
«все» очень важно. Смотрите здесь список баночка-х я нуждался:
- fop.jar
- Авалон-каркасного 4.2.0.jar
- батик-все-1.7.jar
- Обще-ю-1.3.1.jar
- Обще-каротаж 1.0.4.jar
- сериализатору-2.7.0.jar
- Xalan-2.7.0.jar
- xercesImpl-2.7.1.jar
- XML-АПИС-1,3. 04.jar
- xml-apis-ext-1.3.04.jar
- xmlgraphics-commons-1.4.jar
Все баночки, кроме fop, вы найдете в папке «lib».

+0

Обратите внимание, что вам нужны банки в 'lib', а не' lib \ build'. Это вызвало некоторый класс, не найденный при запуске .net-версии fop. – Peterdk

0

ClatB`s работал здесь тоже. Просто remmeber, чтобы добавить ВСЕ файлы IKVM в ваш проект (Работа с Fop 1.1 и IKVM 7.2.4630.5).

3

Я знаю, что это старая нить, но для этого все еще требуется некоторое исследование. Теперь он доступен в NuGet в Visual Studio 2013. Пакет NuGet называется crispin.fop. В моем коде ниже я передаю файл «fop» и новый файл PDF, который я хочу создать, и «voila», он создается.

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

Метод 'newInstance' в' FopFactory fopFactory = FopFactory.newInstance(); 'ожидает хотя бы один параметр. Вероятно, это нарушение, которое вводится впоследствии –

Смежные вопросы