1

ZendPHPフレームワークを使用してサイトを開発しています。ページに、Google Chart APIで作成されたグラフがあります-https://developers.google.com/chart/。ユーザーがチャートをPDFファイルとしてダウンロードできるようにするボタンを追加したいと思います(基本的にチャートを画像に変換してPDFに埋め込みます)。

画像データ文字列を生成するjavascript関数を使用してGoogleチャートを画像に変換することができました-http ://www.battlehorse.net/attach/topics/charts/google_charts_to_image.html

function getImgData(chartId) {
    var chartContainer = document.getElementById(chartId);
    var chartArea = chartContainer.getElementsByTagName('iframe')[0].
    contentDocument.getElementById('chartArea');
    var svg = chartArea.innerHTML;
    var doc = chartContainer.ownerDocument;
    var canvas = doc.createElement('canvas');
    canvas.setAttribute('width', chartArea.offsetWidth);
    canvas.setAttribute('height', chartArea.offsetHeight);   
    canvas.setAttribute(
        'style',
        'position: absolute; ' +
        'top: ' + (-chartArea.offsetHeight * 2) + 'px;' +
        'left: ' + (-chartArea.offsetWidth * 2) + 'px;');
    doc.body.appendChild(canvas);
    canvg(canvas, svg);
    var imgData = canvas.toDataURL("image/png");
    canvas.parentNode.removeChild(canvas);
    return imgData;
}

PDFの生成を処理するための無料のPHPクラスもダウンロードしました-http ://www.fpdf.org/

ajax関数を使用して、画像データ文字列をzendコントローラーに渡すことができました。次に、画像をローカルに保存し、それを使用してPDFファイルを作成し、それをローカルにも保存できます。

//store the image locally
    $data = substr($image,strpos($image,",")+1); //removing the "data:image/png;base64," part
    file_put_contents ('downloads/'.$title.'.png', base64_decode($data));

    // create PDF document
    $pdf = new FPDF();
    $pdf->AliasNbPages();
    $pdf->AddPage();
    $pdf->Image('downloads/'.$title.'.png',10,6,30);

    //destroy the local copy of the image
    fclose('downloads/'.$title.'.png');
    unlink('downloads/'.$title.'.png');

    //save the PDF document
    $pdf->Output('downloads/'.$title.'.pdf');

ダウンロード用のPDFファイルを提示する方法が見つからないため、今は行き詰まっています。画像データ文字列が標準のURLには長すぎるため、Ajaxリクエストを使用してPDFを生成する必要があります。したがって、ファイルが生成された後、ユーザーをファイルのダウンロードリンクにリダイレクトする必要があると思います(その後、ファイルを再度削除します)。

ダウンロード用にファイルを提供する方法を知っている人はいますか?ブラウザにファイルパスを入力すると、パスが見つかりませんというエラーが表示されます(例:「MyApp / public / downloads / myChart.pdf」)。コントローラーで応答のヘッダーと本文を設定する方法をいくつかの場所で読みましたが、これまでのところ何も機能していません。

4

1 に答える 1

0

ダウンロードリンクを生成している場合。yourpath/public を domain.com に置き換えてみませんか? ur PDF がディレクトリ public/downloads/blahblah に生成されると仮定します。

おそらく次のステップは lik でしょう

$path = 'downloads/'.$title.'.pdf';

Header("場所: http://domain.com .$path");

ユーザーが Ajax を使用してこのスクリプト ファイルを呼び出すと、PDF が生成され、場所が PDF のパスに転送されます。

于 2012-06-22T16:13:24.940 に答える