Как заполнить pdf документ из данных формы?
Есть форма на сайте. Пользователь заполняет её. Эти данные, из формы, вносятся в pdf файл в определенные места. Например, есть сертификат, готовый, в котором поле с ФИО пустое, пользователь вводит свое ФИО в input на сайте, и это ФИО попадает на сертификат в нужное место.
Как взаимодействовать с pdf форматом с помощью, например, javascript, или есть ли какое нибудь API для редоктирования PDF или doc форматов?
Ответы (2 шт):
Как я понял при помощи поиска, есть две стратегии:
1. Создание нового документа.
Вот в этом руководстве последовательно рассматриваются вопросы, начиная от подключения библиотеки, и заканчивая тем, как открывать сгенерированный документ в отдельном окне ajax'ом.
Вот эта статья на Хабре - довольно основательная, и на неё много ссылаются, но она уже старовата - это перевод 2008-го года.
Я мог бы скопировать код из этих руковоств в ответ, но, по моему, оригинальные статьи будут полезее.
2. Использование темплейта, в котором будут заполнены тоько некоторые поля
Это довольно несложный процесс, можно даже привести пример кода, котрый вписывает в документ фразу:
<?
$pdf = new FPDI();
$pdf->setSourceFile('template.pdf');
$tpl = $pdf->importPage(1);
$pdf->addPage();
$pdf->useTemplate($tpl); <- template is imported
$pdf->setXY(10, 20);
$pdf->write(100, "Hi there"); <- write or draw something on the template
$pdf->output('newpdf.pdf', 'D'); <- ready, save or output your pdf
?>
Вообще говоря, это просто пример кода с англоязычной части SO: "Is there a solution for pdf template in PHP?"
Также, если у Вас возникнут более конкретные вопросы - милости просим, или welcome!
Я сейчас как раз пользуюсь jsPDF, для генерации PDF из того, что есть на экране (той же заполненной формы). Но документ на выходе получается достаточно "кривой", не все css3-фичи эта библиотека берет (тени, еще некоторые эффекты). В итоге на экране вроде и симпатично и адаптивно, а в документе ну как первоклассник сверстал :)
Я пробовал несколько подходов, но в итоге самый работающий оказался через некоторый "костыль":
html2canvas(document.querySelector("#divMyQuestionnaire")).then(canvas => {
let imgData = canvas.toDataURL("image/jpeg", 1.0);
window.jsPDF = window.jspdf.jsPDF
let pdf = new jsPDF({
orientation: "landscape",
unit: "in"
});
pdf.addImage(imgData, 'JPEG', 0, 0, 11, 7.8, "MEDIUM");
pdf.save('Questionnaire_canvas.pdf')
});
То есть генерирую canvas, и уже его как картинку скармливаю генератору.
Классический вариант типа:
window.jsPDF = window.jspdf.jsPDF
let pdf = new jsPDF()
let el = document.getElementById("divMyQuestionnaire")
await pdf.html(el, {
callback: function(pdf) {
pdf.save('Questionnaire_jsPDF.pdf') }
})
отдавал то пустой документ (но на 2-3 страницы), то тексты в странной кодировке.