fpdf-возврат к предыдущей странице



Я создаю PDF-счет с помощью fpdf.



Некоторые счета-фактуры, содержащие много элементов, и детали должны перейти на вторую страницу. Однако мне нужно, чтобы общая сумма и другие детали были показаны на первой странице.



Прямо сейчас, если я могу добавить новую страницу, как это:
$pdf - >AddPage ();



Но это помещает все на вторую страницу, независимо от того, что после этого утверждения.



Похоже, что нет способа указать страницу для методов записи или ячейки.



Рендеринг, а вычисления немного сложны, поэтому не нужно хранить во временном массиве и отображать после полного рендеринга первой страницы.



Спасибо.

747   8  

8 ответов:

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

Я добавил этот код в класс fpdf в _putpages () прямо под / Page content line 2851

Пример после добавления выше в код:

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

Это может быть строка или массив.

У меня была очень похожая проблема, и я пошел дальше и просто добавил функцию в класс:

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

Это делает буквально то, что вы ожидаете. Но, когда вы пытаетесь вернуться к следующей странице, вам нужно либо установить ее явно, либо добавить в функцию Cell (). Вот где он добавляет страницу:

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

Это проверяет AcceptPageBreak и, очевидно, является ли высота страницы меньше, чем там, где мы окажемся, если останемся на странице. Что я сделал, так это добавил условное здесь, чтобы проверить посмотреть, нет ли внизу еще одной страницы. Если это было, вместо того, чтобы добавить новую страницу, Я пошел вперед и просто установил свой Y на мое поле и использовал вышеупомянутую функцию, чтобы посетить эту страницу. Как таковой:

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

Если вам неудобно возиться с FPDF, это может быть не для вас, но мое понимание после решения этой проблемы было на самом деле, что сценарий был очень легко ориентирован и оставил много места для простых улучшений. Обратите внимание, что вместо проверки выше для другой страницы, вы можете также добавьте переменную, которую вы можете вызвать, которая временно сообщит скрипту, что вместо добавления страницы вы просто переходите к следующей.

FPDF не позволяет вернуться на предыдущую страницу. Как только вы закончите со страницей - либо вызвав AddPage (), либо исчерпав пространство, когда SetAutoPageBreak() включен, - вы закончите с ней.

Обходной путь состоит в том, чтобы сгенерировать документ без итога, записать его во временный файл, а затем загрузить обратно (используя FPDI: http://www.setasign.de/products/pdf-php-solutions/fpdi/) и сложить сумму в нужном месте.

Здесь есть несколько умных решений, но я не рекомендую этот трюк, потому что он идет вразрез с базовой моделью FPDF и рано или поздно, вероятно, вызовет другие проблемы в будущем.

Программирование и так достаточно сложное!

Итак, отделите модель счета-фактуры или что бы это ни было от презентации. Постройте всю модель целиком. Затем выведите презентацию (в данном случае PDF).

Я нашел очень подходящий метод *str_replace*, из-за необходимости писать "n из m страниц". Сначала я написал число n нормально, так как я построил каждую страницу и, наконец, заменил шифр m в $pdf->pages[$i] страница за страницей.

Я столкнулся с этой проблемой, имея макет из двух столбцов, где один столбец может быть настолько большим, что он будет охватывать следующую страницу. Я хотел вернуть позицию Y в ту же позицию Y, что и первый столбец, чтобы они были выровнены по верху друг друга, но также продолжить документ под самым большим из двух столбцов.

Мое решение состояло в том, чтобы записать "вертикальное положение" документа, которое включает номер страницы ($pdf->PageNo()) и положение Y ($pdf->GetY()).

Вам нужно храните два различных вертикальных положения. Во-первых, запомните "начальную точку", с которой вы начнете свой второй столбец. Во-вторых, сохраните "самую большую точку", которая находится дальше всего вниз по документу. Самый большой пункт был сложным, потому что вы не можете смотреть только на номер страницы или значение Y, вы должны смотреть на оба.

Я создал эти три метода, чтобы помочь себе.

это решение не включает X-позицию в Примере.

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

Использование довольно простой. Перед тем, как нарисовать столбцы переменной высоты, вам нужно захватить начальную позицию и начать собирать максимальную позицию.

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

После визуализации каждой ячейки, перед визуализацией другой ячейки на том же уровне, вы хотите обновить самую дальнюю позицию (если это необходимо), а затем вернуться в исходное положение.

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

Когда вы закончите отрисовку столбцов, установите в документе максимальное расстояние, которое вы записали до сих пор.

$this->SetVerticalPosition( $furthestPos );

Теперь ваши колонки правильно выровнены, и указатель документа расположен сразу после самого дальнего нарисованного столбца.

У меня была та же проблема, и я преодолел несколько методов класса FPDF и смог исправить ее довольно простым способом. Для того, чтобы перейти назад и вперед страницы, вам просто нужно изменить атрибут страницы объекта FPDF. Однако, как только вы вернетесь на страницу, переходя к следующей странице, вы в конечном итоге добавите новую страницу вместо того, чтобы перейти к уже существующей. Чтобы решить эту проблему, я создал логическое выражение add_new_page и использовал его в своем переписанном accept_page_break метод, чтобы увидеть, нужно ли создавать новую страницу или переходить к уже существующей.

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

Просто простой "хак", но данные должны быть упорядочены по номеру страницы (не очень сложно^ ^)

Поместите в свой" цикл for " размещение данных что-то вроде:

// 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();
}

И вы закончили ! Нет необходимости изменять FPDF: D

Comments

    Ничего не найдено.