Использование FPDI и FDP для генерации немного отличающихся файлов pdf

#php #templates #fpdf #fpdi

#php #шаблоны #fpdf #fpdi

Вопрос:

сначала я импортирую PDF с помощью fpdi для создания объекта fpdf, затем я выполняю несколько изменений в этом pdf. Я клонирую его, чтобы создать пользовательский PDF, просто добавляя некоторые тексты. Затем я вывожу два файла на диск, но создается только один, и я получил неустранимую ошибку для второго вывода :

Неустранимая ошибка: вызов неопределенного метода stdClass::CloseFile() в C:Program FilesEasyPHP 3.0wwwoursinoursinpublicscriptsFPDIfpdi.php в строке 534

фрагменты моего кода:

 $pdf = new FPDI('L','mm',array(291.6,456)); 
$fichier=$repertoireGrilles.'GR_IFR.pdf';   

$pdf->setSourceFile($fichier); 
// add a page 
$tplIdx = $pdf->importPage(1); 
$pdf->AddPage(); 
$pdf->useTemplate($tplIdx,0,0,0); 
.. 
... 
methods on $pdf 
.. 
.. 
.. 

$pdfCopie=clone $pdf; 

methods on $pdfCopie

$pdfCopie-> Output($repertoireGrilles.'grillesQuotidiennes/'.$date.'/Grille_'.$date.'_'.$ou.'_copie.pdf','F'); 
$pdf-> Output($repertoireGrilles.'grillesQuotidiennes/'.$date.'/Grille_'.$date.'_'.$ou.'.pdf','F'); 
  

Кто-нибудь может помочь мне решить эту проблему, которая держит мой мозг под высоким давлением в течение нескольких часов (дней) 🙂 ?

Комментарии:

1. при клонировании объекта не гарантируется создание двух полностью независимых объектов. Скорее всего, они оба все еще используют один и тот же FPDI. ТАКИМ образом, когда вы изменяете один из них, вы фактически изменяете оба, и закрытие одного из них также закрывает оба.

2. Я думаю, что в данном случае объекты разные, потому что, когда я комментирую ligne 534 в fpdi.php при запуске метода CloseFile генерируются два PDF-файла, которые отличаются друг от друга и настроены так, как я хочу. Но второй выдает ошибку (xobject не найден). я думаю, что я должен предотвратить выполнение действия между двумя выводами или, возможно, раньше, но я не нашел, какое именно. Спасибо answay за ваш комментарий

3. @MarcB Это не совсем так. Добавление текста к одному, а не к другому, будет сохранено при клонировании FPDI. Проблема возникает при их выводе.

4. Вы можете использовать разветвление, но это может быть сложно в зависимости от среды, в которой вы находитесь. Вы WAMP?

Ответ №1:

Клонирование, разветвление, копирование — все это действительно грязно. У вас будут очень трудные времена с выводами, если вы выберете этот маршрут. Вместо этого рассмотрите этот подход:

  1. Выполните несколько вызовов AJAX для одного PHP-файла, передайте ему pid значение, чтобы различать их.
  2. Выполните точно такую же настройку документа для FPDI. Это гораздо более последовательно, чем клонирование, разветвление, копирование и т.д.
  3. Проверьте pid и выполните разные действия с разными документами после завершения всех настроек.
  4. Вывод документов.

Вот мой jQuery:

 $(document).ready(function(){
    var i;
    for( i=0; i<=1; i   )
    {
        $.ajax({
            url:    'pdfpid.php',
            data:   {
                pid:    i,
                pdf:    'document.pdf'
            },
            type:   'post'
        });
    }
});
  

Как вы можете видеть, это довольно просто. pdfpid.php это имя файла, который будет генерировать и обрабатывать документы. В этом случае я хочу, чтобы документ с pid значением 0 был моим «оригиналом», а документ с pid значением 1 был «клонированным» документом.

 //  Ensure that POST came in correctly
if( !array_key_exists('pid',$_POST) || !array_key_exists('pdf',$_POST) )
    exit();

//  Populate necessary variables from $_POST
$pid    = intval($_POST['pid']);
$src    = $_POST['pdf'];

//  Setup the PDF document
$pdf = new FPDI();
$pdf->setSourceFile($src);
$templateID = $pdf->importPage(1);
$pdf->addPage();
$pdf->useTemplate($templateID);
$pdf->SetFont('Arial','B',24);

switch( $pid )
{
    default:
        break;
    case 0:
        //  "Parent" document
        $pdf->Text(10,10,"ORIGINAL");
        $filename = "original.pdf";
        break;
    case 1:
        //  "Child" document
        $pdf->Text(10,10,"CLONED");
        $filename = "cloned.pdf";
        break;
}

$pdf->Output($filename,'F');
  

Я получил оба документа в качестве выходных данных, со всеми уникальными изменениями между «родительским» и «дочерним».