Я установил сервер узла, который обрабатывает запросы на преобразование латекса в отрисованный 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, всегда будет ломаться таким же образом.
Любая подсказка, что может вызвать это, будет очень признательна, поскольку я не мог найти никаких решений при поиске в Интернете .