Pregunta

Estoy generando factura en pdf usando fpdf.

Algunas facturas que contienen muchos artículos y detalles deben ir a la segunda página. Sin embargo, necesito que el total y otros detalles se muestren en la primera página.

Ahora mismo, si puedo agregar una nueva página como esta: $ pdf- > AddPage ();

Pero, esto pone todo en la segunda página, sea lo que sea después de esta declaración.

Parece que no hay forma de especificar la página para los métodos de escritura o de celda.

La representación y los cálculos son complejos de bits, por lo tanto, no se quieren almacenar en una matriz temporal y mostrarlos después de mostrar completamente la primera página.

Gracias.

¿Fue útil?

Solución

if(!empty($this->replace) && !empty($this->replacement)){
    $this->pages[$n]=str_replace($this->replace,$this->replacement,$this->pages[$n]);
}

Agregué este código a la clase fpdf en _putpages () justo debajo de la línea de contenido de la página 2851

Ejemplo después de agregar el código anterior:

$pdf->replace = array("{paid_msg}","{balance}");
$pdf->replacement = array("Paid","0.00");

Puede ser una cadena o una matriz.

Otros consejos

Tuve un problema muy similar y seguí adelante y acabo de agregar la función a la clase:

function SetPage($num) {
    $this->page = $num;
}

Esto hace literalmente lo que esperas. Pero, cuando intenta volver a la página siguiente, debe configurarlo explícitamente o agregarla a la funcionalidad Celda (). Aquí es donde se agrega una página:

    if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())

Esto comprueba AcceptPageBreak y, obviamente, si la altura de la página es menor a la que obtendremos si nos quedamos en la página. Lo que hice fue agregar un condicional aquí para ver si había otra página a continuación. Si había, en lugar de AGREGAR una nueva página, seguí adelante, solo puse mi S en mi margen y usé la función anterior para visitar esa página. Como tal:

if ($this->page < count($this->pages)) {
        $this->SetPage(($this->page)+1);
        $this->y = .5;
    }

Si no se siente a gusto con la FPDF, esto podría no ser para usted, pero después de resolver este problema, me di cuenta de que el script era muy fácil de navegar y dejaba mucho espacio para mejoras simples. Tenga en cuenta que en lugar de buscar otra página en la parte superior, también puede agregar una variable a la que podría llamar y que le indicaría al script que, en lugar de agregar una página, pase al siguiente.

FPDF no le permite volver a una página anterior. Una vez que haya terminado con una página, ya sea llamando a AddPage () o quedándose sin espacio cuando se activa SetAutoPageBreak (), ya ha terminado.

La solución es generar su documento sin el total, escribirlo en un archivo temporal y luego volver a cargarlo (usando FPDI: http://www.setasign.de/products/pdf-php-solutions/fpdi/ ) y agregue el total en el lugar correcto.

Aquí hay algunas soluciones inteligentes, pero no recomiendo este truco, porque va en contra del modelo FPDF básico y, tarde o temprano, probablemente cause otros problemas en el futuro.

¡La programación ya es lo suficientemente compleja!

Entonces, separe el modelo de la factura o lo que sea de la presentación. Construye todo el modelo. Luego imprima la presentación (el PDF en este caso).

Encontré muy adecuado el método * str_replace *, debido a la necesidad de escribir " n de m pages " ;. Primero escribí el número n normalmente ya que construí cada página y finalmente reemplacé el cifrado en $ pdf- > pages [$ i] página por página.

Me encontré con este problema al tener un diseño de dos columnas, donde una columna podría ser tan grande que abarcaría la página siguiente. Quería volver a establecer la posición Y en la misma posición Y que la primera columna, para que se alineen una con la otra, pero también continuar el documento debajo de la mayor de las dos columnas.

Mi solución fue grabar la " Posición vertical " del documento, que incluye el Número de página ( $ pdf- > PageNo () ) y la Posición Y ( $ pdf- > GetY () ).

Es necesario almacenar dos posiciones verticales diferentes. Primero, almacene el " Punto de inicio " que es donde comenzarás tu segunda columna. En segundo lugar, almacene el " Punto más grande " que es lo mas alejado del documento. El punto más grande fue complicado porque no puedes mirar solo el número de página o el valor de Y, debes mirar ambos.

Creé estos tres métodos para ayudarme.

Esta solución no incluye la posición X en el ejemplo.

public function GetVerticalPosition() {
  // Include page and Y position of the document
  return array(
    'page' => $this->PageNo(),
    'y' => $this->GetY(),
  );
}

public function SetVerticalPosition( $pos ) {
  // Set the page and Y position of the document
  $this->page = $pos['page'];
  $this->SetY( $pos['y'] );
}

public function FurthestVerticalPosition( $aPos, $bPos = null ) {
  if ( $bPos === null ) $bPos = $this->GetVerticalPosition();

  // Returns the "furthest" vertical position between two points, based on page and Y position
  if ( 
    ($aPos['page'] > $bPos['page']) // Furthest position is located on another page
    ||
    ($aPos['page'] == $bPos['page'] && $aPos['y'] > $bPos['y'] ) // Furthest position is within the same page, but further down
  ) {
    return $aPos;
  }else{
    return $bPos;
  }
}

El uso es bastante sencillo. Antes de dibujar sus columnas de altura variable, debe tomar la posición inicial y comenzar a recolectar la posición máxima.

$startPos = $this->GetVerticalPosition();
$furthestPos = $this->GetVerticalPosition();

Después de renderizar cada celda, antes de renderizar otra celda en el mismo nivel, desea actualizar la posición más alejada (si es necesario), luego volver a la posición inicial.

// Returns the furthest of the two possibilites
$furthestPos = $this->FurthestVerticalPosition( $this->GetVerticalPosition(), $furthestPos );
$this->SetVerticalPosition( $startPos );

Cuando termines de renderizar tus columnas, configura el documento a la distancia máxima que hayas registrado hasta ahora.

$this->SetVerticalPosition( $furthestPos );

Ahora sus columnas están alineadas correctamente y el puntero del documento se encuentra inmediatamente después de la columna dibujada más lejana.

Tuve el mismo problema y anulé algunos métodos de la clase FPDF y pude solucionarlo de una manera bastante simple. Para avanzar y retroceder páginas, simplemente necesita cambiar el atributo de página del objeto FPDF. Sin embargo, una vez que regresas a una página, cuando pasas a la página siguiente, terminarás agregando una página nueva en lugar de avanzar a la ya existente. Para lidiar con este problema, creé un booleano llamado add_new_page y lo utilicé en mi método accept_page_break reescrito para ver si crear o no una nueva página o pasar a una ya existente.

def prev_page(self):
    self.page -= 1
    self.add_new_page = False

def next_page(self):
    self.page += 1

def accept_page_break(self):
    "Accept automatic page break or not"
    if self.add_page:
        return self.auto_page_break
    else:
        self.page += 1
        self.add_new_page = True

Simplemente un " hack " ;, pero los datos deben ordenarse por número de página (no es muy difícil ^ ^)

Pon tu " para bucle " colocando datos algo como:

// ensure we are on the good page, but fields HAVE TO be ordered by page number
while($this->fpdf->PageNo() != $myData->getPage()){
    $this->fpdf->AddPage();
}

Y ya has terminado! No es necesario alterar FPDF: D

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top