从Java重新创建PDF文件到PHP

时间:2012-06-12 21:00:58

标签: php web-services jasper-reports

我有一个Java(使用Apache Axis)的WebService获取文档的id,并调用JasperReports来创建PDF文件(以前在java应用程序中创建的报告 - 服务器端),以创建报告我是使用方法:JasperManager.fillReport和JasperExportManager.exportReportToPdf。最后一个返回一个字节数组。我的webservice获取数组并将其编码为Base64字符串,PHP接收此字符串作为WebService的响应。

我想在PHP中重新创建该文件,但我不确切知道这是否可行。我正在尝试使用以下代码段执行此操作:

private function createFileFromString($stringWithFile){
    header('Content-Description: File Transfer');
    header("Content-Type: application/pdf");
    header('Content-Disposition: attachment; filename=remesa.pdf');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    ob_start();
    ob_clean();
    ob_flush();
    flush();
    $fp = file_put_contents("document.pdf", "w");
    fwrite($fp, base64_decode($stringWithFile));
    readfile($fp);
    ob_get_contents();
    fclose($fp);
    exit();
}

WebService返回一个字符串,如下所示:

  

JVBERi0xLjQKJeLjz9MKNCAwIG9iaiA8PC9UeXBlL1hPYmplY3QvQ29sb3JTcGFjZS9EZXZpY2VS   R0IvU3VidHlwZS9JbWFnZS9CaXRzUGVyQ29tcG9uZW50IDgvV2lkdGggMjg0L0xlbmd0aCAzNjc0   L0hlaWdodCA1MC9GaWx0ZXIvRENURGVjb2RlPj5zdHJlYW0K / 9J / 4AAQSkZJRgABAgAAAQABAAD /   2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0   Hyc5PTgyPC4zNDL / 2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy   MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL / wAARCAAyARwDASIAAhEBAxEB / 8QAHwAAAQUBAQEBAQEA ...

此字符串包含“PDF标题”,如下所示:

  

%PDF-1.4%ãÏÓ40 obj   <>streamÿØÿà

当我尝试下载文件时,它的大小约为4-5KB(并且文件已损坏),但响应字符串大约为180KB。

这可能吗?我做错了什么?

编辑:我已经阅读了unpack函数,也许这个函数可以帮助我吗?

提前致谢

1 个答案:

答案 0 :(得分:2)

好的,我解决了。基本上,我有两个错误:

<强> 1。来自Java:我用来编码PDF文件内容(org.w3c.tools.codec.Base64Encoder)的类正在破坏带有文件内容的String,而不是这个类,我已切换到Apache Axis Tools (org.apache.axis.encoding.Base64)。我之所以这么说,是因为我将使用我的Java App生成的PDF内容与从WebService返回的内容进行了比较,最后一个内容有点小。

<强> 2。从PHP:构建文件:在这部分我试图这样做:

$fp = file_put_contents("document.pdf", "w");
fwrite($fp, base64_decode($stringWithFile));
readfile($fp);

但是,只有使用file_put_contents我已经完成了将内容写入PDF文件的内容,但这并不一定是fwrite。我正在使用此代码段生成pdf:

private function createFileFromString($stringWithFile){
    header('Content-Description: File Transfer');
    header("Content-Type: application/pdf");
    header('Content-Disposition: attachment; filename=document.pdf');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    flush();
    file_put_contents("document.pdf", base64_decode($stringWithFile));
    readfile("document.pdf");
    exit();
}

我希望这个答案对每个人都有帮助。