gpt4 book ai didi

javascript - Puppeteer 屏幕截图缺少/不可见文本

转载 作者:行者123 更新时间:2023-11-28 02:18:58 28 4
gpt4 key购买 nike

我正在使用 puppeteer 从浏览器发送到 express 应用程序的标记和 CSS 中保存和下载图像。 Express 编译模板,只需将 POSTed 标记插入 html shell 并在本地获取 css(安装在 docker 卷上)。

当我直接在 chrome 中呈现 html 和 css 时,所有文本和其他元素都按预期显示。但是,保存的屏幕截图缺少文本。

当我省略我们的样式时,文本在本地 chrome 和 puppeteer 保存的图像中呈现相同的方式。

幕后是否设置了样式?还有其他原因可以解释这种差异吗?

编辑: 现在看来,它可能与我代码中某处未处理的竞争条件有关。在不进行任何更改的情况下,我能够获得预期的图像,但只是有时,而且我还无法弄清那些时间的不同之处。

重现步骤

  • puppeteer 版本:0.12.0
  • 平台/操作系统版本:docker/ubuntu
  • Node.js 版本:8

index.js:

app.post('/img', function (req, res) {
const puppeteer = require('puppeteer');
let css = [];
let stylesheets = [];
//
// separate out local stylesheets and read contents of the files
//
css = req.body.stylesheets.filter(sheet => {
return sheet.indexOf('https') === -1 && sheet.indexOf('http') === -1;
});
css = css.map(sheet => {
return fs.readFileSync(path.join(__dirname, sheet));
});
//
// separate out external stylesheets (bootstrap, etc)
//
stylesheets = req.body.stylesheets.filter(sheet => {
return sheet.indexOf('https') > -1 || sheet.indexOf('http') > -1;
});
//
// compile template with html & styles
//
app.render('img', {
stylesheets: stylesheets,
content: req.body.content,
css: css
}, function (err, html) {
console.log('html\n', html);
(async() => {
const browser = await puppeteer.launch({args: ['--no-sandbox']});
const page = await browser.newPage();
await page.setViewport({width: 1300, height: 1200});
//
// load html to chrome
//
try {
const loaded = page.waitForNavigation({
waitUntil: 'load'
});
await page.setContent(html);
await loaded
} catch(err) {
console.log(err);
res.status(err.status).send('There was an error loading the page.');
}
//
// save image
//
const filename = `${req.body.title}.png`;
const filepath = path.join(__dirname, 'img', filename);
try {
await page.screenshot({ path: filepath });
console.log(`${filename} saved`);
} catch(err) {
console.log(err);
res.status(err.status).send('There was a problem saving the image.');
}
res.status(201).send(filename);
})();
});
});

img.html(模板):

<!DOCTYPE html>
<html>
<head>
<title>{{title}}</title>
{{#stylesheets}}
<link rel="stylesheet" type="text/css" href="{{{.}}}">
{{/stylesheets}}
{{#css}}
<style type="text/css">
{{{.}}}
</style>
{{/css}}
</head>
<body>
{{{content}}}
</body>
</html>

预计

没有本地样式: chrome without styles

具有本地样式: chrome with styles

实际

没有本地样式是符合预期的。

具有本地样式: puppeteer, with styles

最佳答案

您的 docker 镜像可能没有必要的字体。有很多开源图像(我在这里维护一个:https://github.com/joelgriffith/browserless)试图缓解像这样的常见问题。

这主要是因为基本图像没有合适的字体。

关于javascript - Puppeteer 屏幕截图缺少/不可见文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48324728/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com