Как открыть вывод TCPDF в новом окне при использовании AJAX - PullRequest
1 голос
/ 25 апреля 2020

Таким образом, я видел, что у других на inte rnet были подобные проблемы, но решения на самом деле не работают для меня. Также я видел, что эти проблемы были опубликованы как минимум 4 года go, так что, возможно, некоторые вещи изменились. Просто я пытаюсь написать PDF с использованием TCPDF и открыть этот PDF в новом окне. Подвох использует AJAX, так как, очевидно, массив, который я отправил на сервер, не отправляется в разделе success скрипта, и в результате полученный pdf не получил соответствующие данные:

$(document).on("click", "#create_qr_codes_pdf", function(ev) {
        ev.preventDefault();
        var qr_array = [];

        for (var i = 0; i < $("#qrcode_top img").length; i++) {
            qr_array.push($('#code' +i+' img').attr('src'));
        }

        $.ajax({            
            url: 'server/qr_id_create.php?create_qr_codes_pdf',
            type: 'POST',
            data: {qr_array: qr_array},
            success: function(data) { 
                window.open("C:/xampp/htdocs/*/server/qr_codes.pdf");
            }
        });
    });

Итак, как вы можете видеть, я попытался извлечь pdf с сервера и открыть его в новой вкладке, но, по-видимому, не разрешено открывать локальный ресурс.

Это код php, используемый для создания pdf документ:

if (isset($_GET['create_qr_codes_pdf'])) {
    //ob_start();
    if (isset($_POST['qr_array'])) {
        $qr_images = $_POST['qr_array'];

        require_once 'tcpdf/tcpdf.php';
        //require_once('tcpdf/include/tcpdf_static.php');
        require_once 'tcpdf/config/tcpdf_config.php'; 
        $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
        $pdf->SetCreator(PDF_CREATOR);
        $pdf->SetAuthor('name');
        $pdf->SetTitle('file');
        $pdf->SetSubject('TCPDF Tutorial');
        $pdf->SetKeywords('TCPDF, PDF, example, test, guide');
        $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
        $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
        $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
        $pdf->SetMargins(PDF_MARGIN_LEFT, 35, PDF_MARGIN_RIGHT);
        $pdf->SetAutoPageBreak(TRUE, 35);
        $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
        if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
            require_once(dirname(__FILE__).'/lang/eng.php');
            $pdf->setLanguageArray($l);
        }
        $pdf->setFontSubsetting(true);
        $pdf->SetFont('helvetica', '', 9, '', true);

        $pdf->AddPage();

        foreach ($qr_images as $img) {
            $img = preg_replace('/^[^,]*,\s*/', '', $img);
            $img = base64_decode($img);
            $pdf->Image('@'.$img);
            $pdf->AddPage();
        }
        ob_end_clean();
        $pdf->Output('qr_codes.pdf', 'F');
        return true;
    } else {

    }
}

Я пробовал варианты $pdf->Output('qr_codes.pdf', 'F'); //I, F, D. В идеале я хотел бы использовать опцию I для открытия в браузере, но это не работает вообще. Если я запускаю скрипт, ничего не происходит. Есть идеи?

1 Ответ

0 голосов
/ 26 апреля 2020

В 2014 году Timclutton нашел решение с функцией php file_get_contents.

Я протестировал его с вашим кодом ajax. Я просто добавил пробел между изображениями, и это сработало:

<?php

if (isset($_GET['create_qr_codes_pdf'])) {

    if (isset($_POST['qr_array'])) {

        $qr_images = $_POST['qr_array'];

        require_once('../TCPDF-master/tcpdf.php');

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

        $pdf->AddPage();

        foreach ($qr_images as $img) {

            $img = file_get_contents($img);
            $pdf->Image('@'.$img);
            $position = $pdf->GetY();
            $pdf->SetY($position+50);
        }

        $pdf->Output('your\absolute\local\path\qr_codes.pdf', 'F');
        return true;
    }
}

Из URI данных я получаю файл PDF с изображениями, который открывается в новом окне.

...