J'essaie de convertir une toile HTML5 en PDF en JavaScript, mais je reçois un PDF en arrière-plan noir. J'ai essayé de changer la couleur d'arrière-plan mais je continue à noircir. Ce qui suit est le code que j'essaye:
Canvas = document.getElementById("chart");
Context = Canvas.getContext("2d");
var imgData = Canvas.toDataURL('image/jpeg');
var pdf = new jsPDF('landscape');
pdf.addImage(imgData, 'JPEG', 0, 0, 1350, 750);
pdf.save('download.pdf');
Si vous avez une idée, je l'apprécierais beaucoup.
Une bonne approche consiste à utiliser la combinaison de jspdf.js et html2canvas. Je t'ai préparé un violon.
<canvas id="canvas" width="480" height="320"></canvas>
<button id="download">Download Pdf</button>
'
html2canvas($("#canvas"), {
onrendered: function(canvas) {
var imgData = canvas.toDataURL(
'image/png');
var doc = new jsPDF('p', 'mm');
doc.addImage(imgData, 'PNG', 10, 10);
doc.save('sample-file.pdf');
}
});
jsfiddle: http://jsfiddle.net/rpaul/p4s5k59s/5/
Une solution très simple consiste à enregistrer l’image au format jpeg. Enregistrer à la place au format png fonctionne très bien pour mon application. Il est à noter que la réponse de Blizzard inclut également l’impression au format png et produit également un remplissage non noir pour les calques transparents de la toile.
var canvas = event.context.canvas;
var data = canvas.toDataURL('image/png');
au lieu de
var canvas = event.context.canvas;
var data = canvas.toDataURL('image/jpg');
J'ai eu le même problème, par exemple la première fois que je crée un pdf, l'image de la toile est ok, mais toutes les autres suivantes sont sorties en noir. Pas d'image!
La solution de contournement que j'ai trouvée est la suivante: après chaque appel à pdf.addImage (), je redessine l'image dans la zone de dessin. Cela fonctionne maintenant bien pour moi.
EDIT: Comme demandé, voici quelques détails supplémentaires:
Disons que j'ai une fonction de dessin sur toile comme celle-ci (juste un exemple, peu importe):
function drawCanvas(cv) {
for(var i=0; i<cv.height; i++) {
for(var j=0, d=0; j<cv.width; j++) {
cv.data[d] = 0xff0000;
d += 4;
}
}
}
J'ai dû corriger ma fonction d'impression comme suit:
var cv=document.getElementById('canvas');
printPDF(cv) {
var imgData=cv.toDataURL("image/jpeg", 1.0);
var doc=new jsPDF("p","mm","a4");
doc.addImage(imgData,'JPEG',15,40,180,180);
drawCanvas(cv); // <--- this line is needed, draw again
}
drawCanvas(cv); // <--- draw my image to the canvas, ok
printPDF(cv); // first time is fine
printPDF(cv); // second time without repaint would be black
Je reconnais que je n’ai pas enquêté davantage, je suis heureux que cela fonctionne.
Tout d’abord, vous devez définir la couleur d’arrière-plan souhaitée sur la canvas
avant d’obtenir la data
. Ensuite, vous devez dessiner une image jpeg
sur la canvas
.
Il suffit de changer JPEG pour PNG pdf.addImage (imgData, 'PNG', 0, 0, 1350, 750);