Pupeteer с очень большим PDF, не дожидаясь загрузки - PullRequest
1 голос
/ 20 июня 2020

Проблема: Pupeteer генерирует PDF-файл, когда там только около 5% моих данных.

Я использую кукловод, чтобы передать около 3000 строк текста на руль HTML шаблон Я затем пытаюсь использовать кукловод для печати PDF-файла. Если бы это работало сегодня раньше, но фиаско Git заставило меня откатиться назад, и теперь я не могу создать PDF-файл длиной более 3,5 страниц (ранее на этой неделе было около 90).

Я думаю это связано со следующим:

const browser = await puppeteer.launch({
        args: ['--no-sandbox'],
        headless: true
    });

    var page = await browser.newPage();

    await page.goto(`data:text/html;charset=UTF-8,${html}`, {
        waitUntil:'load'. <------ (i've also tried networkidle0 and networkidle2)
    });


    await page.pdf(options);
    await browser.close()

Вот шаблон. html

<!DOCTYPE html>
<html>

<head>
    <title>PDF</title>

    <head>
        <style type="text/css">

        </style>
        <meta charset="utf-8">
    </head>

<body>
    <ul id="script">
        {{#each this}}
        <li class={{category}}>{{text}}</li>
        {{/each}}

    </ul>
</body>

</html>

Мои данные представляют собой массив из 3300 объектов, и я знаю, что он попадает туда, куда нужно . Есть ли способ установить время ожидания c для Puppeteer? Я понимаю, что это много данных, но я что-то делаю здесь не так?

1 Ответ

1 голос
/ 20 июня 2020

Параметр waitUntil:'load' goto является параметром по умолчанию, вам не нужно его устанавливать, в то время как параметры networkidle0 и networkidle2 ждут завершения сетевых подключений: поскольку у вас нет ни одного из них поскольку это обычная разметка HTML, она не помогает ждать, пока она заполнится желаемыми данными. Я бы посоветовал вам использовать domcontentloaded, если вы хотите использовать waitUntil. Вы можете проверить, каковы точные различия между ними, в docs .

I.) Ваша проблема может быть решена с помощью тайм-аута stati c, он называется page.waitFor. Если вы уверены, что все данные будут в формате pdf за определенное время, вы можете установить время ожидания c, например, 3000 миллисекунд (3 секунды) до создания pdf.

await page.waitFor(3000);
await page.pdf(options);

II.) Если вы можете получить доступ к самому последнему значению text каждого объекта, вы также можете дождаться появления содержимого. Но это будет работать, только если у вас есть уникальный контент для каждого объекта. <li> элемент.

const veryLastItemText = options[options.length - 1].text // if "options" is an array with "category" and "text" property names inside

await page.waitForXPath(`//li[contains(text(), "${veryLastItemText}")]`);
await page.pdf(options);
...