在我的项目中,我需要将 ReactQuill 的视图导出为图像。它应该尽可能像素完美。
该项目的后端服务器是php。
我仍然不确定该怎么做。这些是必需的步骤:
- 将 Quill 转换为 html
- 将html转换为图像
- 保存图片。
对于#1,我尝试在服务器上使用 DBlackborough\Quill,但它的样式未正确呈现。目前我在浏览器上使用 quill-delta-to-html
对于#2,在服务器上我尝试了 Spatie\Browsershot,它需要在服务器上安装 chrome,这可能会导致问题。所以目前我正在处理 html2canvas 和 dom-to-image,但两者都不能正确呈现样式。
例如,这个 Quill:
{"ops":[{"insert":"est"},{"attributes":{"align":"center"},"insert":"\n\n"},{"insert":"fdgdfgd"},{"attributes":{"align":"center"},"insert":"\n"},{"insert":"dfg"},{"attributes":{"align":"center"},"insert":"\n"},{"insert":"d"},{"attributes":{"align":"center"},"insert":"\n"},{"insert":"gdf"},{"attributes":{"align":"center"},"insert":"\n"},{"insert":"gd"},{"attributes":{"align":"center"},"insert":"\n"}]}
使用此代码:
let deltaOps = editor_ref.current.getEditor().getContents();
let content_str = JSON.stringify(deltaOps);
let cfg = {
inlineStyles: true
};
let converter = new QuillDeltaToHtmlConverter(deltaOps.ops, cfg);
let html = converter.convert();
转换为以下html:
<div id="my_template">
<p style="text-align:center">est</p>
<p style="text-align:center"><br></p>
<p style="text-align:center">fdgdfgd</p>
<p style="text-align:center">dfg</p>
<p style="text-align:center">d</p>
<p style="text-align:center">gdf</p>
<p style="text-align:center">gd</p>
</div>
这对我来说看起来不错。但是在渲染时,所有的文本对齐都被忽略了:
这是使用的 html 到画布。dom-to-image 有类似的结果。
let printdiv = document.createElement("div");
printdiv.innerHTML = `<div id='ticket_template'>${res.html}</div>`;
document.body.appendChild(printdiv);
html2canvas(document.getElementById("ticket_template"),{
width: 520,
})
.then((canvas) => {
let imgData = canvas.toDataURL('image/png');
});
更新
我对 Browsershot 的问题是这个错误:
[2021-12-08 15:00:07] local.ERROR: Uncaught Symfony\Component\Process\Exception\ProcessFailedException: The command "PATH=$PATH:/usr/local/bin:/opt/homebrew/bin NODE_PATH=`npm root -g` node '/var/www/html/vendor/spatie/browsershot/src/../bin/browser.js' '{"url":"file:\/\/\/tmp\/1529719988-0318315001638975179\/index.html","action":"screenshot","options":{"type":"png","path":"\/var\/www\/html\/storage\/app\/temp.png","args":["--no-sandbox"],"viewport":{"width":800,"height":600},"displayHeaderFooter":false}}'" failed.
Exit Code: 127(Command not found)
Working directory: /var/www/html/public
Output:
================
Error Output:
================
sh: 1: npm: not found
sh: 1: node: not found
Stack trace:
#0 /var/www/html/vendor/spatie/browsershot/src/Browsershot.php(533): Spatie\\Browsershot\\Browsershot->callBrowser(Array)
这个问题是因为服务器作为 www-data 运行,而 node 只为 root 用户安装
我检查了一下,Browsershot 生成的图像样式正确。但是,我仍然很想知道我是否可以在客户端进行转换。