Mar*_*tin 7 google-chrome azure azure-cloud-services azure-functions google-chrome-headless
我正在尝试使用Headless Chrome从复杂的HTML文件(包含图像,SVG等)生成PDF文件。我可以在Cloud Service(Windows)上使用wkhtmltopdf.exe生成简单的PDF文件,但是我确实需要Chrome生成尽可能接近HTML + SVG + Image的PDF。
我希望能够在Azure Cloud Service或Azure Functions中运行Headless Chrome,但无法使其正常工作。我想这是由于对GDI的限制。我可以在自己的计算机上的Azure仿真器中运行我的代码和无头Chrome,但是一旦部署,将无法正常工作。
下面是我当前在Azure Functions(适用于Windows)中运行的代码。我正在使用Puppeteer拍摄example.com的屏幕截图。如果我能使它正常工作,我想生成PDF将变得容易。
const fs = require('fs');
const path = require('path');
const puppeteer = require('puppeteer');
const os = require('os');
module.exports = function (context, req) {
function failureCallback(error) {
context.log("--> Failure = '" + error + "'");
}
const chromeDir = path.normalize(__dirname + "/../node_modules/puppeteer/.local-chromium/win64-508693/chrome-win32/chrome.exe");
context.log("--> Chrome Path = " + chromeDir);
const dir = path.join(os.tmpdir(), '/screenshots');
if (!fs.existsSync(dir)){
fs.mkdirSync(dir);
}
const screenshotPath = path.join(dir, "example.png");
context.log("--> Path = " + screenshotPath);
let browser, page;
puppeteer.launch({ executablePath: chromeDir, headless: true, args: [ '--no-sandbox', '--single-process', '--disable-gpu' ] })
.then(b => {
context.log("----> 1");
browser = b;
return browser.newPage();
}, failureCallback)
.then(p => {
context.log("----> 2");
page = p;
return p.goto('https://www.example.com');
}, failureCallback)
.then(response => {
context.log("----> 3");
return page.screenshot({path: screenshotPath, fullPage: true});
}, failureCallback)
.then(r => {
browser.close();
context.res = {
body: "Done!"
};
context.done();
}, failureCallback);
};
Run Code Online (Sandbox Code Playgroud)
下面是尝试执行脚本时的日志。
2017-12-18T04:32:05 Welcome, you are now connected to log-streaming service.
2017-12-18T04:33:05 No new trace in the past 1 min(s).
2017-12-18T04:33:11.400 Function started (Id=89b31468-8a5d-43cd-832f-b641216dffc0)
2017-12-18T04:33:20.578 JavaScript HTTP trigger function processed a request.
2017-12-18T04:33:20.578 --> Chrome Path D:\home\site\wwwroot\node_modules\puppeteer\.local-chromium\win64-508693\chrome-win32\chrome.exe
2017-12-18T04:33:20.578 --> Path = D:\local\Temp\screenshots\example.png
2017-12-18T04:33:20.965 --> Failure = 'Error: spawn UNKNOWN'
2017-12-18T04:33:20.965 ----> 2
Run Code Online (Sandbox Code Playgroud)
错误“ Failure ='Error:spawn UNKNOWN'”尚不清楚。我使用Kudu和PowerShell确保我使用的路径正确。
我正在寻找一种在Azure Cloud Service和/或Azure Functions上运行Chrome的方法(对于Windows-为了使用我现有的App Service计划)。是否有人尝试在Azure中运行Headless Chrome?我愿意接受任何可以帮助我使此脚本正常工作的想法吗?
我建议使用https://www.browserless.io/,这样您就不必在应用服务中运行 chrome.exe。
用 puppeteer.connect 替换 puppeteer.launch
const browser = await puppeteer.connect({
browserWSEndpoint: 'wss://chrome.browserless.io/'
});
Run Code Online (Sandbox Code Playgroud)
我不确定 Headless Chrome 的使用情况,但由于某些 GDI 限制,Azure Functions 运行的沙箱在从 HTML 生成 PDF 时存在问题。
考虑在 Linux 上的 Azure Functions中尝试您的任务。虽然这仍处于预览阶段,但它不使用沙箱,因此如果您可以使用 headless chrome 来处理它,那么您在 PDF 生成方面可能会更幸运。
归档时间: |
|
查看次数: |
4543 次 |
最近记录: |