Как генерировать PDF в Playwright

Как создавать PDF-файлы в Playwright

В Playwright можно создавать PDF-файлы из веб-страниц. Это открывает интересные сценарии автоматизации таких задач, как архивирование, генерация счетов, написание гайдов, книг и т. д.

В статье мы познакомимся с этой функциональностью и узнаем, как настраивать создаваемый PDF.

Содержание:

Создание файла

После загрузки страницы используем команду page.pdf(), чтобы преобразовать страницу в PDF.

const { chromium } = require('playwright')

;(async () => {
  const browser = await chromium.launch()
  const page = await browser.newPage()
  await page.goto('https://checklyhq.com/learn/headless')
  await page.pdf({ path: 'checkly.pdf' })
  await browser.close()
})()

Обратите внимание, что нам нужно передать параметр path, чтобы PDF-файл сохранился на диске.

⚠️ В настоящее время эта функция поддерживается только в headless-Chromium в Playwright.

ПОДПИШИТЕСЬ НА НАШ ТЕЛЕГРАМ КАНАЛ Автоматизация тестирования

Настройка создания

Нужно быстро просмотреть официальную документацию по page.pdf() от Playwright, поскольку почти наверняка понадобится изменить вид созданной PDF-страницы.

В некоторых случаях веб-страница может выглядеть значительно иначе в PDF-файле, по сравнению с браузером. В зависимости от конкретного случая можно поэкспериментировать со следующими вариантами:

  1. Может понадобиться установить опцию printBackground в true, если в сгенерированном PDF отсутствуют графические компоненты.
  2. По умолчанию функция page.pdf() генерирует PDF с откорректированными для печати цветами. Установка CSS-свойства -webkit-print-color-adjust: exact заставит отображать оригинальные цвета.
  3. Вызов page.emulateMedia('screen') изменяет тип CSS медиа на странице.
  4. Для оптимального отображения страницы может потребоваться установить соответствующие значения width и height или format.

Мы также можем добавлять на страницы кастомные верхние и нижние колонтитулы, отображающие заголовок, номер страницы и другое. Посмотрим, как это выглядит на сайте:

const { chromium } = require('playwright')
const fs = require('fs')

;(async () => {
  const browser = await chromium.launch()
  const page = await browser.newPage()

  const navigationPromise = page.waitForNavigation()

  const templateHeader = fs.readFileSync('template-header.html', 'utf-8')
  const templateFooter = fs.readFileSync('template-footer.html', 'utf-8')

  await page.goto('https://checklyhq.com/learn/headless')

  await navigationPromise

  await page.pdf({
    path: 'checkly.pdf',
    displayHeaderFooter: true,
    headerTemplate: templateHeader,
    footerTemplate: templateFooter,
    margin: {
      top: '100px',
      bottom: '40px'
    },
    printBackground: true
  })

  await browser.close()
})()

Мы включаем следующие файлы шаблонов для верхнего и нижнего колонтитулов.

template-header.html:

<html>
  <head>
    <style type="text/css">
      #header {
        padding: 0;
      }
      .content {
        width: 100%;
        background-color: #777;
        color: white;
        padding: 5px;
        -webkit-print-color-adjust: exact;
        vertical-align: middle;
        font-size: 15px;
        margin-top: 0;
        display: inline-block;
      }
      .title {
        font-weight: bold;
      }
      .date {
        text-align:right;
      }
    </style>
  </head>
  <body>
    <div class="content">
        <span class="title"></span> -
        <span class="date"></span>
        <span class="url"></div>
    </div>
  </body>
</html>

template-footer.html:

<html>
  <head>
    <style type="text/css">
      #footer {
        padding: 0;
      }
      .content-footer {
        width: 100%;
        background-color: #777;
        color: white;
        padding: 5px;
        -webkit-print-color-adjust: exact;
        vertical-align: middle;
        font-size: 15px;
        margin-top: 0;
        display: inline-block;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div class="content-footer">
      Page <span class="pageNumber"></span> of <span class="totalPages"></span>
    </div>
  </body>
</html>

Первая страница созданного PDF-файла выглядит следующим образом:

Выполните приведенные выше примеры следующим образом:

node generate-pdf.js

Дополнительные соображения

Мы можем удобно преобразовать веб-страницы в PDF, как это показано в примере выше. Еще более интересный вариант использования – создание совершенно нового документа, используя навыки работы с HTML и CSS, что зачастую избавляет от необходимости использовать LaTeX или аналогичные инструменты.

Перевод статьи «How to Generate PDFs with Playwright».

🔥 Какой была ваша первая зарплата в QA и как вы искали первую работу? 

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Читать в телеграм

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *