1

我正在为客户创建一个 Web 前端以下载他们的报告。该公司使用的程序是用 Java 编写的,由 31 个 mysql 表组成,其中需要 4 个报告,每个报告有超过 140 个数据点。我正在用 PHP 制作网站并用 Java 制作报告生成器,但我在查找有关如何让内存 PDF 直接加载到客户端浏览器中的信息时遇到问题。我想使用从 Java 到 PHP 的 TCP 客户端/服务器,但我如何对其进行编码,以便不必将其写入服务器驱动器并作为链接提供。我也不希望将 17,000 行 Java 代码重写为 PHP,因为我是 PHP 新手。有没有办法完成这件事?先感谢您。

4

2 回答 2

1

根据 java 应用程序运行需要多长时间,您可以考虑使用proc_open创建一个到 java 程序的管道:

<?php
    $desc = array(array('pipe','r'),array('pipe','w'));
    $resource= proc_open('bash',$desc,$pipes);
    if (!is_resource($resource))
    {
        throw new Exception('PDF stream creation failed');
    }
    usleep(5);//for safety
    fwrite($pipes[0],'java mkPDF paras'."\n");//double quoted \n is crucial
    fclose($pipes[0]);
    usleep(100);//while java app is running;
    $pdf = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    proc_close($resource);
?>

这只是一个基本示例,它将流式 pdf 集中在一个大块中,因此它远非完美。您-IMO-应该研究的是使用while循环以块的形式获取流。php手册页包含几个这样的例子,基本上,repleace

usleep(100);//while java app is running;
$pdf = stream_get_contents($pipes[1]);

和:

usleep(10);//while java app is running;
$pdf = '';
while (($pdfBuff = fgets($pipes[1],1024)) !== null)
{
    $pdf.=$pdfBuff;//or echo, or whatever
}
fclose($pipes[1]);

后者未经测试,所以我不确定这是否适用于你的情况......但你明白了

于 2012-05-14T08:33:48.307 回答
0
  1. 正如@Elias所说,直接向java应用程序发送网络请求并将pdf流式传输到php。

  2. 使用网络服务,

    I. 在 java 端开发一些 web 服务,它们只会发送 XML、json 等任何格式的数据。

    二、编写代码来使用这些 Web 服务并开发代码以生成 pdf 并流式传输这些 pdf。

有一个 pdf 生成库。请在此处找到链接

于 2012-05-14T08:17:51.340 回答