2017-03-22 11 views
1

APIにアクセスして購入注文のPDFをダウンロード/表示しています。生のPDFデータを解析してPHPを使用してPDFを作成する

APIは、生のPDFデータと思われるものを返す開始されます。

%PDF-1.2 
%���� 
4 0 obj 
<< 
/E 12282 
/H [1239 144] 
/L 12655 
/Linearized 1 
/N 1 
/O 7 
/T 12527 

私がダウンロード可能PDFにこれを変換するか、ブラウザでPDFをレンダリングする方法を見つけるのに苦労しています。

私はPHPを使用していますが、応答をエコーし​​てみましたが、これは生のPDFを完全に表示します。

私はまた、エコーの前にヘッダを定義しようとしました:

header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Type: application/pdf"); 
    header("Content-Disposition: attachment; filename=purchase.pdf"); 
    header("Content-Transfer-Encoding: binary"); 

これはダウンロードを生成しませんが、あなたがそれを開くと、私はエラー「PDF文書のロードに失敗しました」を得ます。

私はこれを行う方法を探しましたが、問題に近いものは見つかりませんでした。私はTCPDFのようなものでこの応答を解析する必要がありますか、何かが本当に明白でないのですか?

UPDATE:

は、以下のコードを使用して、私はこれをダウンロードした場合、それが開いている私が期待するように、私はまだブラウザでそれを提供することができない、サーバーにファイルを保存することができます。

$data = $results->body; 
$destination = '../pos/'.$id.'.pdf'; 
$file = fopen($destination, "w+"); 
fputs($file, $data); 
fclose($file); 
$filename = $id.'.pdf'; 
header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header("Content-Disposition: attachment; filename=$filename"); 
header("Content-Type: application/pdf"); 
header("Content-Transfer-Encoding: binary"); 
readfile($destination); 
+0

ドライブにバイナリストリームを保存するPHPコードを提供できますか?破損したバイナリPDFストリームのように見えます。例えば。保存時にストリームの最後に空白がないことを確認してください(PHPスクリプトをPHPスクリプトに閉じて 'file_put_content'を使用しないでください)。 'readfile($ destination)'の後に 'exit()'を追加してみてください。 – lubosdz

答えて

0

ストリームの読み取り後にヘッダーが欠落しているか、空白がある可能性があります。これは私のために働きます:

$path = '/file/absolute/path.pdf'; 
$content = '%PDF-1.4%âãÏÓ8 0 obj<< /Type ....'; 

// save PDF buffer 
file_put_contents($path, $content); 

// ensure we don't have any previous output 
if(headers_sent()){ 
    exit("PDF stream will be corrupted - there is already output from previous code."); 
} 

header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1 
header('Pragma: public'); 
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past 
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); 

// force download dialog 
header('Content-Type: application/force-download'); 
header('Content-Type: application/octet-stream', false); 
header('Content-Type: application/download', false); 

// use the Content-Disposition header to supply a recommended filename 
header('Content-Disposition: attachment; filename="'.basename($path).'";'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: '.filesize($path)); 
header('Content-Type: application/pdf', false); 

// send binary stream directly into buffer rather than into memory 
readfile($path); 

// make sure stream ended 
exit(); 
+1

これは正しい道のりで私をつかまえました。問題は本当に余分な内容でしたが、後になっていませんでした。私のレイアウトファイルはヘッダーhtmlブロックを含んでいたことがわかりました。それが原因でした。 – Andy

+0

@Andy PDFストリームを送信する前に出力を確認するスクリプトも更新しました。 – lubosdz

関連する問題