我正在创建一个网络前端,供客户下载他们的报告。该公司使用的程序是用 Java 编写的,由 31 个 mysql 表组成,需要 4 个报告,每个报告包含超过 140 个数据点。我正在用 PHP 制作网站,用 Java 制作报告生成器,但在查找有关如何将内存中的 PDF 直接加载到客户端浏览器中的信息时遇到问题。我考虑使用从 Java 到 PHP 的 TCP 客户端/服务器,但如何对其进行编码,以便不必将其写入服务器驱动器并作为链接提供。我也不希望将 17,000 行 Java 重写为 PHP,因为我是 PHP 新手。有办法完成这件事吗? 预先感谢您。
最佳答案
根据 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 循环将流分成 block 。 php man page包含几个这样的例子,基本上,替换
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]);
后者未经测试,所以我不确定这是否适用于您的情况......但您明白了
关于java - 使用 PHP 从 Java 生成器提供内存中的 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10579475/