我有一个 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/waARCAyARwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA...
该字符串具有“PDF 标题”,开头如下:
%PDF-1.4 % 4 0 目标
流ÿØÿà
当我尝试下载该文件时,它的大小约为 4-5KB(并且文件已损坏),但响应字符串约为 180KB。
这可能吗?我做错了什么?
编辑:我读过unpack功能,也许这个功能可以帮助我?
提前致谢
好的,我解决了。基本上,我有两个错误:
1.从Java:我用来编码 PDF 文件内容的类(org.w3c.tools.codec.Base64Encoder
)正在用文件内容破坏字符串,我已经切换到 Apache Axis Tools (而不是此类)(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();
}
希望这个回答对大家有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)