代码之家  ›  专栏  ›  技术社区  ›  kitensei

PHP-Java桥#从PHP调用FOP

  •  1
  • kitensei  · 技术社区  · 14 年前

    我经常检查StackOverflow并经常帮助我:)所以我猜为什么不请求帮助这个?

    我在基于web的应用程序上使用PHP,需要使用Apache FOP从预先格式化的FO文件生成PDF。ATM我在用命令行 exec('fop…') 为此,但在更改服务器的操作系统时遇到了一些问题。

    我在web上看到,FOP可以使用PHP Java桥直接从Javaclass调用,但是在尝试并尝试失败之后,我想知道你们中是否有更好的教程 HowTo/PHPJavaBridge .

    PS:桥已经安装并运行,FopWrapper.jar已经构建并设置,但是当我从PHP调用它时,我有一个错误“ClassNotFound”。有什么想法?

    谢谢。

    4 回复  |  直到 14 年前
        1
  •  0
  •   matiasf    14 年前

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

    如果主机安装了JVM(假设shell访问可以使用“java-v”进行测试),我将执行以下操作:

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

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

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

        2
  •  0
  •   kitensei    14 年前

    最后我在这个邮件列表上找到了一个解决方案 Fop from PHP Java 所以这对FOP 0.9x的最新版本非常有效,现在唯一的问题是当tomcat完成了对生成的pdf的工作时,最后一个版本被锁定,如果不重新启动服务器,就无法打开它。

    有什么想法吗?感谢之前:)

    编辑: 好吧,我的错 做一个真正的爪哇人对我没有帮助。实际上问题是我开了一个 文件输出流 最后忘了关上。如果这能帮上忙,我是怎么做到的:

    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();
    
        3
  •  0
  •   DrDol    14 年前

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

    根据您的可选设置,编写FOP服务器将占用您一些时间。您可以使用头信息和.fo文件的内容实现单个协议。

        4
  •  0
  •   user986280    13 年前

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

    FOP Server ,它只是一个包,包含运行Apache FOP所需的所有内容。 您可以使用HTTP post从PHP调用服务器,在该页面中有一个示例

    推荐文章