2

我有一个 Java 中的 WebService(使用 Apache Axis),它获取文档的 ID,并调用 JasperReports 来创建 PDF 文件(以前在 Java 应用程序中创建的报告 - 服务器端),以创建我正在使用的报告:JasperManager.fillReport 和 JasperExportManager.exportReportToPdf。最后一个返回一个字节数组。我的 web 服务获取数组并将其编码为 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 Header”,开头如下:

%PDF-1.4 %âãÏÓ 4 0 obj <>stream ÿØÿà

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

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

编辑:我读过关于解包功能,也许这个功能可以帮助我?

提前致谢

4

1 回答 1

2

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

1.来自Java:我用来编码PDF文件内容的类(org.w3c.tools.codec.Base64Encoder)破坏了带有文件内容的字符串,而不是这个类,我已经切换到Apache Axis工具(org.apache.axis.encoding.Base64)。我这样说是因为我比较了用我的 Java 应用程序生成的 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();
}

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

于 2012-06-13T13:17:26.523 回答