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.

Cómo evitar que el contenido dinámico se superponga en el encabezado y pie de página en el paquete React-to-print.

Tengo un problema en el que el contenido dinámico de HTML se está sobrescribiendo en el encabezado y el pie de página. El contenido dinámico proviene de la respuesta de la API y se muestra en el componente, pero al imprimir este PDF, el contenido dinámico se superpone en el encabezado y el pie de página. He utilizado una biblioteca react-to-print y el contenido es dinámico y tiene varias páginas. Sugiere una solución sólida para esto. Quiero que el encabezado y el pie de página estén junto con el contenido, pero el contenido no debe superponerse en el encabezado y el pie de página y el contenido restante debe pasar a la siguiente página.

RenderHTML =() => {
const htmlPart = this.state.carfaxHTML
return (

)

}


{this.RenderHTML()}


Esta es la parte de renderizado donde se llama la función.

{
return (

);
}}
content={() => this.componentRef}
/>

Desde aquí se activa React-to-print.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema del contenido dinámico que se superpone a la cabecera y el pie de página al imprimir en PDF utilizando la biblioteca React-to-print, puedes seguir la siguiente solución:

    1. Asegúrate de que la cabecera y el pie de página estén posicionados de forma fija y tengan suficiente espacio para alojar el contenido sin superponerse.
    2. Crea una regla CSS para aplicar un salto de página antes del contenido, de modo que empiece en una página nueva si no cabe en la página actual.

    3. Envuelve todo el contenido dentro de un div y pásalo como referencia a la propiedad “content” de React-to-print.

    4. Utiliza el callback “onBeforePrint” de React-to-print para agregar dinámicamente la regla de salto de página al div de contenido.

    5. Añade una comprobación para la última página del contenido, para evitar que haya un salto de página después de ella.

    Aquí tienes un código de ejemplo:

    import React, { Component } from 'react';
    import ReactToPrint from 'react-to-print';
    
    class PrintComponent extends Component {
      render() {
        return (
          <div>
            <div classname="header">
              // Contenido de la cabecera
            </div>
    
            <div classname="footer">
              // Contenido del pie de página
            </div>
    
            <div classname="content" ref="{(el)" ==""> (this.contentRef = el)}>
              // Aquí va el contenido dinámico
            </div>
    
            <reacttoprint trigger="{()" ==""> {
                return (
                  <button classname="glass btn btn-lg btn-danger pull-right">
                    <i classname="fa fa-print"></i>  Imprimir en PDF
                  </button>
                );
              }}
              content={() => this.contentRef}
              onBeforePrint={() => {
                const contentBlocks = this.contentRef.querySelectorAll('.rendercarfexHtmlData');
    
                contentBlocks.forEach((block) => {
                  const pageBreakTopElem = document.createElement('div');
                  pageBreakTopElem.classList.add('page-break-top');
                  block.prepend(pageBreakTopElem);
    
                  const pageBreakBottomElem = document.createElement('div');
                  pageBreakBottomElem.classList.add('page-break-bottom');
                  block.append(pageBreakBottomElem);
                });
    
                this.contentRef.querySelectorAll('.page-break-top').forEach(elem => {
                  if (elem.previousElementSibling) {
                    elem.style.pageBreakBefore = 'always';
                  }
                });
    
                this.contentRef.querySelectorAll('.page-break-bottom').forEach(elem => {
                  if (!elem.nextElementSibling) {
                    elem.style.display = 'none';
                  } else {
                    elem.style.pageBreakAfter = 'always';
                  }
                });
              }}
            />
          </reacttoprint></div>
        );
      }
    }
    

    En el código anterior, hemos añadido de manera dinámica los divs “page-break-top” y “page-break-bottom” para aplicar saltos de página antes y después de cada bloque de contenido respectivamente. También hemos añadido una comprobación para ocultar el div “page-break-bottom” en la última página.

Comments are closed.