在pdflatex中使用时,在节点中使用https.get下载映像会产生损坏的映像



我已经设置了一个节点服务器,用于处理使用PDFLateX将latex转换为渲染pdf的请求。如果文档需要额外的资产,例如图像,我会先下载它们,然后启动pdflatex流程。如果图像是使用http.get客户端下载并使用fs.createWriteStream保存的,则它们会正确显示在最终文件中。

例如,此Url工作正常:https 上的图像

现在,如果我提供相同的图像,但通过http:image-over-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();
});
});
}

正如你所看到的,我甚至尝试了一个超时来延迟解析事件,以防"关闭"提前一点被触发。但这无济于事。我在所有下载过程完成后启动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();
});
})
}

这是在Docker Container中使用Node 12.16.2运行的。

我尝试了几种下载图像的方法,但每次通过https提供图像时,它都会在最终的Pdf中损坏,但当直接在文件系统中查看id时,它会完好无损。

还有一点需要注意,图像总是以同样的方式腐败。没有任何变化,通过https提供的特定图像总是以相同的方式中断。

任何可能导致这种情况的线索都将不胜感激,因为我在搜索网页时找不到任何解决方案。

这已经自行解决了。问题不在于文档的创建,而在于我如何在服务之间传递数据。有一点,我有一个过滤器,可以在其中解析以$开头的php变量的原始文本数据。由于错误,原始pdf数据通过了这个过滤器,因此被破坏了。我假设只有通过https下载的图像在原始数据字符串中包含$符号,因此只有在使用https时才会出现损坏。

最新更新