Skip to content

Instantly share code, notes, and snippets.

@bertoni
Last active May 20, 2022 13:59
Show Gist options
  • Save bertoni/3a9c8b7853d62c2d76ed087397d38a8a to your computer and use it in GitHub Desktop.
Save bertoni/3a9c8b7853d62c2d76ed087397d38a8a to your computer and use it in GitHub Desktop.
html2canvas and jsPDF in action
<template>
<div id="app">
<img src="./assets/logo.png">
<router-view/>
<button @click="download">Download</button>
<div id="pdf"></div>
</div>
</template>
<script>
import html2canvas from 'html2canvas'
import * as JsPDF from 'jspdf'
export default {
name: 'App',
methods: {
download () {
html2canvas(document.querySelector('#app'), {imageTimeout: 5000, useCORS: true}).then(canvas => {
document.getElementById('pdf').appendChild(canvas)
let img = canvas.toDataURL('image/png')
let pdf = new JsPDF('portrait', 'mm', 'a4')
pdf.addImage(img, 'JPEG', 5, 5, 200, 287)
pdf.save('relatorio-remoto.pdf')
document.getElementById('pdf').innerHTML = ''
})
}
}
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
@bertoni
Copy link
Author

bertoni commented Apr 13, 2018

Pega o conteúdo da div#wrapper-report e gera um canvas.
Coloca o canvas dentro da div#pdf e gera um PDF no tamanho A4 com 5cm de borda de cada lado.
Salva o PDF.

@bertoni
Copy link
Author

bertoni commented Apr 15, 2018

Step-by-step

  • docker run -it --rm --user node -v /var/www/:/var/www/ -p 8080:8080 node:8-alpine /bin/sh
  • mkdir jspdf
  • cd jspdf
  • npm install vue-cli
  • ./node_modules/vue-cli/bin/vue init webpack my-project
  • cd my-project
  • vi package.json
  • -- put "--host 0.0.0.0" in script/dev node for use outside container docker
  • yarn add html2canvas
  • yarn add jspdf
  • npm run dev
  • access http://localhost:8080/ and click "download" button to generate PDF

@ofmarconi
Copy link

Desculpe, mas estou tentando fazer isso em uma página com vários DIV's com a Class: pdfpage

Quero que cada div.pdfpage seja uma página do PDF

Como posso fazer isso funcionar com o Wordpress, por exemplo?

@bertoni
Copy link
Author

bertoni commented May 12, 2022

Talvez tenha que iterar cada class encontrada, adicionar ao canvas e checar na lib de pdf se existe a possibilidade de criar marcações de páginas, ou se ele interpreta algum elemento HTML do canvas como "quebra" de página, acho que isso resolveria...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment