我目前在生成表时遇到了一个支持uniCode的jsPDF问题,为了跳过这个问题,我使用了浏览器打印功能,只需创建一个带有表的新html并将其显示为弹出窗口,然后调用popup_window.print()
,如下所示:
//exporter.ts
const temp = document.createElement("div");
temp.innerHTML = tableHtml(
tableHead,
tableBody,
fileName
);
const popup_window: any = window.open(location.origin, fileName, "x=y");
popup_window.document.write(temp.innerHTML);
setTimeout(() => {
popup_window.print();
popup_window.close();
}, 1000);
//tableHtml.ts
const tableHtml = (
headers: string[],
records: GeneralOBJ[],
title: string,
direction = "rtl"
) => `<!DOCTYPE html>
<html>
<body>
<main id="main" style="direction: ${direction};">
<h1>${title}</h1>
<div class="app_table">
<table class="table">
<thead>
<tr>
${headers
.map(header => "<th class='col' dir='auto'>" + header + "</th>")
.join("")}
</tr>
</thead>
<tbody>
${records
.map(
record =>
"<tr>" +
Object.values(record)
.map(td => "<td dir='auto'>" + td + "</td>")
.join("") +
"</tr>"
)
.join("")}
</tbody>
</table>
</div>
</main>
</body>
</html>`;
它运行得很好,但正如您所知,这里可能会出现像xss
这样的安全问题。所以,我想用vue来生成这个html的peice,然后把它添加为temp.innerHTML
,你知道怎么做吗?
让它尝试工作的一种方法可能是创建一个包含弹出内容的组件,然后在弹出html窗口上创建另一个Vue实例,并在那里安装组件。也许您可以在这里了解如何以编程方式创建组件实例的CSS技巧。
如果我是这样的话,我会先找到一个最简单的解决方法。如果问题是unicode支持,我会找到一个替代库。检查这个关于pdf生成中unicode的另一个SO线程。