Создайте несколько файлов PDF из FPDF

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

while ($data = mysql_fetch_row($query)) // under normal circumstances working properly
    {
        $clientid = $data['0'];
        if($clientid)
        {
            require("generatepdf.php"); //styles the pdf and is working properly
            $savepath = 'c:/ledgers/'.$cname.' Cash Ledger.pdf';
            $pdf->Output($savepath,'F');
            require("ledgeremail.php"); //runs query to get email address and emails the outputted file 
        }
    }

Вот суть моего кода генерации pdf, особенности генерации опущены.

<?php

require("includes/pdf/fpdf.php");


{

$pdf = new FPDF( );
$pdf->AddPage();
$pdf->SetFont('Arial','',16);

    //Run Query to get Ledger information for the $clientid variable
            //Pass information from query into the different variables throughout script



            //Print Document Title
            $pdf->Cell(0,10,$cname.' Petty Cash Ledger', 0,1,'L');
            //Print First Month Grouping
            $pdf->SetFont('Arial','',10);
            $pdf->Line($linestart,$pdf->GetY(),$lineend,$pdf->GetY());
            $pdf->Cell(10,5,$startmonth.", ".$startyear, 0,0,'L');
            $pdf->SetX(175);
            $pdf->SetFont('','B');
            $pdf->Cell(20,5,'Balance Forward: $'.$balforward, 0,1,'R');
            $pdf->SetFont('');
            //print group headers
            $pdf->SetTextColor(101,102,102);
            $pdf->Cell(30,5,'Date',0,0,'L');
            $pdf->SetX(30);
            $pdf->Cell(105,5,'Description', 0,0,'L');
            $pdf->SetX(135);
            $pdf->Cell(20,5,'Deposit', 0,0,'R');
            $pdf->SetX(155);
            $pdf->Cell(20,5,'Withdrawl', 0,0,'R');
            $pdf->SetX(175);
            $pdf->Cell(20,5,'Balance', 0,1,'R');
            $pdf->SetTextColor(0,0,0);
            $pdf->SetFillColor(255);

            while($ledger = mysql_fetch_row($ledgerqry))
            {
                if ($grey == 1) $pdf->SetFillColor(225);

                $currentmonth = date('F',strtotime($data[0]));
                if ($currentmonth != $startmonth)
                {
                    $pdf->SetFillColor(255);
                    $grey = 0;
                    $currentyear = date('Y',strtotime($data[0]));
                    //Print Month End Balance
                    $pdf->SetX(175);
                    $pdf->SetFont('','B');
                    $pdf->Cell(20,5,'Ending Balance: '.$runningbal, 0,1,'R',1);
                    $pdf->SetFont('');
                    $pdf->Line($linestart,$pdf->GetY()+2,$lineend,$pdf->GetY()+2);
                    //Print Month Grouping
                    $pdf->Cell(10,10,$currentmonth.", ".$currentyear, 0,0,'L');
                    $pdf->SetX(175);
                    $pdf->SetFont('','B');
                    $pdf->Cell(20,10,"Balance Forward: ".$runningbal, 0,1,'R');
                    $pdf->SetFont('');


                    //print group headers
                    $pdf->SetTextColor(101,102,102);
                    $pdf->Cell(30,5,'Date',0,0,'L');
                    $pdf->SetX(30);
                    $pdf->Cell(105,5,'Description', 0,0,'L');
                    $pdf->SetX(135);
                    $pdf->Cell(20,5,'Deposit', 0,0,'R');
                    $pdf->SetX(155);
                    $pdf->Cell(20,5,'Withdrawl', 0,0,'R');
                    $pdf->SetX(175);
                    $pdf->Cell(20,5,'Balance', 0,1,'R');
                    $pdf->SetTextColor(0,0,0);

                    $startmonth = $currentmonth;
                }

                //Create line Variables
                $tdate = date('m/d/Y',strtotime($ledger[0]));
                $tdescription = $ledger[2];
                if($ledger[3]==0)   $tdeposit = ""; else $tdeposit = "$".number_format($ledger[3], 2, '.', ',');
                if($ledger[4]==0)   $twithdrawl = ""; else $twithdrawl = "($".-1*number_format($ledger[4], 2, '.', ',').")";
                $runningbal = "$".number_format($balforward + $ledger[5], 2, '.', ',');

                $pdf->Cell(30,7,$tdate, 0,0,'L',1);
                $pdf->SetX(30);
                $pdf->Cell(105,7,$tdescription, 0,0,'L',1);
                $pdf->SetX(135);
                $pdf->Cell(20,7,$tdeposit, 0,0,'R',1);
                $pdf->SetX(155);
                $pdf->Cell(20,7,$twithdrawl, 0,0,'R',1);
                $pdf->SetX(175);
                $pdf->Cell(20,7,$runningbal, 0,1,'R',1);

                if ($grey == 1)
                {
                    $pdf->SetFillColor(255);
                    $grey = 0;
                }
                else $grey = 1;



            }
            //Create Final balance
            $pdf->SetFillColor(255);
            $pdf->SetX(175);
            $pdf->SetFont('','B');
            $pdf->Cell(20,5,'Ending Balance: '.$runningbal, 0,1,'R',1);
            $pdf->SetFont('');
        }                   
    }
}

?>

person Jared Meyering    schedule 13.02.2013    source источник
comment
Привет, Джаред Мейеринг. Ты решил проблему? пожалуйста, у вас есть весь код? Я хочу создать и отправить по электронной почте несколько PDF-файлов с помощью fdpdf.   -  person lexer    schedule 05.02.2021


Ответы (1)


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

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

require("generatepdf.php"); 
require("ledgeremail.php");

while ($data = mysql_fetch_row($query)) // under normal circumstances working properly
{
    $clientid = $data['0'];
    if($clientid)
    {
        $cname = generate_pdf_for_client( $clientid ); // calls a function in generatepdf.php
        $savepath = 'c:/ledgers/'.$cname.' Cash Ledger.pdf';
        $pdf->Output($savepath,'F');
        send_email_to_client(some appropriate parameters); // calls a function in ledgeremail.php
    }
}

Итак, в ваших файлах нужно реализовать логику предложенных функций generate_pdf_for_client и send_email_to_client.

person Ryan    schedule 13.02.2013
comment
Итак, я создал перечисленные здесь функции, однако, когда я их запускаю, они ничего не выводят, как раньше. Возможно, $pdf->Output($savepath,'F') на самом деле не знает, что выводить, когда экземпляр $pdf не создается в предыдущем коде? Когда я помещаю этот код внутрь функции, он все равно будет обрабатывать первую книгу, но не перейдет к следующим записям. Я начинаю думать, что это проблема с $pdf. Я пытался отключить экземпляр, прежде чем продолжить цикл, но все равно не повезло. - person Jared Meyering; 14.02.2013
comment
Не видя, что делает ваш генератор PDF, трудно сказать, что происходит. Суть предложения в ответе состоит в том, чтобы инкапсулировать функциональные обязанности каждой из задач. Вы могли бы потенциально вернуть объект PDF из вашего вызова generate_pdf, а не повторно использовать один экземпляр каждый раз. Кажется, это то, что вы делаете. - person Ryan; 14.02.2013
comment
Я добавил информацию о моем генераторе PDF, в основном это функции стиля класса fpdf. - person Jared Meyering; 14.02.2013
comment
Да, это так. Дома у меня появилась идея, которую я собираюсь протестировать, когда завтра вернусь на работу. Я просто попробую вывести два простых документа fpdf один за другим и посмотрю, проблема ли в самом fpdf или в моем коде... - person Jared Meyering; 14.02.2013
comment
Ценим ваши отзывы. В итоге я все переписал, работая над своими знаниями в области объектно-ориентированного программирования и инкапсулируя эти функции. Теперь это работает. - person Jared Meyering; 15.02.2013