Cette façon de faire peut ou non être sous-optimale, mais la solution la plus simple au problème des pages multiples que j'ai trouvée est de s'assurer que tout le rendu est effectué avant d'appeler la méthode jsPDFObj.save.
En ce qui concerne le rendu des articles cachés, cela est résolu avec un correctif similaire au remplacement du texte de l'image css, je positionne absolument l'élément à rendre à -9999px de la page gauche, Cela n'affecte pas la mise en page et permet à l'élément d'être visible pour html2pdf, en particulier lors de l'utilisation d'onglets, d'accordéons et d'autres composants de l'interface utilisateur qui dépendent de l'affichage de la page. {display: none}
.
Cette méthode enveloppe les conditions préalables dans une promesse et appelle pdf.save()
dans le finally()
méthode. Je ne peux pas être sûr que cette méthode soit infaillible, ni qu'elle soit un anti-modèle, mais il semblerait qu'elle fonctionne dans la plupart des cas où je l'ai utilisée.
// Get List of paged elements.
let elems = document.querySelectorAll('.elemClass');
let pdf = new jsPDF("portrait", "mm", "a4");
// Fix Graphics Output by scaling PDF and html2canvas output to 2
pdf.scaleFactor = 2;
// Create a new promise with the loop body
let addPages = new Promise((resolve,reject)=>{
elems.forEach((elem, idx) => {
// Scaling fix set scale to 2
html2canvas(elem, {scale: "2"})
.then(canvas =>{
if(idx < elems.length - 1){
pdf.addImage(canvas.toDataURL("image/png"), 0, 0, 210, 297);
pdf.addPage();
} else {
pdf.addImage(canvas.toDataURL("image/png"), 0, 0, 210, 297);
console.log("Reached last page, completing");
}
})
setTimeout(resolve, 100, "Timeout adding page #" + idx);
})
addPages.finally(()=>{
console.log("Saving PDF");
pdf.save();
});