【问题标题】:Storing document element from jspdf in HTML5 webstorage在 HTML5 网络存储中存储来自 jspdf 的文档元素
【发布时间】:2019-06-20 10:59:39
【问题描述】:

是否可以将由 jspdf 创建的文档存储在 HTML5 网络存储中?我想保存它,这样我就可以继续从其他页面添加内容,直到用户按下下载按钮。下面的代码没有给我任何错误,但文档始终只包含最后一页。

let doc = new jsPDF('p', 'mm', 'a4');

const width = doc.internal.pageSize.getWidth();
const height = doc.internal.pageSize.getHeight();

window.sessionStorage.setItem('pdf', doc);

document.getElementById('report').onclick = function () {

    doc = window.sessionStorage.getItem('pdf');
    console.log(doc);

    html2canvas(document.getElementById('dataTable'), {
        onrendered: function (canvas) {
            var table = canvas.toDataURL("image/png");
            doc.addImage(table, 'JPEG', 0, 0, width, height);
            window.sessionStorage.setItem('pdf', doc);
        }
    });
}

document.getElementById('download').onclick = function () {
    doc = window.sessionStorage.getItem('pdf');

    doc.save('test.pdf');
}

是否可以将文档存储在商店中,或者我是否必须将其转换为字符串?

【问题讨论】:

标签: javascript html jspdf html2canvas


【解决方案1】:

如果有人感兴趣,这就是我解决它的方法。我将所有从 html2canvas 生成的图片作为 dataURL 保存在本地存储中。当我想创建我的 pdf 时,我会检索它们并将它们全部添加到页面中。这很好,因为我从来没有达到本地存储的限制。

Storage.prototype.setObject = function (key, value) {
    this.setItem(key, JSON.stringify(value));
}

Storage.prototype.getObject = function (key) {
    var value = this.getItem(key);
    return value && JSON.parse(value);
}

/*
* Save all pictures in local storage
*/
document.getElementById('report').onclick = function () {
    html2canvas(document.body, {
        onrendered: function (canvas) {
            const image = canvas.toDataURL("image/png");
            window.sessionStorage.setObject(new Date().getTime(), image);
        }
    });
}

document.getElementById('download').onclick = function () {
    // Create new document
    let doc = new jsPDF('p', 'mm', 'a4');

    const width = doc.internal.pageSize.getWidth();
    const height = doc.internal.pageSize.getHeight();

    // Get all images from local storage and add them to the pdf
    for (let key in sessionStorage) {
        if (!isNaN(key)) {
            const image = window.sessionStorage.getObject(key);
            doc.addImage(image, 'JPEG', 0, 0, width, height);
        }
    }

    // And download it
    doc.save('test.pdf');
}

【讨论】:

  • 该解决方案可能会很快崩溃,因为 localStorage/sessionStorage 只允许少量数据 (~5mb)。如果您需要“无论您需要多少”,您可能应该使用indexedDB
  • 我知道,它可以保存大约 12 页,在这种情况下就足够了。但你是对的,如果你想节省更多,你应该使用其他解决方案。
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多