Descargue un div en una página HTML como pdf usando javascript

91

Tengo un div de contenido con la identificación como "contenido". En el div de contenido tengo algunos gráficos y algunas tablas. Quiero descargar ese div como pdf cuando el usuario hace clic en el botón de descarga. ¿Hay alguna forma de hacerlo usando javascript o jQuery?

Midhun Mathew
fuente
1
code.google.com/p/jspdf es la mejor biblioteca que conozco que puede hacer esto.
AlvinArulselvan
¿Cómo puedo usar jsPDF para descargar un contenido en un div específico? por lo que veo en los ejemplos en su sitio, no se puede hacer.
Midhun Mathew

Respuestas:

112

Puedes hacerlo usando jsPDF

HTML:

<div id="content">
     <h3>Hello, this is a H3 tag</h3>

    <p>A paragraph</p>
</div>
<div id="editor"></div>
<button id="cmd">generate PDF</button>

JavaScript:

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

$('#cmd').click(function () {
    doc.fromHTML($('#content').html(), 15, 15, {
        'width': 170,
            'elementHandlers': specialElementHandlers
    });
    doc.save('sample-file.pdf');
});
ilyes kooli
fuente
25
Tengo un problema aqui. El css que he agregado aquí no se aplica en el archivo pdf. También tengo algunos gráficos también ... los que no vienen en el pdf. ¿Qué debo hacer para conseguirlos?
Midhun Mathew
14
jsPDF tampoco formatea las tablas correctamente, solo interpreta td / th como display: block;
Dave
2
Usando el código anterior, podemos crear un pdf solo una vez. Pero por segunda vez no funciona. Para que funcione, verifique esta respuesta de @ kristof-feys, Necesitamos declarar la docvariable dentro de la función de clic.
Mahendran Sakkarai
4
Esto es bueno, es una pena que el CSS no se renderice: /
Nicholas
1
Me enfrenté a un problema de codificación
ema
19

El contenido dentro de un <div class='html-content'>....</div>se puede descargar como pdf con estilos usando jspdf y html2canvas .

Necesita consultar ambas bibliotecas js,

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script>
<script type="text/javascript" src="https://html2canvas.hertzen.com/dist/html2canvas.js"></script>

Luego llame a la siguiente función,

//Create PDf from HTML...
function CreatePDFfromHTML() {
    var HTML_Width = $(".html-content").width();
    var HTML_Height = $(".html-content").height();
    var top_left_margin = 15;
    var PDF_Width = HTML_Width + (top_left_margin * 2);
    var PDF_Height = (PDF_Width * 1.5) + (top_left_margin * 2);
    var canvas_image_width = HTML_Width;
    var canvas_image_height = HTML_Height;

    var totalPDFPages = Math.ceil(HTML_Height / PDF_Height) - 1;

    html2canvas($(".html-content")[0]).then(function (canvas) {
        var imgData = canvas.toDataURL("image/jpeg", 1.0);
        var pdf = new jsPDF('p', 'pt', [PDF_Width, PDF_Height]);
        pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin, canvas_image_width, canvas_image_height);
        for (var i = 1; i <= totalPDFPages; i++) { 
            pdf.addPage(PDF_Width, PDF_Height);
            pdf.addImage(imgData, 'JPG', top_left_margin, -(PDF_Height*i)+(top_left_margin*4),canvas_image_width,canvas_image_height);
        }
        pdf.save("Your_PDF_Name.pdf");
        $(".html-content").hide();
    });
}

Ref: generación de pdf a partir de html canvas y jspdf .

Puede que esto ayude a alguien.

Vishnu S
fuente
4
Esto funcionó muy bien para mí, gracias. Conserva todo el estilo, pero tiene algunas limitaciones (crea el PDF como una imagen para que no se pueda buscar; también parece estar un poco borroso).
jramm
¿Cómo configurar el salto de página si la mitad del contenido no cabe en una página?
SHEKHAR SHETE
Me funcionó muy bien. ¡El único problema fue que algunos de mis iconos SVG no se renderizaron!
Felipe N Moura
2

Su solución requiere algún método ajax para pasar el html a un servidor back-end que tiene una función de html a pdf y luego devolver la salida en pdf generada al navegador.

Primero configurando el código del lado del cliente, configuraremos el código jquery como

   var options = {
            "url": "/pdf/generate",
            "data": "data=" + $("#content").html(),
            "type": "post",
        }
   $.ajax(options)

Luego intercepte los datos del script de generación html2pdf de la siguiente manera

   $html = $_POST['data'];
   $pdf = html2pdf($html);

   header("Content-Type: application/pdf"); //check this is the proper header for pdf
   header("Content-Disposition: attachment; filename='some.pdf';");
   echo $pdf;

 

DevZer0
fuente
¿Qué quisiste decir con "tiene una instalación htmltopdf"?
Midhun Mathew
¿Está bien hacer referencia a la misma URL o debo cambiarla?
Midhun Mathew
Necesitaría una URL ligeramente diferente para poder diferenciar entre los dos contenidos
DevZer0
¿Cómo debería ser esa URL? ¿¿Puede dar un ejemplo??
Midhun Mathew
2
Sin embargo, se arruinará si el CSS está vinculado porque su programa de back-end no sabrá dónde encontrar los estilos a menos que pueda tomar el archivo CSS y aplicar los estilos desde dentro del archivo.
TheRealChx101
1

AFAIK, no hay una función nativa de jquery que haga esto. La mejor opción sería procesar la conversión en el servidor. La forma de hacerlo depende del idioma que esté utilizando (.net, php, etc.). Puede pasar el contenido del div a la función que maneja la conversión, que devolvería un pdf al usuario.

reggaemahn
fuente
-1

Sí, es posible capturar div como PDF en JS. Puede consultar la solución proporcionada por https://grabz.it . Tienen una API de JavaScript agradable y limpia que le permitirá capturar el contenido de un solo elemento HTML, como un div o un intervalo.

Entonces, si lo usa, necesitará una aplicación + clave y el SDK gratuito . Su uso es el siguiente:

Digamos que tienes un HTML:

<div id="features">
    <h4>Acme Camera</h4>
    <label>Price</label>$399<br />
    <label>Rating</label>4.5 out of 5
</div>
<p>Cras ut velit sed purus porttitor aliquam. Nulla tristique magna ac libero tempor, ac vestibulum felisvulput ate. Nam ut velit eget
risus porttitor tristique at ac diam. Sed nisi risus, rutrum a metus suscipit, euismod tristique nulla. Etiam venenatis rutrum risus at
blandit. In hac habitasse platea dictumst. Suspendisse potenti. Phasellus eget vehicula felis.</p>

Para capturar lo que está debajo de la identificación de características, necesitará:

//add the sdk
<script type="text/javascript" src="grabzit.min.js"></script>
<script type="text/javascript">
//login with your key and secret. 
GrabzIt("KEY", "SECRET").ConvertURL("http://www.example.com/my-page.html",
{"target": "#features", "format": "pdf"}).Create();
</script>

Debe reemplazar el http://www.example.com/my-page.htmlcon su URL de destino y #featuresegún su selector de CSS.

Eso es todo. Ahora, cuando se cargue la página, se creará una captura de pantalla de imagen en la misma ubicación que la etiqueta de script, que contendrá todo el contenido de las características div y nada más.

Hay otra configuración y personalización que puede hacer con el mecanismo de captura de pantalla div, compruébelo aquí

Johnny
fuente
2
Creo que solo obtienes 1,000 capturas gratis y 100 "raspaduras" gratis con grabz.it. Así que no es una solución permanente a menos que esté dispuesto a pagar por ella.
BrettC