Конвертировать холст в PDF
Можно ли напрямую конвертировать canvas в pdf, используя JavaScript (pdf.js
или что-то типа того)?
Есть ли другой возможный способ, как canvas, чтобы img, а затем img в pdf?
Можете ли вы дать мне пример?
3 ответа
Вы можете добиться этого, используя библиотеку jsPDF и функцию toDataURL.
Я сделал небольшую демонстрацию:
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
// draw a blue cloud
context.beginPath();
context.moveTo(170, 80);
context.bezierCurveTo(130, 100, 130, 150, 230, 150);
context.bezierCurveTo(250, 180, 320, 180, 340, 150);
context.bezierCurveTo(420, 150, 420, 120, 390, 100);
context.bezierCurveTo(430, 40, 370, 30, 340, 50);
context.bezierCurveTo(320, 5, 250, 20, 250, 50);
context.bezierCurveTo(200, 5, 150, 20, 170, 80);
context.closePath();
context.lineWidth = 5;
context.fillStyle = '#8ED6FF';
context.fill();
context.strokeStyle = '#0000ff';
context.stroke();
download.addEventListener("click", function() {
// only jpeg is supported by jsPDF
var imgData = canvas.toDataURL("image/jpeg", 1.0);
var pdf = new jsPDF();
pdf.addImage(imgData, 'JPEG', 0, 0);
pdf.save("download.pdf");
}, false);
<script src="//cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.3/jspdf.min.js"></script>
<canvas id="myCanvas" width="578" height="200"></canvas>
<button id="download">download</button>
Пожалуйста, смотрите https://github.com/joshua-gould/canvas2pdf. Эта библиотека создает PDF-представление вашего элемента canvas, в отличие от других предлагаемых решений, которые встраивают изображение в PDF-документ.
//Create a new PDF canvas context.
var ctx = new canvas2pdf.Context(blobStream());
//draw your canvas like you would normally
ctx.fillStyle='yellow';
ctx.fillRect(100,100,100,100);
// more canvas drawing, etc...
//convert your PDF to a Blob and save to file
ctx.stream.on('finish', function () {
var blob = ctx.stream.toBlob('application/pdf');
saveAs(blob, 'example.pdf', true);
});
ctx.end();
Итак, на сегодня jspdf-1.5.3. Чтобы ответить на вопрос о том, чтобы страница pdf-файла была точно такой же, как на холсте. После многих попыток разных комбинаций я решил, что ты должен сделать что-то вроде этого. Сначала мы должны установить высоту и ширину для выходного файла PDF с правильной ориентацией, в противном случае стороны могут быть обрезаны. Затем мы получаем размеры из самого файла 'pdf', если вы попытаетесь использовать размеры холста, стороны могут снова обрезаться. Я не уверен, почему это происходит, я думаю, что jsPDF преобразует измерения в другие единицы в библиотеке.
// Download button
$("#download-image").on('click', function () {
let width = __CANVAS.width;
let height = __CANVAS.height;
//set the orientation
if(width > height){
pdf = new jsPDF('l', 'px', [width, height]);
}
else{
pdf = new jsPDF('p', 'px', [height, width]);
}
//then we get the dimensions from the 'pdf' file itself
width = pdf.internal.pageSize.getWidth();
height = pdf.internal.pageSize.getHeight();
pdf.addImage(__CANVAS, 'PNG', 0, 0,width,height);
pdf.save("download.pdf");
});
Узнайте о смене ориентации здесь: https://github.com/MrRio/jsPDF/issues/476
Лучшим решением было бы использовать Kendo UI Draw DOM для экспорта в PDF-
Предположим, следующий html-файл содержит тег canvas:
<script src="http://kendo.cdn.telerik.com/2017.2.621/js/kendo.all.min.js"></script>
<script type="x/kendo-template" id="page-template">
<div class="page-template">
<div class="header">
</div>
<div class="footer" style="text-align: center">
<h2> #:pageNum# </h2>
</div>
</div>
</script>
<canvas id="myCanvas" width="500" height="500"></canvas>
<button onclick="ExportPdf()">download</button>
Теперь после этого в вашем скрипте запишите следующее и это будет сделано:
function ExportPdf(){
kendo.drawing
.drawDOM("#myCanvas",
{
forcePageBreak: ".page-break",
paperSize: "A4",
margin: { top: "1cm", bottom: "1cm" },
scale: 0.8,
height: 500,
template: $("#page-template").html(),
keepTogether: ".prevent-split"
})
.then(function(group){
kendo.drawing.pdf.saveAs(group, "Exported_Itinerary.pdf")
});
}
И все, напишите что-нибудь на этом холсте и просто нажмите эту кнопку загрузки, все экспортированные в PDF. Вот ссылка на пользовательский интерфейс Kendo - http://docs.telerik.com/kendo-ui/framework/drawing/drawing-dom И блог, чтобы лучше понять весь процесс - https://www.cronj.com/blog/export-htmlcss-pdf-using-javascript/