Как сделать PDF из javascript
Иногда бывает необходимо сохранить в PDF, данные с HTML или какой-то результат вычислений js. Такой вариант вполне подойдет тем, кто не хочет лезть в изучение серверных технологий, позволяющих сделать тоже самое. Итак, описание способа ниже:
Чтобы сохранить данные в PDF с корректной поддержкой кириллицы, лучше использовать библиотеку pdfmake, которая:
- поддерживает кириллицу (при подключении шрифта);
 - легко работает с таблицами и JSON-данными;
 - не требует серверной части.
 
Подключение (через CDN)
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
Создадим HTML-таблицу с данными:
<table id="myTable78">
  <tr>
    <th>Имя</th>
    <th>Город</th>
  </tr>
  <tr>
    <td>Алексей</td>
    <td>Москва</td>
  </tr>
  <tr>
    <td>Ольга</td>
    <td>Санкт-Петербург</td>
  </tr>
</table>
| Имя | Город | 
|---|---|
| Алексей | Москва | 
| Ольга | Санкт-Петербург | 
Добавим кнопку
<button onclick="exportTableToPDF()">Сохранить в PDF</button>
<script>
  function exportTableToPDF() {
    const table = document.getElementById('myTable78');
    const body = [];
    for (let row of table.rows) {
      const rowData = [];
      for (let cell of row.cells) {
        rowData.push(cell.innerText);
      }
      body.push(rowData);
    }
    const docDefinition = {
      content: [
        { text: 'Таблица пользователей', style: 'header' },
        {
          table: {
            body: body
          }
        }
      ],
      styles: {
        header: {
          fontSize: 18,
          bold: true,
          margin: [0, 0, 0, 10]
        }
      },
      defaultStyle: {
        font: 'Roboto'
      }
    };
    pdfMake.createPdf(docDefinition).download("table.pdf");
  }
</script>
Тесты и проверки
Скачать пример 1
Скачать zip-архивДругой пример собираем PDF из данных JSON
Предположим у нас откуда-то приходят данные в формате JSON или они получаются в процессе обработки нашего скрипта. Для примера будет так, что как будто они у нас есть.
Создадим кнопку
<button onclick="generatePDFfromJSON()">Создать PDF из JSON</button>
Добавим JS
<script>
    const jsonData = [
      { name: "Алексей", city: "Москва", age: 32 },
      { name: "Ольга", city: "Санкт-Петербург", age: 28 },
      { name: "Иван", city: "Новосибирск", age: 45 }
    ];
    function generatePDFfromJSON() {
      const body = [
        ['Имя', 'Город', 'Возраст']
      ];
      jsonData.forEach(item => {
        body.push([item.name, item.city, item.age.toString()]);
      });
      const docDefinition = {
        content: [
          { text: 'Список пользователей из JSON', style: 'header' },
          {
            table: {
              headerRows: 1,
              body: body
            }
          }
        ],
        styles: {
          header: {
            fontSize: 18,
            bold: true,
            margin: [0, 0, 0, 10]
          }
        },
        defaultStyle: {
          font: 'Roboto'
        }
      };
      pdfMake.createPdf(docDefinition).download("users-from-json.pdf");
    }
  </script>
Скачать пример 2
Скачать zip-архив