Cómo usar correctamente la biblioteca jsPDF

84

Quiero convertir algunos de mis divs en PDF y probé la biblioteca jsPDF pero sin éxito. Parece que no puedo entender lo que necesito importar para que la biblioteca funcione. He revisado los ejemplos y todavía no puedo entenderlo. He intentado lo siguiente:

<script type="text/javascript" src="js/jspdf.min.js"></script>

Después de jQuery y:

$("#html2pdf").on('click', function(){
    var doc = new jsPDF();
    doc.fromHTML($('body').get(0), 15, 15, {
        'width': 170
    });
    console.log(doc);
});

con fines de prueba pero recibo:

"Cannot read property '#smdadminbar' of undefined"

donde #smdadminbarestá el primer div del cuerpo.

Daniela costina Vaduva
fuente
el que funcionó para mí github.com/devrajatverma/jsPdfEjemplo
Rajat
1
Nota para todos los que llegan aquí tratando de averiguar fromHTMLo por qué no está documentado en los documentos jsPDF: " Estamos cerrando este problema, porque ya no admitiremos más desde HTML y addHTML " ( del número 516 )
toraritte

Respuestas:

133

puede usar pdf desde html de la siguiente manera,

Paso 1: agregue el siguiente script al encabezado

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>

o descargar localmente

Paso 2: agregue un script HTML para ejecutar el código jsPDF

Personalice esto para pasar el identificador o simplemente cambie #content para que sea el identificador que necesita.

 <script>
    function demoFromHTML() {
        var pdf = new jsPDF('p', 'pt', 'letter');
        // source can be HTML-formatted string, or a reference
        // to an actual DOM element from which the text will be scraped.
        source = $('#content')[0];

        // we support special element handlers. Register them with jQuery-style 
        // ID selector for either ID or node name. ("#iAmID", "div", "span" etc.)
        // There is no support for any other type of selectors 
        // (class, of compound) at this time.
        specialElementHandlers = {
            // element with id of "bypass" - jQuery style selector
            '#bypassme': function (element, renderer) {
                // true = "handled elsewhere, bypass text extraction"
                return true
            }
        };
        margins = {
            top: 80,
            bottom: 60,
            left: 40,
            width: 522
        };
        // all coords and widths are in jsPDF instance's declared units
        // 'inches' in this case
        pdf.fromHTML(
            source, // HTML string or DOM elem ref.
            margins.left, // x coord
            margins.top, { // y coord
                'width': margins.width, // max width of content on PDF
                'elementHandlers': specialElementHandlers
            },

            function (dispose) {
                // dispose: object with X, Y of the last line add to the PDF 
                //          this allow the insertion of new lines after html
                pdf.save('Test.pdf');
            }, margins
        );
    }
</script>

Paso 3: agrega el contenido de tu cuerpo

<a href="javascript:demoFromHTML()" class="button">Run Code</a>
<div id="content">
    <h1>  
        We support special element handlers. Register them with jQuery-style.
    </h1>
</div>

Consulte el tutorial original

Ver un violín que funciona

Bienqueriente
fuente
4
Gracias por publicar esto, pero probé el código exacto anterior (localmente) y genera un documento pdf en blanco. No funciona en absoluto con jquery 1.11.0, así que usé la misma versión de jquery que se usó en github.com/MrRio/jsPDF/blob/master/examples/js/jquery/…
user1063287
Probé su código @Well Wisher, me está dando el siguiente error, para el archivo de biblioteca en sí mismo: no se puede leer la propiedad 'longitud' de jspdf.plugin.from_html.js indefinido: 500
Estudiante
1
Sí, esto es realmente bueno ,,, Pero la salida de JSPdf se superpone con otros elementos de los elementos de mi tabla, ¿Cómo puedo resolverlo? .... Cambié el tamaño de las fuentes y lo hice como modo horizontal, lo intenté la mayoría de las modificaciones, pero nada funciona
Sudhir Belagali
1
Solo pude hacer que este ejemplo funcionara usando los CDN de CloudFlare: <script src = " cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/… > o <script src =" cdnjs.cloudflare.com /ajax/libs/jspdf/1.2.61/… > Pero estoy de acuerdo, la documentación y las variaciones generales en el código fuente contribuyen a la dificultad de usar este complemento. Incluso estos CDN (que utiliza JSfiddle) varían del enlace "descargar localmente" @Bueno, las referencias anteriores.
Scott
1
@Scott i el quitaron el enlace
Well Wisher
17

Solo necesitas este enlace jspdf.min.js

Tiene todo en ella.

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>
user890332
fuente
2
Gracias, esto me estaba volviendo loco! El uso de la versión de depuración de jspdf funcionó, mientras que las otras versiones en cualquier configuración no lo hicieron. ¿Quizás la minificación lo está rompiendo de alguna manera? o lo estoy haciendo mal.
jookyone
Esto realmente me ayudó. Estaba usando el archivo jspdf.js original y no funcionaba. El uso de jspdf.debug.js hizo el trabajo.
Francisco Quintero
Interesante por qué la versión de producción no funciona ... Incluí todos los complementos en la página html y, sin embargo, solo esta versión de depuración ayudó.
2015
Hola, intenté esto pero obtengo un error Error in function FileSaver@http://mrrio.github.io/jsPDF/dist/jspdf.debug.js:5875:18: get_URL(...).createObjectURL is not a function, lo mismo si uso la versión de bower. ¿Cualquier pista?
dbr
Verifique la última versión en GitHub y cambie la URL anterior en consecuencia. El último es 1.3.5.
pasx
8

Esto es finalmente lo que hizo por mí (y desencadena una disposición):

function onClick() {
  var pdf = new jsPDF('p', 'pt', 'letter');
  pdf.canvas.height = 72 * 11;
  pdf.canvas.width = 72 * 8.5;

  pdf.fromHTML(document.body);

  pdf.save('test.pdf');
};

var element = document.getElementById("clickbind");
element.addEventListener("click", onClick);
<h1>Dsdas</h1>

<a id="clickbind" href="#">Click</a>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.3/jspdf.min.js"></script>

Y para los de inclinación KnockoutJS, un poco de encuadernación:

ko.bindingHandlers.generatePDF = {
    init: function(element) {

        function onClick() {
            var pdf = new jsPDF('p', 'pt', 'letter');
            pdf.canvas.height = 72 * 11;
            pdf.canvas.width = 72 * 8.5;

            pdf.fromHTML(document.body);

            pdf.save('test.pdf');                    
        };

        element.addEventListener("click", onClick);
    }
};
pim
fuente
¿Hay más en este fragmento? Cuando intento ejecutar esto, aparece un error que indica que 'pdf.canvas' no está definido. "Error de tipo no detectado: no se puede establecer la propiedad 'altura' de indefinido"
Ryan Gibbs
¿No estoy seguro de lo que quieres decir? El fragmento se ejecuta con el mismo código. Entonces, tal vez algo esté mal en su implementación. ¿Puedes console.log (pdf) y compartir la salida?
pim
Debe haber sido un problema de almacenamiento en caché o algo así, cuando lo intenté hace un momento con el archivo console.log () allí, el código se ejecutó correctamente. Sigo teniendo el problema de las páginas en blanco, pero esa es una historia diferente. Gracias.
Ryan Gibbs
también tengo el error "No se puede leer la propiedad 'addEventListener'"
Manjitha Teshara
Me encanta esta biblioteca jsPDF (). Por cierto, si alguien más encuentra esto útil, acabo de descubrir la sintaxis para adjuntar una devolución de llamada para que se ejecute después de que se haya generado el PDF:pdf.save("myfile.pdf", function(){ alert("pdf generation/save finished!"); });
Christopher D. Emerson
3

¿No debería utilizar también la biblioteca jspdf.plugin.from_html.js? Además de la biblioteca principal (jspdf.js), debe usar otras bibliotecas para "operaciones especiales" (como jspdf.plugin.addimage.js para usar imágenes). Consulte https://github.com/MrRio/jsPDF .

Pedro Almeida
fuente
3
El jspdf.source.js parece incluir todas las demás bibliotecas.
whossname
3

primero, debes crear un controlador.

var specialElementHandlers = {
    '#editor': function(element, renderer){
        return true;
    }
};

luego escriba este código en el evento de clic:

doc.fromHTML($('body').get(0), 15, 15, {
    'width': 170, 
    'elementHandlers': specialElementHandlers
        });

var pdfOutput = doc.output();
            console.log(">>>"+pdfOutput );

asumiendo que ya ha declarado la variable doc. Y luego ha guardado este archivo pdf usando File-Plugin.

Akshay Tyagi
fuente
3

Según la última versión (1.5.3) ya no existe ningún fromHTML()método. En su lugar, debe utilizar el complemento HTML jsPDF, consulte: https://rawgit.com/MrRio/jsPDF/master/docs/module-html.html#~html

También debe agregar la biblioteca html2canvas para que funcione correctamente: https://github.com/niklasvh/html2canvas

JS (de los documentos de la API):

var doc = new jsPDF();   

doc.html(document.body, {
   callback: function (doc) {
     doc.save();
   }
});

También puede proporcionar una cadena HTML en lugar de una referencia al elemento DOM.

Vitalii Chmovzh
fuente
Tampoco parece funcionar más - jQuery.Excepción diferida: doc.html no es una función TypeError: doc.html no es una función
DropHit
1

¿Qué tal en vuejs cómo es aplicable?

function onClick() {
  var pdf = new jsPDF('p', 'pt', 'letter');
  pdf.canvas.height = 72 * 11;
  pdf.canvas.width = 72 * 8.5;

  pdf.fromHTML(document.body);

  pdf.save('test.pdf');
};

var element = document.getElementById("clickbind");
element.addEventListener("click", onClick);
<h1>Dsdas</h1>

<a id="clickbind" href="#">Click</a>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.3/jspdf.min.js"></script>

Antwnina
fuente
Gracias por publicar el ejemplo de vuejs sobre el uso de jdpsf
Shane G