«Ошибка подтверждения» Ошибка заполнения PDF с помощью minipdf. js - PullRequest
0 голосов
/ 22 апреля 2020

Я использую этот проект https://github.com/phihag/pdfform.js и получаю сообщение об ошибке "Ошибка подтверждения" при попытке создать PDF. Я посмотрел в исходный файл, и я действительно понятия не имею, что означает эта идея: (

Полный код ошибки:

pdfs:217 Error: Assertion failed
    at assert (minipdf.js?v=9:1)
    at Object.transform (pdfform.js?v=9:387)
    at fill (pdfs:207)
    at HTMLButtonElement.onclick (pdfs:1) "Error: Assertion failed
    at assert (/includes/js/minipdf.js?v=9:1:47861)
    at Object.transform (/includes/js/pdfform.js?v=9:387:2)
    at fill (/admin/pdfs:207:31)
    at HTMLButtonElement.onclick (/admin/pdfs:1:1)"

Код, который я использую. Загружает PDF в массив буферов а затем пытается создать новый PDF-файл и сохранить его.

function loadPDF(pdf)
{
    var url = pdf;

    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'arraybuffer';

    xhr.onload = function() {
        if (this.status == 200) {
            on_file(url.split(/\//).pop(), this.response);
        } else {
            on_error('failed to load URL (code: ' + this.status + ')');
        }
    };

    xhr.send();

    document.getElementById("fill-out-pdf").innerHTML = '<button type="button" class="btn btn-primary" onclick="fill();">Fill & Download</button>';
}

function on_file(filename, buf) {
    pdf_buf = buf;

    list(pdf_buf);
}

function make_pdfform() {
    var lib_name = 'minipdf';
    return pdfform((lib_name === 'minipdf') ? minipdf : minipdf_js);
}

function list(buf) {
    var list_form = document.querySelector('.list_form');
    empty(list_form);

    var cnt = 1;
    var field_specs;
    try {
        field_specs = make_pdfform().list_fields(buf);
    } catch (e) {
        on_error(e);
        return;
    }
    for (var field_key in field_specs) {
        var row = document.createElement('div');
        row.appendChild(document.createTextNode(field_key));
        list_form.appendChild(row);
        field_specs[field_key].forEach(function(spec, i) {
            if ((spec.type === 'radio') && spec.options) {
                var fieldset_el = document.createElement('fieldset');
                spec.options.forEach(function(ostr) {
                    var label = document.createElement('label');
                    var radio = document.createElement('input');
                    radio.setAttribute('type', 'radio');
                    radio.setAttribute('value', ostr);
                    radio.setAttribute('name', field_key + '_' + i);
                    radio.setAttribute('data-idx', i);
                    radio.setAttribute('data-key', field_key);
                    label.appendChild(radio);
                    label.appendChild(document.createTextNode(ostr));
                    fieldset_el.appendChild(label);
                });
                row.appendChild(fieldset_el);
                return;
            }

            var input = document.createElement((spec.type === 'select') ? 'select' : 'input');
            input.setAttribute('data-idx', i);
            input.setAttribute('data-key', field_key);
            if (spec.type === 'boolean') {
                input.setAttribute('type', 'checkbox');
            } else if (spec.type === 'string') {
                input.setAttribute('value', cnt++);
            } else if ((spec.type === 'select') && spec.options) {
                spec.options.forEach(function(ostr) {
                    var option_el = document.createElement('option');
                    option_el.appendChild(document.createTextNode(ostr));
                    option_el.setAttribute('value', ostr);
                    input.appendChild(option_el);
                });
            }
            row.appendChild(input);
        });
    }
}

function empty(node) {
    node.innerHTML = "";
}

function fill() {
    buf = pdf_buf;

    var list_form = document.querySelector('.list_form');
    var fields = {};
    list_form.querySelectorAll('input,select').forEach(function(input) {
        if ((input.getAttribute('type') === 'radio') && !input.checked) {
            return;
        }

        var key = input.getAttribute('data-key');
        if (!fields[key]) {
            fields[key] = [];
        }
        var index = parseInt(input.getAttribute('data-idx'), 10);
        var value = (input.getAttribute('type') === 'checkbox') ? input.checked : input.value;
        fields[key][index] = value;
    });

    var filled_pdf; // Uint8Array
    //var enc = new TextEncoder(); // always utf-8
    //console.log(enc.encode(pdf_buf));
    //console.log(enc.encode(fields));
    //return;
    try {
        filled_pdf = make_pdfform().transform(buf, fields);
    } catch (e) {
        return on_error(e);
    }

    var blob = new Blob([filled_pdf], {type: 'application/pdf'});
    saveAs(blob, 'pdfform.js_generated.pdf');
}

function on_error(e) {
    console.error(e, e.stack);  // eslint-disable-line no-console
    var div = document.createElement('div');
    div.appendChild(document.createTextNode(e.message));
    document.querySelector('.error').appendChild(div);
}

function makePDF()
{
    var out_buf = pdfform().transform(pdf_buf, fields);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...