Использование ApacheFOP v1.0 в приложении .NET
Кто-нибудь успешно выполнил библиотеку Apache FOP v1.0 в .NET DLL? Я использую синтаксис IKVM, найденный в http://onjava.com/pub/a/onjava/2004/08/18/ikvm.html; однако скомпилированная DLL кажется неполной. Например, я не могу создать экземпляр объекта FopFactory как:
using org.apache.fop.apps;
namespace Utils
{
public class PdfRender
{
public void Render()
{
FOUserAgent foUserAgent = fop.getUserAgent();
FopFactory fopFactory = FopFactory.newInstance();
}
}
}
Ответы
Ответ 1
(Предоставлено людьми из группы пользователей FOP)
Необходимое условие: установлен IKVM 0.44.0.5.
- Загрузить FOP 1.0 из http://xmlgraphics.apache.org/fop/1.0/index.html#download
- Скопируйте все файлы JAR в
C:\Fop\Build\
- Откройте командную строку и запустите следующее:
ikvmc -target:library -reference:IKVM.OpenJDK.Core.dll -recurse:C:\Fop\Build\\*.jar -version:1.0 -out:C:\Fop\fop.dll
- В проекте Visual Studio добавьте ссылки на
fop.dll
, IKVM.OpenJDK.*.dll
и IKVM.Runtime.dll
Ответ 2
Я пробовал подход, предложенный 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
Ответ 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();
}
}
Ответ 4
ClayB работал у меня. Пожалуйста, обратите внимание на пункт 2 "Скопируйте все файлы JAR в C:\Fop\Build \".
"все" очень важно. См. Здесь список банок, в котором я нуждался:
- 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
Вся банка, кроме fop, вы найдете в папке "lib".
Ответ 5
ClatB тоже работал здесь. Просто remmeber, чтобы добавить ВСЕ файлы IKVM в ваш проект (Работа с Fop 1.1 и IKVM 7.2.4630.5).