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」)。コントローラーで応答のヘッダーと本文を設定する方法をいくつかの場所で読みましたが、これまでのところ何も機能していません。