Проблема с размером импортированного шаблона PDF с FPDI + TCPDF - PullRequest
7 голосов
/ 13 июля 2011

Я застрял в очень сложной ситуации. Я работаю над PHP веб-приложений для поздравительной открытки.

Для этого я использую некоторые инструменты Linux, а также TCPDF и FPDI. Позвольте рассказать, как все это работает:

имеется 4-х страничный шаблон поздравительной открытки в формате PDF. это нестандартный размер 5x7 дюймов 300dpi PDF-файл. Я также добавил нестандартный размер в TCPDF

case 'STANDARD_CARD'       : {$pf = array(1500.00,2100.00);break;}

что я делаю, я использую:

pdftk templateX.pdf burst output  page_%2d.pdf 

для разделения каждой страницы храма.

сейчас я использую:

$pdf = new FPDI($cardDetails['ORIENTATION'],"mm",$cardDetails['SIZE']);      


  //set source file for 
    $pdf->setSourceFile($pdfFile);
    $templateIndex = $pdf->importPage(1);
    $pdf->AddPage($cardDetails['ORIENTATION'],$cardDetails['SIZE']);
    $pdf->useTemplate($templateIndex,0,0);

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

$pdf->output("file_name.pdf","F");

оригинальный файл PDF (только 1-я страница): (5x7 дюймов) Оригинальный PDF-файл Модифицированный PDF и некоторые операции с PDF: (29x20 дюймов) измененный PDF

теперь вывод, который я получаю, не 5x7 pdf, это файл размером 29 x 20 дюймов, который также разрушает мои вычисления и PDF.

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

Ответы [ 3 ]

22 голосов
/ 01 октября 2013

Привет Равиш,

Я также столкнулся с этой проблемой. На самом деле мой сценарий таков. У меня есть оригинальный файл размером Legal (8,5 x 14 мм) . Когда я отображаю его, используя вывод FPDI, как вы это сделали, он отображает только размер буквы (8,5 мм x 11 мм) . В результате получается: CROPPED PDF-файл.

Я сделал несколько поисковиков и нашел несколько ответов из разных постов. Вот самое подходящее решение, которое я нашел.

Сначала приведем следующий фрагмент кода функции: useTemplate

$this->useTemplate($templateIndex, null, null, 0, 0, true);

Обычно некоторые разработчики устанавливают это как ИСТИНА для последнего аргумента. Да, это правильно, если вы не установите ширину и длину. Однако я хотел бы подчеркнуть, что 4-й и 5-й аргументы определяют ширину и длину импортируемого PDF. Поэтому, если вы примете или получите фактический размер импортируемого документа, установите последний аргумент на FALSE , так как это скажет, что он примет фактический или конкретный заданный вами размер.

Пожалуйста, возьмите этот пример кода, который я сделал:

$pdf = new FPDI();
$pdf -> setSourceFile('birform2316.pdf');
$tplIdx = $pdf -> importPage(1);
$size = $pdf->getTemplateSize($tplIdx);
$pdf -> AddPage();
$pdf ->useTemplate($tplIdx, null, null, $size['w'], 310, FALSE);
$pdf -> SetFont('Arial');
$pdf -> SetTextColor(0, 0, 0);
$pdf -> SetXY(18, 174);
$pdf -> Write(0, $employer_address);
$pdf -> Output('myOwn.pdf', 'D');

С этим кодом я создал новый PDF БЕЗ ОБРЕЗКИ импортированного файла, который я установил. Это означает, что все детали шаблона ( исходный файл ) были отображены.

Обратите также внимание, что я что-то заметил при настройке размера моего PDF:

Во-первых, исходная ширина моего файла - 215,6 мм, а длина - 350,9 мм. Теперь, когда я устанавливаю размер моего PDF с помощью функций getTemplateSize и useTemplate , таких как:

$size = $pdf->getTemplateSize($tplIdx);
$pdf ->useTemplate($tplIdx, null, null, $size['w'], $size['h'],FALSE);

или просто:

$pdf ->useTemplate($tplIdx, null, null, 215.6, 350.9,FALSE);

В результате мой новый PDF-файл имеет вид CROPPED внизу, и я не знаю почему.

С этим наблюдением я сделал несколько тестов, чтобы выяснить причину. И в результате получается, что при создании файла PDF с использованием FPDI существует ограничение длины . Как вы можете видеть в моем коде выше, я не использовал фактическую длину моего файла. Вместо того чтобы использовать 350,9 мм, которые могут быть получены из $size[h'], я не использовал его, поскольку он даст обрезанный файл. Я просто передал числовое значение рядом с ним и фактическую ширину, чтобы получить желаемый результат.

$pdf->useTemplate($tplIdx, null, null, $size['w'], 310, false);

Кстати, 310 мм (длина) - это наибольшее числовое значение, которое я использовал для создания нового PDF-файла, который НЕ ОБРЕЗАН .

Надеюсь, я предоставил некоторые материалы всем разработчикам, использующим FPDI, который сталкивается с проблемой результатов CROPPED PDF.

Спасибо всем ...

Леви Палмер

10 голосов
/ 05 июня 2012

Вместо

$pdf->useTemplate($templateIndex,0,0);

используйте

$this->useTemplate($templateIndex, null, null, 0, 0, true);

Последний аргумент $adjustPageSize по умолчанию установлен в значение false.

3 голосов
/ 17 мая 2018

У меня была такая же проблема. Мой pdf был обрезан справа, а снизу FDPI добавляло место. Я обнаружил, что мой pdf имел ширину = 215 и высоту = 279, в то время как FPDI каждый раз экспортировал 210x297.

useTemplate Функция может масштабировать ваш PDF-файл до определенного размера, но вывод все равно останется 210x297. Поэтому я оставил useTemplate со значениями по умолчанию и «AdjustPageSize» = true:

$pdf->useTemplate($templateId, 0, 0, 0, 0, true);

Что необходимо изменить, это выходные размеры, чтобы соответствовать оригинальному размеру:

$templateSize = $pdf->getTemplateSize($templateId);
$pdf->AddPage('', [$templateSize['w'], $templateSize['h']]);

Если вы собираетесь загружать pdf с альбомной ориентацией, вы должны установить ориентацию:

$templateSize = $pdf->getTemplateSize($templateId);
$orientation = $templateSize['w'] > $templateSize['h'] ? 'L' : 'P';
$pdf->AddPage($orientation, [$templateSize['w'], $templateSize['h']]);
...