Изменить формат страницы после записи HTML - PullRequest
0 голосов
/ 06 ноября 2018

enter image description here

Я генерирую страницу, используя writeHTML под TCPDF. Моя страница состоит из 3 блоков (верх, середина, низ). Я поворачиваю верхнюю на 180, а среднюю на 90. Конечная страница должна быть в формате A4.

Работает нормально (как вы можете видеть на снимке) за исключением небольшой детали: при повороте средней части на 90 ° это означает, что ДО поворота высота этой части выше высоты пейзажа А4.

Единственный способ, которым я нашел правильное отображение даже со средним блоком большой высоты (до поворота), - это выполнить поворот с помощью страницы A3 Portrait. Как на картинке.

Итак, 2 вопроса:

  • Есть идеи по другому поводу?

  • Если нет другого варианта, можно ли сгенерировать PDF в книжной форме A3 (используя WriteHTML) и ПОСЛЕ, обрезать страницу, чтобы сохранить (вывести) только верхнюю часть страницы, чтобы получить А4 пейзаж? (используя TCPDF, а не «вручную»)

Для тех, кто интересуется: поскольку у меня есть динамические данные, мне нужно каждый раз искать центр вращения и перевод, который я должен применить к блоку багажника, так как он поднимается против среднего блока после вращения. Для этого я добавляю тег «tcpdf method» в свой HTML-шаблон, выполняю writeHTML, который вызывает функции GetX, GetY и сохраняет координаты. для вращения, а также относительное положение среднего и нижнего блока (для перевода нижнего блока) Затем я "откат", установить координаты в шаблоне и выполнить второй writeHTML.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Даже если ответ EPB очень интересный и в некоторых случаях работает, в моем случае результат был одинаковым. Итак, я нашел другой способ сделать. Это на самом деле не «чистый ответ», а хороший трюк. Я создаю свою страницу в A3 Portrait и поворачиваю данные, чтобы получить все данные в верхней части. Затем я использую инструмент «pdfposter», который я вызываю из PHP, чтобы разделить портретный PDF формата A3 на два формата A4. Итак, после writeHTML () я делаю:

  $path_a3 = __DIR__ . '/../tmp/a3.pdf';
  $path_a4 = __DIR__ . '/../tmp/a4.pdf';
  $pdf->Output($path_a3, 'F');

  $pdfposter = "pdfposter -m a4 -p 2x1a4 ".$path_a3." ".$path_a4;
  exec($pdfposter,$retArr, $retVal);

После этого у меня есть a4.pdf с двумя страницами формата А4.

Обратите внимание только на одну деталь: страница, созданная с помощью TCPDF с повернутыми данными, НЕ совместима с pdfposter 0.6! Вы должны установить версию 07.post1 (последняя из Git).

0 голосов
/ 08 ноября 2018

Дай угадаю. Если он длиннее, страница разрывается, и она поворачивает только то содержимое, которое уместилось на странице, а также, возможно, отбрасывает значения, которые вы ожидали для GetX и GetY?

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

$pdf->SetAutoPageBreak(FALSE, 0);

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


Редактировать: Однако я был неправ, как отмечалось в комментарии, что GetY вернет координату за пределами страницы. Это не так.

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

Вы можете сделать это с транзакциями или с AddPage и DeletePage.

Я тестировал с AddPage и DeletePage.

//.....
$pdf = new TCPDF_HELPER('L', 'pt',
array(8*72,5*72), true, 'UTF-8', false);

// set auto page breaks
$pdf->SetAutoPageBreak(FALSE, 0);

// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
$pdf->setFontSubsetting(true);

$fontname = TCPDF_FONTS::addTTFfont(dirname(__FILE__).'/playtime.ttf', 'TrueTypeUnicode', '', 96);
$pdf->setFont($fontname, '', 16);

//I'm using a points and a ridiculous 19 inch by 19 inch custom size.
//We'll use this one to get the proper offset with `GetY`
$pdf->AddPage('L', array(19*72, 19*72));

$pdf->SetXY(1, 45);
$pdf->setFillColor(255,255,230);

$column = <<<EOT
<p>WHITE APPLE COUNTRY HORSE STABLE BATTERY PIG SHEEP KANE CICI LOLIPOP</p>
<p>WHITE APPLE COUNTRY HORSE STABLE BATTERY PIG SHEEP KANE CICI LOLIPOP</p>
<p>WHITE APPLE COUNTRY HORSE STABLE BATTERY PIG SHEEP KANE CICI LOLIPOP ioj</p>
<p>WHITE APPLE COUNTRY HORSE STABLE BATTERY PIG SHEEP KANE CICI LOLIPOP ioj</p>
EOT;

//Get our multicell's final offset.
$pdf->WriteHTMLCell(80, '', '', 40, $column, 1, 2, 1, false, 'J', true);
$stopposition = $pdf->GetY();

//Now that we have our needed coordinates,
//Add a new page in our desired format.
$pdf->AddPage('L', array(8*72,5*72));
$pdf->StartTransform();
$pdf->Rotate(90, 40, 70);
$pdf->WriteHTMLCell(80, '', '', 40, $column, 1, 0, 1, true, 'J', true);
$pdf->StopTransform();

$pdf->SetX(20);
$pdf->SetY(-20);
$pdf->Write('', "End of column, pre-rotation: $stopposition pt");

//Delete our larger calculation page.
$pdf->DeletePage(1);
//.....

Example with coordinate calculation.

...