2010-06-29 57 views
1

我经常检查StackOverflow并通常帮助我很多:)所以我猜想为什么不要求这个帮助?PHP Java Bridge#从PHP调用FOP

我在基于Web的应用程序上使用PHP,我需要使用Apache FOP从预格式化的FO文件生成PDF。自动柜员机我使用命令行exec('fop ...')为此目的,但我有几个麻烦时,更改服务器的操作系统。

我在网上看到FOP可以直接从Java类使用PHP Java桥接调用,但尝试并尝试失败后,我想知道是否有一些人有更好的教程,然后这HowTo/PHPJavaBridge

PS:桥已安装并正在运行,FopWrapper.jar已建立并设置,但是当我从PHP调用它时,出现“ClassNotFound”错误。一些想法?

谢谢。

回答

0

如果您使用的是共享主机,这可能是个坏主意(“我在更改服务器的操作系统时遇到了一些麻烦”)。 PHP/Java桥是一个Java EE应用程序,通过本地套接字与您的PHP应用程序进行通信。共享主机帐户上的Java EE支持并不常见。

如果主机已安装JVM我会做如下(假设shell访问这个可以有“的java -v”测试):

编写一个简单的Java SE应用程序接受两个参数:

"java -jar MySimpleInterfaceToFOP.jar "/path/to/inputFile" "/path/to/outputFile" " 

通过PHP中的system()或exec()接口运行此操作,使用random()或mktime()获取随机文件名。

+0

我实际上使用专用服务器并始终支持Java EE。你的想法很敏锐,但是在通过exec()或system()方法传递时经常会遇到许可麻烦,shell/prompt中允许的Java命令不能总是由php启动。 有一半的时间,我有一个错误,告诉我“java”命令没有被识别,如果我直接在shell /提示符下输入,它运行的很好。这就是为什么我试图访问该命令而不使用exec()。 编辑:我刚刚获得访问java.lang.System类与桥,所以我想麻烦来自* java_require()* :( – kitensei 2010-06-29 15:26:35

0

最后,我在这个邮件列表上找到了一个解决方案Fop from PHP Java,这样可以很好的与上一个发布的FOP 0.9x版本配合使用。现在唯一的问题是,当tomcat在生成的pdf上完成他的工作时,最后一次保持锁定状态,无法在不重新启动服务器的情况下打开它。

任何想法?以前感谢:)

编辑:好吧,我的坏是一个真正的白俄罗斯noob没有帮助我。事实上,麻烦的是我打开了一个FileOutputStream,并忘记关闭它的最后。如果这能帮助别人,我这里是怎么做的:

require_once("java/Java.inc"); 

$input  = 'D:/wamp/www/test/fo2pdf'; 
$output  = 'D:/wamp/www/test/fo2pdf'; 
$sourcefile = 'test.fo'; 
$destfile = 'trys.pdf'; 

$pdffile = new Java("java.io.FileOutputStream", $output . "\\" . $destfile); 
$mimes  = new Java("org.apache.fop.apps.MimeConstants"); 
$fopfactory = new Java("org.apache.fop.apps.FopFactory"); 

$fopf  = $fopfactory->newInstance(); 
$fopf->setUserConfig(new Java("java.io.File", "D:/wamp/www/myvisitV3/outils/FOP/conf/fop.xconf")); 
$userf  = $fopf->newFOUserAgent(); 
$fop  = $fopf->newFop($mimes->MIME_PDF, $userf, $pdffile); 


$transformerclass = new Java("javax.xml.transform.TransformerFactory"); 
$transformerfactory = $transformerclass->newInstance(); 
$transformerf  = $transformerfactory->newTransformer(); 

$src  = new Java("javax.xml.transform.stream.StreamSource", new Java("java.io.File", $input . "\\" . $sourcefile)); 
$res  = new Java("javax.xml.transform.sax.SAXResult", $fop->getDefaultHandler()); 

$transformerf->transform($src, $res); 
$pdffile->close(); 
0

在我们公司,我们通过创建一个简单的FOP服务器来完成所有的工作解决您的问题。您可以使用PHP curl或所有其他方法连接到主机,从而连接到FOP-Server。我们将.fo文件内容发送到服务器,并将接收生成的PDF。优点是,这不取决于运行FOP-Server的服务器。 我们遇到的唯一问题是,运行一个简单的Java程序作为Linux deamon并不容易。您可以使用Java Servlet容器(在Tomcat中)来运行您的软件。对于我们的使用,单个Linux“屏幕”可以完成这项工作。

要写一个FOP服务器将带你几个我们的,这取决于你的可选设置。您可以实现带有标题信息的单个协议,然后实现.fo文件的内容。

0

如果您不想参与Java,还有其他选择。这里有一个免费的FOP服务器:

FOP Server,它只是一个包含运行Apache FOP所需的全部软件包。 你可以使用HTTP POST来从PHP调用服务器,在那个页面中有一个例子