PDF Декодированный Base64 PDF может быть открыт в chrome и браузерах, но не в Adobe - PullRequest
0 голосов
/ 03 мая 2020

У меня проблема с сгенерированным php файлом PDF. Генерация PDF работает очень хорошо. После того, как я сохранил файл на своем веб-сервере, я могу загрузить его и открыть его с помощью моего Ma c или с помощью браузеров, таких как Edge Chrome и Firefox. Только если я открою файл в Adobe Acrobat Reader, он не откроет файл.

Ошибка: при открытии этого файла произошла ошибка. Файл поврежден и не может быть восстановлен.

Я создал файл с javascript и небольшим php. В JS я использовал библиотеку pdfLib для создания файла PDF.

const existingPdfBytes = await fetch(url).then(res => res.arrayBuffer());
const pdfDoc = await PDFDocument.load(existingPdfBytes);
.
.
...changes in the pdf File...
.
.
const pdfBytes = await pdfDoc.save();
const dateOfToday = getDateofToday();
const dateTimeStamp = new Date().getTime();
const fileName = "Vertrag_von_" + dateOfToday + "_ID_" + dateTimeStamp + ".pdf";
sendWithAjax(pdfBytes, studio[4], answers["email"], fileName, answers["telenummer"]);

function sendWithAjax(pdfBytes, studioMail, customerMail , fileName, customerPhoneNumber) {

        pdfBytes = bytesToBase64(pdfBytes);
        if (window.XMLHttpRequest) {
            // AJAX nutzen mit IE7+, Chrome, Firefox, Safari, Opera
                xmlhttp=new XMLHttpRequest();
            }
        else {
            // AJAX mit IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }

        xmlhttp.open("POST", "sendContractEmail.php", true);
        var data = new FormData();
        data.append("byte", JSON.stringify(pdfBytes));
        data.append("studioMail", JSON.stringify(studioMail));
        data.append("customerMail", JSON.stringify(customerMail));
        data.append("fileName", JSON.stringify(fileName));
        data.append("customerPhoneNumber", JSON.stringify(customerPhoneNumber));
        xmlhttp.send(data);

    }

После создания файла PDF в JS я отправляю UInt8_Array и другую информацию с помощью ajax в мой php файл.

В php .файле я использовал следующий код для декодирования массива Uint8_Array в строку Base64 и сохранил его в файле на моем веб-сервере.

if(!empty($_POST['byte'])){
        $data = json_decode($_POST['byte']);
        $fileName = json_decode($_POST['fileName']);
        $studioMail = json_decode($_POST['studioMail']);
        $customerMail = json_decode($_POST['customerMail']);
        $customerPhoneNumber = json_decode($_POST['customerPhoneNumber']);

        if (!empty($data)) {

            // Detects if there is base64 encoding header in the string.
            // If so, it needs to be removed prior to saving the content to a phisical file.
            if (strpos($data, ',') !== false) {
                @list($encode, $data) = explode(',', $data);
            }

            $base64data = base64_decode($data, true);

            $pdf = fopen ('contractPDFs/'.$fileName ,'w');
            fwrite ($pdf,$base64data);
            fclose ($pdf);
        }

        echo "Contract saved";

        sendEMailToStudio($fileName, $studioMail, $customerMail, $customerPhoneNumber);
        sendEMailToCustomer($customerMail);

    } else {
        echo "No Data Sent";
    }

Может ли кто-нибудь помочь мне в моей проблеме и объяснить, почему я не могу открыть PDF-файл с помощью Adobe Acrobat Reader?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...