FPDF - Bir önceki sayfaya gidiyor

6 Cevap php

Ben FPDF kullanarak pdf fatura üreten duyuyorum.

Birçok öğe ve ayrıntıları içeren bazı faturaların ikinci sayfaya gitmek gerekir. Ancak, toplam ihtiyaç ve ilk sayfada görüntülenecek diğer ayrıntıları.

Right now, if I can add new page like this: $pdf->AddPage();

Ama, bu ne olursa olsun bu açıklamasının ardından, ikinci sayfanın içine her şeyi koyar.

Yazma ya da hücre yöntemlerden biri için sayfasını belirtmek için bir yol var gibi görünüyor.

Rendering ve hesaplamalar biraz karmaşık, dolayısıyla tamamen ilk sayfayı render sonra bir geçici dizi ve ekran içine saklamak istemiyorum.

Teşekkür ederim.

6 Cevap

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

Birazdan altında / Sayfa içeriği hat 2851) _putpages yılında FPDF sınıfına (Bu kodu eklendi

Örnek kod yukarıdaki ekledikten sonra:

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

Bu bir dize veya bir dizi olabilir.

FPDF geri Bir önceki sayfaya gitmek için izin vermez. AddPage () arayarak veya SetAutoPageBreak () açıkken alanı tükeniyor ile ya - - Sen onunla bitti bir sayfa ile bittiğinde.

Ve doğru yerde toplam eklemek: geçici çözüm (http://www.setasign.de/products/pdf-php-solutions/fpdi/ FPDI kullanarak) geri yüklemek, toplam belgenizi oluşturmak geçici bir dosyaya yazmak için.

Ben çok benzer bir sorunu vardı ve ben önde gitti ve sadece sınıfa fonksiyonu eklendi:

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

Bu anlamıyla beklediğiniz nedir. Eğer geri sonraki sayfaya gitmek için çalıştığınızda Ama, açıkça veya ayarlayabilirsiniz Hücre () işlevsellik eklemek için ya da gerek. Bir sayfa ekler İşte burada:

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

Bu AcceptPageBreak denetler ve tabii ki sayfanın yüksekliği biz sayfada kalmak eğer biz bitireceğiz nerede daha az olup olmadığını. Ne yaptım altında başka bir sayfa olup olmadığını görmek için kontrol etmek için buraya koşullu eklemek oldu. Yerine yeni bir sayfa ekleyerek daha olsaydı, ben önde gitti ve sadece benim marjı benim Y kurmak ve bu sayfayı ziyaret etmek için yukarıdaki işlevi kullanılır. Bu nedenle:

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

Eğer FPDF ile karıştırmasını rahatsız iseniz, bu sizin için olmayabilir, ama bu sorunu çözmek sonra benim gerçekleşme komut çok kolay navigasyon ve basit iyileştirmeler için oda büyük bir anlaşma yaptı ki aslında. Yerine başka bir sayfa için yukarıdaki kontrol, aynı zamanda bu geçici yerine bir sayfa ekleyerek, sadece gelecek atlamak komut söylerdim diyebiliriz bir değişken eklemek olabilir unutmayın.

Bu temel FPDF modeli karşı gider ve er ya da geç, muhtemelen yolda diğer sorunlara neden olacaktır, çünkü burada bazı zeki çözümler, ama ben, bu kandırmaca önermiyoruz.

Programlama zaten yeterince karmaşık!

Yani, fatura veya ne olursa olsun sunum dan modelini ayrı. Tüm model oluşturun. Daha sonra çıkış sunum (bu durumda PDF).

Ben nedeniyle "m sayfaları n" yazmaya ihtiyacı, * str_replace * yöntem çok uygun buldum. Her sayfası inşa ve nihayet $ pdf-> sayfalarında sayfa sayfa [$ i] sayfayı m şifre yerini ilk olarak normalde n sayıda yazdı.

Ben bir sütun bir sonraki sayfaya yayılan bu yüzden büyük olabilir, bir iki sütun düzeni, alarak bu sorunu içine koştu. Ben birbirlerinin üstüne hizalanmış böylece, geri ilk sütun olarak aynı Y pozisyonuna Y konumunu ayarlamak, aynı zamanda iki sütun büyük altında belgeyi devam etmek istedi.

Benim çözüm Sayfa Numarası ($pdf->PageNo()) ve Y pozisyon içeren belgenin "Dikey Pozisyonu", kayıt oldu ($pdf->GetY()).

İki farklı dikey konumları saklamak gerekir. İlk olarak, ikinci sütunu başlayacak nerede "başlangıç ​​noktası" saklayın. İkinci olarak, belgenin aşağı uzak olan "Büyük nokta" saklayın. Yalnız sayfa numarası veya Y değeri bakamıyorum çünkü büyük nokta zor oldu, hem de bakmak gerekir.

Bana yardım için bu üç yöntem yarattı.

This solution does not include X-position in the example.

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;
  }
}

Kullanımı oldukça basittir. Eğer değişken yükseklik sütunları çizmek önce başlangıç ​​pozisyonunu kapmak ve maksimum pozisyonu toplamaya başlamak gerekir.

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

Her hücre işleme sonra, aynı düzeyde başka bir hücreyi oluşturmadan önce, sonra tekrar başlangıç ​​pozisyonuna ayarlanmış uzak konumu (gerekirse), güncelleştirmek istiyorum.

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

Eğer sütunları render bitirdiğinizde, şimdiye kadar kaydedilmiş olan maksimum mesafe belgeyi ayarlayın.

$this->SetVerticalPosition( $furthestPos );

Şimdi sütunlar düzgün hizalanmış ve belge gösterici hemen uzak çizilmiş sütun sonra yer almaktadır.