В настоящее время я создаю pdf-файл из html внутри реагирующего компонента, используя jspdf и html2canvas.Это работает, но он может заблокировать браузер, когда есть много данных.Итак, я хочу делегировать эту задачу веб-работнику, чтобы он выполнял ее в фоновом режиме, а не блокировал браузер.
Вот как я делаю это без работник:
handleExportToPdf = () => {
const pages = Array.from(document.getElementsByClassName("client-report__container"));
Promise.all(pages.map(p => html2canvas(p, { logging: false }))).then(canvases => {
const pdf = new JsPDF({
orientation: "l",
unit: "in",
});
// tslint:disable-next-line:prefer-for-of
for (let i = 0; i < canvases.length; i++) {
if (i > 0) pdf.addPage();
pdf.addImage(canvases[i].toDataURL("image/png"), "PNG", 0.25, 0, 11, 8);
}
pdf.save("report.pdf");
});
};
Это изменено для использования веб-работника:
handleExportToPdf = () => {
const pages = Array.from(document.getElementsByClassName("client-report__container"));
this.reportWorker.postMessage(pages);
};
Тем не менее, я получаю эту ошибку, когда я пытаюсь запустить это:
Uncaught DOMException: Failed to execute 'postMessage' on 'Worker': HTMLDivElement object could not be cloned.
Это код вмой работник:
export default () => {
self.addEventListener("message", event => {
console.log("in worker");
const canvases = event.data;
const pdf = new JsPDF({
orientation: "l",
unit: "in",
});
// tslint:disable-next-line:prefer-for-of
for (let i = 0; i < canvases.length; i++) {
if (i > 0) pdf.addPage();
pdf.addImage(canvases[i].toDataURL("image/png"), "PNG", 0.25, 0, 11, 8);
}
pdf.save("report.pdf");
});
};
Есть ли способ передачи HTML-элементов веб-работнику?Или лучший способ сделать это?Я пытался просто перенести холсты, но это тоже не сработало.Получена та же ошибка (HtmlCanvasElement).