2

ドキュメントのIDを取得するJavaのWebサービス(Apache Axisを使用)があり、JasperReportsを呼び出してPDFファイル(以前にJavaアプリで作成されたレポート-サーバー側)を作成し、メソッドを使用しているレポートを作成します:JasperManager.fillReportおよびJasperExportManager.exportReportToPdf。最後のものはバイトの配列を返します。私のWebサービスは配列を取得してBase64文字列にエンコードしますが、PHPはこの文字列をWebサービスからの応答として受け取ります。

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%âãÏÓ40obj<>streamÿØÿà

ファイルをダウンロードしようとすると、サイズは約4〜5KBです(ファイルが破損しています)が、応答文字列は約180KBです。

これは可能ですか?私が間違っているのは何ですか?

編集:私は解凍関数について読みました、多分この関数は私を助けることができますか?

前もって感謝します

4

1 に答える 1

2

わかりました、私はそれを解決しました。基本的に、2つのエラーがあります。

1. Javaから: PDFファイルのコンテンツをエンコードするために使用したクラス(org.w3c.tools.codec.Base64Encoder)は、ファイルのコンテンツで文字列を破損していました。このクラスの代わりに、Apache Axis Tools()に切り替えましたorg.apache.axis.encoding.Base64。これは、Javaアプリで生成されたPDFのコンテンツとWebサービスから返されたコンテンツを比較したためです。最後のコンテンツは少し小さいです。

2. PHPから:ファイルの作成:このパートでは、これを実行しようとしています。

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

しかし、私がPDFファイルにコンテンツを書き込んだfile_put_contentsでのみ、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 に答える