Я использую этот проект 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);
}