Как заполнить pdf документ из данных формы?

Есть форма на сайте. Пользователь заполняет её. Эти данные, из формы, вносятся в pdf файл в определенные места. Например, есть сертификат, готовый, в котором поле с ФИО пустое, пользователь вводит свое ФИО в input на сайте, и это ФИО попадает на сертификат в нужное место.

Как взаимодействовать с pdf форматом с помощью, например, javascript, или есть ли какое нибудь API для редоктирования PDF или doc форматов?


Ответы (2 шт):

Автор решения: S.H.

Как я понял при помощи поиска, есть две стратегии:

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!

→ Ссылка
Автор решения: Vit

Я сейчас как раз пользуюсь 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 страницы), то тексты в странной кодировке.

→ Ссылка