загрузка изображения с помощью https.get в узле приводит к повреждению изображения при использовании в pdflatex - PullRequest
0 голосов
/ 13 июля 2020

Я установил сервер узла, который обрабатывает запросы на преобразование латекса в отрисованный PDF-файл с помощью PDFLateX. Если для документа требуются дополнительные ресурсы, например изображения, я сначала загружаю их, а затем запускаю процесс pdflatex. Если изображения загружаются с помощью клиента http.get и сохраняются с помощью fs.createWriteStream, они отображаются правильно в конечном файле.

Этот URL, например, работает нормально: изображение поверх https

Теперь, если я использую то же изображение, но через http: изображение через http , он повреждает файл, который включен в окончательный PDF-файл. Изображение будет сильно искажено, но отображается. Файл, записанный в файловую систему, правильный и не поврежден.

Код, загружающий файл, выглядит следующим образом:

const http = require('http');
const https = require('https');
const fs = require('fs-promise');

    /**
     * Downloads a single Asset
     *
     * @param url Url to an Image
     * @param dest Path where it will be saved
     * @returns {Promise}
     */
    function download (url, dest) {
        console.log('Downloading Asset from: ' + url + ' to ' + dest);
        return new Promise((resolve, reject) => {
            let file = fs.createWriteStream(dest);

            let link = new URL(url);
            let client = (link.protocol.includes('https')) ? https : http;

            client.get(url, function(response) {
                response.pipe(file);
                file.on('close', function () {
                    setTimeout(function () {
                        resolve();
                    },10)
                });
            }).on('error', function(err) {
                fs.unlink(dest);
                reject();
            });
        });
    }

Как видите, я даже пробовал тайм-аут чтобы отложить событие разрешения, на случай, если 'close' сработает немного раньше. Но это не помогает. Я запускаю процесс PdfLateX после того, как все процессы загрузки завершены, например, после того, как функция ниже разрешена.

/**
 * Downloads all needed Assets to /assets/
 *
 * @param assetUrls Array of Objects that contain urls and names
 * @returns {Promise}
 */
function downloadAssets(assetUrls){
    return new Promise((resolve,reject) => {
        let requests = [];
        if(assetUrls){
            assetUrls = JSON.parse(assetUrls);
            for(let asset of assetUrls){
                requests.push(download(asset.url, './assets/' + asset.name));
            }
        }
        Promise.all(requests)
          .catch((err) => {
              console.log(err);
              reject('Download of one or more assets failed!');
          })
          .then(() => {
              resolve();
          });
    })
}

Это выполняется с узлом 12.16.2 внутри Docker контейнера.

I попробовали несколько методов загрузки изображений, но каждый раз, когда изображение передается по https, оно оказывается поврежденным в окончательном PDF-файле, но не повреждается при просмотре идентификатора непосредственно в файловой системе.

Еще одна вещь, на которую следует обратить внимание: , что изображение всегда портится одинаково. Нет никаких изменений, конкретное изображение c, обслуживаемое через https, всегда будет ломаться таким же образом.

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

1 Ответ

0 голосов
/ 28 июля 2020

С этим разобрались. Проблема заключалась не в создании документа, а в том, как я передавал данные между службами. В какой-то момент у меня был фильтр, в котором необработанные текстовые данные должны анализироваться на наличие php переменных, начинающихся с $. По ошибке необработанные данные PDF прошли через этот фильтр и, таким образом, были повреждены. Я предполагаю, что только изображения, загруженные через https, содержат знаки $ в строке необработанных данных, поэтому повреждение появляется только при использовании https.

...