es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se pueden copiar todos los estilos del documento original para implementar window.print(). Localhost funciona bien, pero la versión de producción no.

Tengo que obtener todos los estilos de mi aplicación Vue. He seguido el código escrito aquí: https://stackoverflow.com/questions/52343006/how-to-print-a-part-of-a-vue-component-without-losing-the-style

Esto no es una solución perfecta pero funciona bien (en localhost). Con esta línea de código:

[...document.querySelectorAll('link[rel="stylesheet"], style')]

Estoy obteniendo 60 registros de hojas de estilo en localhost. Desafortunadamente, solo se aplican 6 hojas de estilo en producción (de Vuetify).

Aquí está la implementación de la función:

downloadReport(): void {
      const prtHtml = window.document.getElementById("print")!.innerHTML;

  // Obtener todo el HTML de las hojas de estilo
  let stylesHtml = "";
  for (const node of [...document.querySelectorAll('link[rel="stylesheet"], style')]) {
    stylesHtml += node.outerHTML;
  }

  console.log("CONTADOR: ", [...document.querySelectorAll('link[rel="stylesheet"], style')].length);

  const winPrint = window.open("", "", "left=0,top=0,width=1500,height=800,toolbar=0,scrollbars=0,status=0")!;

  winPrint.document.write(`<!DOCTYPE html>
<html>
  <head>
    ${stylesHtml}
    <title>${this.fileName}</title>
  </head>
  <body>
     ${prtHtml}
  </body>
</html>`);

  winPrint.document.close();
  winPrint.focus();
  winPrint.print();
  winPrint.close();
},

En la plantilla tengo una etiqueta de sección que quiero poner en el archivo PDF generado:

<section id="print" class="report print-area">contenido</section>

¿Qué puedo hacer para aplicar todos los estilos también en producción?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para aplicar todos los estilos en producción

    El código en el enlace proporcionado solo está obteniendo las hojas de estilo que están definidas como etiquetas link, y los estilos definidos dentro de las etiquetas <style> no están siendo obtenidos. Para obtener todos los estilos, incluyendo aquellos dentro de las etiquetas <style>, podemos modificar el código de la siguiente manera:

    // Obtener todo el HTML de las hojas de estilo
    let stylesHtml = "";
    for (const node of [...document.querySelectorAll('link[rel="stylesheet"], style')]) {
      stylesHtml += node.outerHTML;
    }
    
    // Obtener todos los elementos de estilo
    for (const style of [...document.querySelectorAll('style')]) {
      stylesHtml += `<style>${style.innerHTML}</style>`
    }
    

    En este código modificado, estamos obteniendo todos los elementos de estilo y concatenando su HTML a stylesHtml. Esto incluirá todos los estilos definidos en las hojas de estilo y en las etiquetas `

Comments are closed.