TCPDF для вывода нескольких многостраничных PDF-файлов с помощью PHP / ajax / jquery / java /?

#php #ajax #for-loop #pdf-generation #tcpdf

Вопрос:

Я ищу помощи в том, как заставить это запустить скрипт, сохранить PDF-файл, перейти на следующую итерацию страницы, опубликовать и обновить страницу и запустить следующий цикл до конца.

Я не смог найти надежного способа сделать это для своего приложения. Я нашел несколько различных фрагментов кода в разных вариантах сценариев (в основном ajax), но ни один из стандартных не кажется подходящим. У меня слишком много переменных, которые находятся в игре.

Мои PDF-файлы выводятся просто отлично, и я в порядке со временем, которое на это уходит, но на каждый PDF-файл приходится более 1 миллиона кодов, и я перехожу границы памяти.

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

Примерно раз в год я пишу тяжелый код для новых внутренних проектов, поэтому мои навыки неоднозначны, но я быстро учусь. Мне просто каждый раз приходится переучиваться почти всему. Что затрудняет это.

Вот мой исходный код:

 if (isset($_POST["import"])) {
    
    $VARno = $_POST["VARno"];
    $rowId = $_POST["rowId"];
    $batchpages = 1000;
    $startpage = 1;
    $maxSheet = 12300;
    
    for ($s = 0; $s <= $rowId;   $s) {
        $startSheet = $startpage;
        $endSheet = $startpage   ($batchpages - 1);
        $loopCount = ceil(($maxSheet-$startpage) / $batchpages);

        if (isset($_POST["makeCodes" . $s])) {
            for ($l = 0; $l < $loopCount;   $l) {
                $skidNo = $_POST["skidNo_" . $s];
                
                $dateSet = date('m/d/Y H:i:s', time()-(7*60*60));

                $tableName = "VAR" . $VARno;
                $finalSkidNo = substr($VARno, -2) . str_pad($skidNo, 4, "0", STR_PAD_LEFT);

                $ptQuery = "SELECT PTvalue, sheetsPerSkid, codesPerSheet, Xstart, Ystart, QRsize, rotation, shellH, shellW, noAcross FROM mt_status WHERE MT = ?";
                $paramType = "s";
                $paramArray = array($VARno);
                $ptResult = $db->select($ptQuery, $paramType, $paramArray);

                foreach ($ptResult as $ptRow) {
                    $PTvalue = $ptRow['PTvalue'];
                    $lastPos = $ptRow['codesPerSheet'];
                    $lastSheet = $ptRow['sheetsPerSkid'];
                    $xStart = $ptRow['Xstart'];
                    $yStart = $ptRow['Ystart'];
                    $xShift = $ptRow['shellW'];
                    $yShift = $ptRow['shellH'];
                    $QRsize = $ptRow['QRsize'];
                    $QRrotate = $ptRow['rotation'];
                    $noAcross = $ptRow['noAcross'];
                    break;
                }

                $sqlSelect = "SELECT $tableName.id, sheetNo, posNo, URL FROM $tableName WHERE skidNo = ? AND sheetNo >= ? AND sheetNo <= ? ORDER BY $tableName.id";
                $paramType = "sss";
                $paramArray = array($skidNo, $startSheet, $endSheet);
                $result = $db->select($sqlSelect, $paramType, $paramArray);


                if ($endSheet > $lastSheet) {
                    $endSheet = $lastSheet;
                }

                // create new PDF document
                $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

                // set default header data
                $pdf->setPrintHeader(false);
                $pdf->setPrintFooter(false);

                // set margins
                $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
                $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
                $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

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

                // Add a page
                $pdf->AddPage('P', $page_format, false, false);

                $style = array(
                    'border' => 0,
                    'vpadding' => 0,
                    'hpadding' => 0,
                    'fgcolor' => array(0,0,0),
                    'bgcolor' => false,
                    'module_width' => 0.1, // width of a single module in points
                    'module_height' => 0.1 // height of a single module in points
                    );

                $x = $xStart;
                $y = $yStart;
                $p = 1;
                $r = 1;

                foreach($result as $row) {
                    $pdf->SetFont('helvetica', '', 5, '', true);
                    $VARTagH = 0.0945;
                    $VARTagW = 0.08;

                    if ($row['posNo'] == 1) {
                        $x = $xStart;
                        $y = $yStart;
                        $p = 1;
                        $r = 1;

                        if (substr($row['sheetNo'], -3) == 1) {
                            $pdf->Rect(0, 1, 0.25 , 1, 'F', false, array(0,0,0));
                        }

                        $pdf->StartTransform();
                        $pdf->Rotate($QRrotate, ($x   ($QRsize / 2)), ($y   ($QRsize / 2)));
                        $pdf->writeHTMLCell(($QRsize   $VARTagW), $VARTagH, ($x), ($y - $VARTagH), $VARno, 0, 1, 0, true, 'R', false);
                        $pdf->write2DBarcode($row['URL'], 'QRCODE,M', $x, $y, $QRsize, $QRsize, $style, 'T');
                        $pdf->StopTransform();
                        $x = $x   $xShift;
                          $p;
                    }
                    elseif ($row['posNo'] > 1 amp;amp; $row['posNo'] < $lastPos){
                        if ($p < $noAcross) {
                            $pdf->StartTransform();
                            $pdf->Rotate($QRrotate, ($x   ($QRsize / 2)), ($y   ($QRsize / 2)));
                            $pdf->writeHTMLCell(($QRsize   $VARTagW), $VARTagH, ($x), ($y - $VARTagH), $VARno, 0, 1, 0, true, 'R', false);
                            $pdf->write2DBarcode($row['URL'], 'QRCODE,M', $x, $y, $QRsize, $QRsize, $style, 'T');
                            $pdf->StopTransform();
                            $x = $x   $xShift;
                              $p;
                        }
                        elseif ($p == $noAcross) {
                            $pdf->StartTransform();
                            $pdf->Rotate($QRrotate, ($x   ($QRsize / 2)), ($y   ($QRsize / 2)));
                            $pdf->writeHTMLCell(($QRsize   $VARTagW), $VARTagH, ($x), ($y - $VARTagH), $VARno, 0, 1, 0, true, 'R', false);
                            $pdf->write2DBarcode($row['URL'], 'QRCODE,M', $x, $y, $QRsize, $QRsize, $style, 'T');
                            $pdf->StopTransform();
                            $x = $xStart;
                            $y = $y   $yShift;
                            $p = 1;
                              $r;
                        }
                    }
                    elseif ($row['posNo'] == $lastPos) {
                        $foottag = "VAR" . $VARno . " - Skid #" . $finalSkidNo . " - " . $dateSet . " - " . $row['sheetNo'] . " of " . $lastSheet . " - Verified by: ____________ Date: _____/_____/_________";
                        $pdf->StartTransform();
                        $pdf->Rotate($QRrotate, ($x   ($QRsize / 2)), ($y   ($QRsize / 2)));
                        $pdf->writeHTMLCell(($QRsize   $VARTagW), $VARTagH, ($x), ($y - $VARTagH), $VARno, 0, 1, 0, true, 'R', false);
                        $pdf->write2DBarcode($row['URL'], 'QRCODE,M', $x, $y, $QRsize, $QRsize, $style, 'T');
                        $pdf->StopTransform();
                        $pdf->SetFont('Courier', 'B', 10, '', true);
                        $pdf->writeHTMLCell(12.5, .25, 0.25, 18.5, $foottag, 0, 1, 0, true, 'R', false);
                        $x = $xStart;
                        $y = $yStart;
                        $p = 1;
                        $r = 1;
                        if ($row['sheetNo'] < $endSheet){
                            $pdf->AddPage('P', $page_format, false, false);
                        }
                    }
                }

                $save_here = "C:\MT" . $VARno . "\" . $VARno . "-" . $finalSkidNo . " - " . $startSheet . "-" . $endSheet . ".pdf";
                // Close and output PDF document
                // This method has several options, check the source code documentation for more information.
                $pdf->Output($save_here, 'F');
            
                $startSheet = $startSheet   $batchpages;
                $endSheet = $endSheet   $batchpages;
            }
            $type = "success";
            $message .= "All QR codes for " . $finalSkidNo . " created.</br>n";
            }
    }
}
 

Я уже запускал что-то подобное до того, как это было вызвано при загрузке страницы:

 function genproofs(id) {

    var itemid = id;
    var imgpath = '/path/'   itemid   '.jpg?rand='   Math.random();
    
    function updateimage(){
        var myImageElement = document.getElementById('cardproof');
        myImageElement.src = imgpath;
        $(".floater").show();
        $(".delay").hide();
    }
    
    function genJPG(){
        $.ajax({
            type: 'GET',
            cache: false,
            url: '/path/gen_jpg.php',
            data: { itemid : itemid },
            success: function() {
                setTimeout(updateimage, 500);
            }
        });
    }

    $.ajax({
        type: 'GET',
        cache: false,
        url: '/path/gen_pdf.php',
        data: { itemid : itemid },
        success: function(){
            setTimeout(genJPG, 1000);
        }
    });
}
 

Я думаю, что это близко. Я думаю, что в какой-то момент мне нужно будет вызвать ajax для запуска вместо встроенного цикла for и передать переменные итерации страницы таким образом. Сохранение каждого PDF-файла, затем возврат, обновление переменных и повторение до тех пор, пока i = x. Я просто не уверен, где / как вызвать ajax и как заставить его опубликовать обновление и повторно подключиться.

Это, вероятно, будет «да» решением, но я упираюсь в стену.