我用puppeteer和adm-zip批量生成pdf,但是当它把生成的pdf插入zip文件时,它返回错误
这是我的代码。
`router.get('/:database/:tipo/:ids/:limite?. zip',async(req,res)=> { const { database,tipo,ids,limite } = req.params;
let idsArray;
if (ids === "ids") {
const pool = new Pool({
user: process.env.POSTGRES_USER,
host: process.env.POSTGRES_HOST,
database: database,
password: process.env.POSTGRES_PASSWORD,
port: process.env.POSTGRES_PORT,
});
let query = `SELECT id FROM controle_interno.${tipo} ORDER BY id ASC`;
if (limite) {
query += ` LIMIT ${limite}`;
}
const result = await pool.query(query);
idsArray = result.rows.map(row => row.id);
} else {
idsArray = ids.split(",");
}
const zip = new AdmZip();
const browser = await puppeteer.launch({
args: ['--disable-gpu', '--disable-software-rasterizer', '--disable-dev-shm-usage', '--disable-setuid-sandbox', '--no-sandbox']
});
const page = await browser.newPage();
for (let i = 0; i < idsArray.length; i++) {
const id = idsArray[i];
const url = `http://${IP}:${port}/${database}/${tipo}/${id}`;
console.log(url);
try {
await page.goto(url, {waitUntil: 'networkidle0'});
await page.evaluate(() => {
const button = document.getElementById('gerar-pdf');
button.remove();
});
const pdf = await page.pdf({ format: 'A4', printBackground: true, pageRanges: '1' });
zip.addFile(`${id}.pdf`, pdf, `PDF para o ID ${id}`);
} catch (err) {
console.error(err.stack);
}
}
await browser.close();
const zipBuffer = zip.toBuffer();
res.set({
'Content-Type': 'application/zip',
'Content-Disposition': `attachment; filename=${tipo}.zip`,
'Content-Length': zipBuffer.length
});
res.send(zipBuffer);
});
router = router;”
我从一个视图中提取数据并插入ejs文件,我已经尝试了其他视图,它没有返回这个错误,只有一个特定的视图,也许它可能是视图的数据?当我单独生成每一个时,它不会返回任何错误,只有当它是批量生成时才会返回错误。
我还没有尝试任何替代方法,我只是想查看视图并更改数据,但在我的视图中没有可以纠正的错误数据...
1条答案
按热度按时间i2loujxw1#
我发现了这个错误,一些由puppeteer生成的pdf具有非常高的图像分辨率,导致pdf的大小在10到30MB之间,我做了一个测试,只生成了200个,它返回了1.1GB的数据。我改变了图像的分辨率,并再次进行了批量生成,我设法生成了所有图像,压缩文件大小为787MB。