Создание PDF-отчетов с помощью flot graph
Я пытаюсь реализовать автоматический инструмент генерации отчетов для своих клиентов . Мне нужно создавать отчеты в формате pdf, и мне очень удобно создавать графики с помощью jQuery flot. Мне просто нужен способ получить графики внутри pdf.
Я пробовал использовать летающая тарелка (xhtmlrenderer) для захвата изображения графика, но это, похоже, не помогает мне, поскольку графики создаются javascript.
может xhtmlrenderer захватить элементы создано с помощью javascript ?
или любой другой инструмент, который может захватить изображение графа ?
3 ответов
Flot рисует свой график на HTML5 <canvas>
элемент. Таким образом, возможный сценарий может быть следующим:
- получить данные изображения с холста с
toDataURL
как описано в ответ. - создать PDF с jsPDF используйте
addImage
как в первом примере, чтобы вставить изображение в него.
но обратите внимание, в этом случае вы не увидите никаких меток оси в изображении, потому что они не нарисованы на холст, они простые UPD: рисование этикеток на холсте включено в приближающийся выпуск 0.8 (см. комментарии).<div>
элементы расположены с position:relative
. Я нашел этот пост где автор предлагает плагин Flot, который заставляет Flot рисовать текст на холсте, но я понятия не имею, работает ли он.
но2 the легенда также не нарисован на холсте, он также правильно расположен <div>
. Кажется как люди в сообществе Flot пытаются что-то сделать с этим, я нашел два запроса pull, первый изменение, другое вводим плагин. Ни один из них не объединяется в течение 9 месяцев,и они отмечены для V. 0.9 milestone, который является следующим и не имеет срока. По крайней мере, можно клонировать этих людей и протестировать их работу.
резюме: многие люди вокруг Flot обеспокоены этот вопрос, но, к сожалению, пока нет стабильного, нестандартного способа сделать это - только надежда, что 0.9, наконец, выйдет иногда с этой проблемой.
Я собрал JSFiddle с примером того, как это сделать с помощью Flot + Html2Canvas + jsPDF. Экспортированный PDF включает ось, легенду и т. д.:
html2canvas($("#placeholder").get(0), {
onrendered: function(canvas) {
document.body.appendChild(canvas);
var imgData = canvas.toDataURL('image/png');
var doc = new jsPDF('landscape');
doc.addImage(imgData, 'PNG', 10, 10, 190, 95);
doc.save('sample-file.pdf');
}
});
Если вы можете сделать это на сервере, и вы находитесь в системе на базе Unix, я бы попробовал wkhtmltopdf.
РЕДАКТИРОВАНИЕ ЧЕРЕЗ НЕКОТОРОЕ ВРЕМЯ
теперь дни, чтобы сделать это serverside я бы использовать удивительный помощи PhantomJS. Я использую это в проекте на основе flot в течение некоторого времени, и он отлично работает.