pdfapi

Пачка документов

Счета за месяц, сертификаты участникам, договоры — когда документов сотни, важно не упереться в лимит частоты и не исчерпать квоту посреди пачки.

Проверка на доступность страниц#

Перед большой пачкой узнайте остаток, поможет запрос GET /v1/me. Если документов больше, чем страниц, пачка встанет с кодом ошибки 402.

python
me = client.me()
if me.pages_remaining < expected_pages:
    raise SystemExit(f"Осталось {me.pages_remaining} страниц, нужно {expected_pages}")

Отправляйте параллельно, но в пределах тарифа#

Лимит частоты действует на каждый ключ отдельно: на Premium это 10 запросов в секунду и до 30 подряд. Держите не больше нескольких запросов одновременно. 3–5 хватает, чтобы загрузить рендер и не получать код 429.

Python
import asyncio
from pdfapi import AsyncPdfApi, PdfApiError

async def main(documents: dict[str, str]) -> None:
    limit = asyncio.Semaphore(3)
    async with AsyncPdfApi() as client:
        async def render(name: str, html: str) -> None:
            async with limit:
                try:
                    pdf = await client.html(html)
                except PdfApiError as e:
                    print(f"{name}: {e.code} — {e.message}")
                    return
            pdf.save(name)

        await asyncio.gather(*(render(n, h) for n, h in documents.items()))

Обработайте каждую ошибку#

Ошибка одного документа не должна останавливать пачку. Записывайте, что не получилось, и повторяйте позже неудачные попытки. Библиотеки автоматически повторяют коды 429 и 503.

Один клиент на всю пачку#

Создавайте клиент один раз и переиспользуйте его. Он держит соединения открытыми, и каждый запрос не тратит время на новое подключение. Все библиотеки pdfapi безопасны и адаптированы для параллельного использования.