Установите документ TCPDF на БЕСКОНЕЧНУЮ высоту, чтобы имитировать печать на рулонной бумаге для этикеток. - PullRequest
0 голосов
/ 22 января 2020

Можно ли установить страницу в TCPDF, чтобы установить ее высоту на БЕСКОНЕЧНЫЙ? Мне нужно, чтобы он имитировал печать на роликовом принтере с наклейками шириной 62 мм, но высота может быть бесконечной, пока нет данных для печати ... так что ... нумерация страниц не требуется.

$pdf = new TCPDF('L', 'mm', array('62',$infiniteH), true, 'UTF-8', false);

Я не знаю, возможно ли установить $ infiniteH в значение, имитирующее мои потребности

ОБНОВЛЕНИЕ: или, возможно, метод для расчета необходимой высоты и обновления опции TCPDF?

1 Ответ

0 голосов
/ 25 января 2020

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

  1. Начать транзакцию.
  2. Добавить очень высокую страницу.
  3. Запустите рендеринг и рассчитайте необходимую высоту.
  4. Откатите транзакцию.
  5. Добавьте страницу правильного размера.
  6. Перезапустите рендеринг.

У меня есть пример кода идеи ниже. Я отключаю автоматический разрыв страницы c, чтобы предотвратить неожиданные разрывы страниц, но при этом для нижнего поля устанавливается значение 0, поэтому я добавил в функцию дополнительный параметр нижнего поля.

<?php
function add_roll_segment($pdf, $maxHeight, $render_callback, $extra_bottom_margin = 1) {
  $pdf->startTransaction();
  $pdf->addPage('P', [$pdf->getPageWidth(), $maxHeight]);
  $render_callback($pdf);
  $margins = $pdf->getMargins();
  $newheight = $pdf->GetY()  + $margins['bottom'] + $extra_bottom_margin;
  $pdf->rollbackTransaction(true);
  $pdf->addPage('P', [$pdf->getPageWidth(), $newheight]);
  $render_callback($pdf);
}


class TransactionRenderer {
  protected $details;

  public function __construct() {
    $this->details = [];
  }

  public function add_transaction_detail($item, $price) {
    $this->details[] = ['item' => $item, 'price' => intval($price)];
  }

  public function render($pdf) {
    $margins = $pdf->getMargins();
    $pdf->setFont('courier', 'B', 8);
    $pdf->SetLineStyle([
      'width' => 0.1,
      'dashed' => [0.5,0.2],
      'color' => [0,0,0,100],
    ]);
    $pdf->Cell(0,0,'Begin Transactions for '.date('Y-m-d H:i:s'),0,1);
    $pdf->SetY($pdf->GetY() + 0.6);
    $pdf->Line($margins['left'], $pdf->getY(), $pdf->getPageWidth() - $margins['right'], $pdf->getY());
    $pdf->SetY($pdf->GetY() + 0.6);
    foreach($this->details as $line) {
      $y = $pdf->getY();
      $pdf->Cell(0,0,$line['item'],0,1,'L');
      $pdf->setY($y);
      $pdf->Cell(0,0,sprintf('%d JPY', $line['price']),0,1,'R');
    }
  }
}

//Populate random data.
$pdf = new TCPDF('L', 'mm', array('62',100), true, 'UTF-8', false);
$renderer = new TransactionRenderer();
$words1 = ['Big', 'Fancy', 'Pretty', 'Cool', 'Awesome'];
$words2 = ['Pants', 'Panda Pot', 'Cup', 'Mug', 'Pie', 'Plate'];
$pdf->SetAutoPageBreak(false);
$count = rand(200, 400);
for($i = 0; $i < $count; $i++) {
  shuffle($words1);
  shuffle($words2);
  $renderer->add_transaction_detail("{$words1[0]} {$words2[0]}", rand(10,10000));
}
add_roll_segment($pdf,19000,array($renderer, 'render'), $pdf->getCellHeight(8));
$pdf->Output('test-59859076.pdf','I');

Редактировать: я пренебрег включить скриншот с результатом:

Screenshot of long pdf

...