2009-01-08 70 views
2

我对ASP并不熟悉,但我正在帮助某人将他们的网站作为辅助项目。我试图从ASP使用VB调用Apache FOP(一个Java应用程序)。我已经看到了使用GetObject('java:...')构造的简单示例,但我不知道如何从java对象传递和检索二进制数据。理想情况下,我会在内存中完成这一切 - 我宁愿不必将我的数据写入磁盘,在该文件上调用FOP(将读取该文件,然后写入一个新文件),然后重新启动该文件,从磁盘读取数据。该网站不是忙,所以我可以做到这一点,但它似乎并不高效。如何从asp调用java?

回答

0

我想出了一个解决方法。这适用于在Win 2k3服务器上运行的IIS - 旧版本会更容易。

首先我从主站点创建了一个子目录(出于安全目的),并将一个新的应用程序池附加到该目录。新的应用程序池需要作为本地系统运行。我不能让fop.bat工作,甚至作为本地系统运行,但我可以调用java,所以我把整个FOP命令行到我的ASP脚本,类似这样的片段:

Dim shell, foppath, workpath 
Set shell = Server.CreateObject("WScript.Shell") 

foppath = Server.MapPath("/fop/") 
workpath = Server.MapPath("/tmp/") 
shell.CurrentDirectory = foppath 

Dim commandline 
commandline = "java -Denv.windir=C:\WINDOWS -cp """ 
'set classpath 
commandline = commandline & foppath & "\build\fop.jar;" 
commandline = commandline & foppath & "\build\fop-sandbox.jar;" 
commandline = commandline & foppath & "\build\fop-hyph.jar;" 
commandline = commandline & foppath & "\lib\xml-apis-1.3.04.jar;" 
commandline = commandline & foppath & "\lib\xml-apis-ext-1.3.04.jar;" 
commandline = commandline & foppath & "\lib\xercesImpl-2.7.1.jar;" 
commandline = commandline & foppath & "\lib\xalan-2.7.0.jar;" 
commandline = commandline & foppath & "\lib\serializer-2.7.0.jar;" 
commandline = commandline & foppath & "\lib\batik-all-1.7.jar;" 
commandline = commandline & foppath & "\lib\xmlgraphics-commons-1.3.1.jar;" 
commandline = commandline & foppath & "\lib\avalon-framework-4.2.0.jar;" 
commandline = commandline & foppath & "\lib\commons-io-1.3.1.jar;" 
commandline = commandline & foppath & "\lib\commons-logging-1.0.4.jar;" 
commandline = commandline & foppath & "\lib\jai_imageio.jar;" 
commandline = commandline & foppath & "\lib\fop-hyph.jar;" 
commandline = commandline & """ org.apache.fop.cli.Main " 
commandline = commandline & workpath & "/file.fo " 
commandline = commandline & workpath & "/file.pdf " 

Dim ResultCode 
ResultCode = Shell.Run(commandline,,True) ' True = Wait for FOP to finish 

之后,我确保我清理了我的临时文件等。也许不是最优雅的解决方案,但考虑到需要,我相信它会工作很长时间。

1

我不会担心效率,直到我观察到一个问题,测量结果告诉我FOP解决方案是罪魁祸首。

我会建议一个异步调用Web服务。发送包含XML输入流和XSL-T样式表的消息。让服务将PDF写入本地磁盘。将邮箱添加到您的用户界面,以便在PDF准备好提取时提醒用户。点击链接,PDF将流式传输到浏览器。用户可以根据需要查看或保存到本地磁盘。

Asynch在这种情况下很好,因为您不知道转换可能需要多长时间。为什么让用户等待?让他们稍后再回来看看。一个AJAX调用来检查新的PDF将是优雅的。

+0

这比我们这个应用程序需要的复杂一点。只需要创建工单的pdf并将副本通过电子邮件发送给请求者。想用最少的硬件来做到这一点。 没有必要用大炮杀死一只蚂蚁。 – molson 2009-01-09 15:42:44

0

你如何添加配置文件-c的conf \ fop.xconf或-c C:\ FOP \的conf \ fop.xconf 上述优秀作品

TA的!