webshot 不在 html 内渲染本地图像
webshot does not render local images inside html
我正在使用 node-webshot 和 phantomjs-cli 将 html 字符串呈现为 png 图像。
html 包含图像标签。当 src 属性指向本地文件且未引发错误时,不会呈现图像。但是,当 src 指向 http 位置时,它会渲染图像。我已经尝试了所有我能想到的不同文件路径组合,例如
<img src=images/mushrooms.png"/>
<img src=images//mushrooms.png"/>
<img src=c:\images\mushrooms.png"/>
<img src=c:\images\mushrooms.png"/>
<img src=file://c:\images\mushrooms.png"/>
<img src=file://images//mushrooms.png"/>
etc..
但到目前为止运气不好。有趣的是,它在我同事的 Mac 机器上运行良好,但在我的 Windows 机器上却不行,我已经尝试了两台不同的 Windows 机器,但没有成功。
下面是一些针对该问题的简化代码:
'use strict'
const webshot = require('webshot');
console.log('generating');
webshot('<html><head></head><body><img src="c:\images\mushrooms.png"/></body></html>', 'output.png', {siteType: 'html'}, function(err) {
console.log(err);
});
/*
webshot('<html><head></head><body><img src="https://s10.postimg.org/pr6zy8249/mushrooms.png"/></body></html>', 'output.png', {siteType: 'html'}, function(err) {
console.log(err);
});
*/
注释掉的代码块是它使用网络 link 作为图像源的示例,但我需要它在本地路径之外工作。
有没有人遇到过这个问题并知道如何解决?
谢谢
我认为你需要设置静态文件夹。
在你的代码中使用类似这样的东西app.use(express.static(path.join(__dirname, 'public')));
了解更多 here。
应该可以通过 file:
URI 方案访问本地文件:
<img src="file:///C:/images/mushrooms.png">
根据 specification:
A file URL takes the form:
file://<host>/<path>
可能是因为你从不打开引号。
尝试:
<img src="images/mushrooms.png"/>
可能是一个 phantomjs
问题,我之前遇到过 运行 错误,但到目前为止他们几乎没有维护该项目。您应该考虑切换到 Headless Chrome,这是由 Chromium 团队官方维护的新版本。
编辑:这是一个例子
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setContent('<html><head></head><body><img src="c:\images\mushrooms.png"/></body></html>');
await page.screenshot({path: 'output.png'});
await browser.close();
})();
我正在使用 node-webshot 和 phantomjs-cli 将 html 字符串呈现为 png 图像。 html 包含图像标签。当 src 属性指向本地文件且未引发错误时,不会呈现图像。但是,当 src 指向 http 位置时,它会渲染图像。我已经尝试了所有我能想到的不同文件路径组合,例如
<img src=images/mushrooms.png"/>
<img src=images//mushrooms.png"/>
<img src=c:\images\mushrooms.png"/>
<img src=c:\images\mushrooms.png"/>
<img src=file://c:\images\mushrooms.png"/>
<img src=file://images//mushrooms.png"/>
etc..
但到目前为止运气不好。有趣的是,它在我同事的 Mac 机器上运行良好,但在我的 Windows 机器上却不行,我已经尝试了两台不同的 Windows 机器,但没有成功。
下面是一些针对该问题的简化代码:
'use strict'
const webshot = require('webshot');
console.log('generating');
webshot('<html><head></head><body><img src="c:\images\mushrooms.png"/></body></html>', 'output.png', {siteType: 'html'}, function(err) {
console.log(err);
});
/*
webshot('<html><head></head><body><img src="https://s10.postimg.org/pr6zy8249/mushrooms.png"/></body></html>', 'output.png', {siteType: 'html'}, function(err) {
console.log(err);
});
*/
注释掉的代码块是它使用网络 link 作为图像源的示例,但我需要它在本地路径之外工作。
有没有人遇到过这个问题并知道如何解决?
谢谢
我认为你需要设置静态文件夹。
在你的代码中使用类似这样的东西app.use(express.static(path.join(__dirname, 'public')));
了解更多 here。
应该可以通过 file:
URI 方案访问本地文件:
<img src="file:///C:/images/mushrooms.png">
根据 specification:
A file URL takes the form:
file://<host>/<path>
可能是因为你从不打开引号。 尝试:
<img src="images/mushrooms.png"/>
可能是一个 phantomjs
问题,我之前遇到过 运行 错误,但到目前为止他们几乎没有维护该项目。您应该考虑切换到 Headless Chrome,这是由 Chromium 团队官方维护的新版本。
编辑:这是一个例子
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setContent('<html><head></head><body><img src="c:\images\mushrooms.png"/></body></html>');
await page.screenshot({path: 'output.png'});
await browser.close();
})();