Как передать изображение из запроса в pdfkit в node.js?
Во-первых, я новичок и в Javascript, и в Node.js, так что извините, если мой вопрос глупый.
Я пытаюсь соскрести текст и изображения с веб-сайта и экспортировать их в PDF-файл, используя request, cheerio и pdfkit, но у меня проблемы.
Я могу очистить изображения и сохранить их локально, используя это:
var $ = cheerio.load(body);
$("#mediatab1 img").each(function(){
var image= 'http://WWW.WEBSITE.no' + $(this).attr('src');
images.push(image);
});
for(var i = 0; i < images.length; i++){
request(images[i]).pipe(fs.createWriteStream('images/' + i + '.jpg')); }
НО! Вот проблема:
1. НАМЕРЕНИЕ: Когда я пытаюсь записать файлы в PDF, используя
doc.image('images/0.jpg');
все, что я получаю, это
Error: Unknown image format.
at Function.PDFImage.open (C:\nodejs\node_modules\pdfkit\js\im
age.js:41:15)
at PDFDocument.module.exports.image (C:\nodejs\node_modules\pd
fkit\js\mixins\images.js:27:26)
at Request._callback (C:\nodejs\prosjekt.js:29:6)
at Request.self.callback (C:\nodejs\node_modules\request\reque
st.js:344:22)
at Request.emit (events.js:98:17)
at Request.<anonymous> (C:\nodejs\node_modules\request\request
.js:1239:14)
at Request.emit (events.js:117:20)
at IncomingMessage.<anonymous> (C:\nodejs\node_modules\request
\request.js:1187:12)
at IncomingMessage.emit (events.js:117:20)
at _stream_readable.js:944:16
0.jpg равен 0 байтам, поэтому я подозреваю, что здесь есть проблема синхронизации?
2. НАМЕРЕНИЕ
Я попытался использовать.pipe вместо локального сохранения:
request(images[i]).pipe(doc.image(images[0]));
Но все, что я получаю, это:
"Error: ENOENT, no such file or directory 'C:\nodejs\http:\www.WEBSITE.no\Common\Tools\ImageScaler.ashx?id=c7d73548-8198-4bd1-867d-33fc0dfe73d1&h=4
13'
Есть идеи, как это исправить или решить проблему другим способом?
Вот весь сценарий:
var request = require('request'),
cheerio = require('cheerio'),
PDFDocument = require('pdfkit'),
doc = new PDFDocument,
fs = require('fs'),
prompt = require('prompt');
bilder = [];
prompt.start();
prompt.get(['prosjekturl'], function (err, result) {
request({url: 'http://www.WEBSITE.no/no/Prosjekter/Prosjekt/?pid=' + result.prosjekturl, encoding:null}, function(err, resp, body){
if(!err && resp.statusCode == 200){
// console.log(body);
var $ = cheerio.load(body);
$("#mediatab1 img").each(function(){
var bilde = 'http://www.WEBSITE.no' + $(this).attr('src');
bilder.push(bilde);
});
console.log(bilder);
for(var i = 0; i < bilder.length; i++){
request(bilder[i]).pipe(fs.createWriteStream('images/' + i + '.jpg'));
}
$("#MiddleRightContainer h1").each(function(){
var tittel = $(this).text();
console.log(tittel);
doc.pipe(fs.createWriteStream('pdf/output.pdf'));
doc.font('fonts/FONT-Regular.ttf');
doc.fontSize(32);
doc.text(tittel);
});
$("#MiddleRightContainer .user-content p").each(function(){
var tekst = $(this).text();
console.log(tekst);
doc.pipe(fs.createWriteStream('pdf/output.pdf'));
doc.fontSize(12);
doc.text(tekst);
});
$("#RightSidebar div.box2").each(function(){
var fakta = $(this).text();
console.log(fakta);
});
}
doc.end();
});
});
2 ответа
Из документов:
"PDFKit поддерживает форматы JPEG и PNG"
Здесь вы можете увидеть, как он проверяет расширения.jpeg и.png. Ваш файл.jpg. У меня были проблемы с этим несколько раз, и это исправило мою проблему.
Когда дело доходит до загрузки файла, я подозреваю, что пути Windows могут быть проблемой. Попробуйте использовать встроенное разрешение пути node.js: https://nodejs.org/api/path.html
Когда дело доходит до запроса и загрузки изображений, оно не должно превышать:
request({
url: url,
// Prevents Request from converting response to string
encoding: null
}, function (err, response, body) {
doc.image(body)
})
Надеюсь, это поможет некоторым.