Предварительные требования
- Python 3.8+ и библиотека
requests(pip install requests). - Ключ API: создайте бесплатную учетную запись и скопируйте ключ из панели управления. Рекомендуется хранить его в переменной окружения, а не в коде:
export PDF_SUMMARIZE_KEY="sk_live_..."
Ваша первая сводка PDF на Python
- Установите requests
pip install requests. - Установите ключ APIВ переменной окружения
PDF_SUMMARIZE_KEY. - Отправьте PDFКак multipart/form-data с именем поля
file. - Прочитайте JSONСама сводка находится в поле
summary; также проверьтеsuccessи статус HTTP.
import os
import requests
API_URL = "https://pdf-summarize.com/api/summarize.php"
API_KEY = os.environ["PDF_SUMMARIZE_KEY"]
def summarize_pdf(path, length="medium", fmt="bullets", lang="auto"):
with open(path, "rb") as f:
resp = requests.post(
API_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
files={"file": (os.path.basename(path), f, "application/pdf")},
data={"length": length, "format": fmt, "outputLang": lang, "includeKeywords": "1"},
timeout=180,
)
data = resp.json()
if resp.status_code != 200 or not data.get("success"):
raise RuntimeError(f"{resp.status_code}: {data.get('error', data)}")
return data
result = summarize_pdf("annual-report.pdf")
print(result["summary"])
print("Страниц:", result["page_count"], "| Ключевые слова:", result.get("keywords"))
Ответ API
{
"success": true,
"summary": "- Выручка выросла на 6% до...",
"keywords": "выручка, маржа, прогноз, ...",
"page_count": 48,
"original_length": 182340,
"summary_length": 1210,
"processing_time": 6.214,
"requests_remaining": 4987
}
Поле requests_remaining показывает остаток вашей месячной квоты (-1 означает безлимит).
Стриминг сводки
Для длинных документов или интерактивных приложений вы можете получать сводку потоком по мере ее генерации:
import json
def stream_summary(path):
with open(path, "rb") as f:
with requests.post(
API_URL + "?stream=1",
headers={"Authorization": f"Bearer {API_KEY}"},
files={"file": (os.path.basename(path), f, "application/pdf")},
data={"length": "long", "format": "mixed"},
stream=True, timeout=300,
) as resp:
resp.raise_for_status()
for line in resp.iter_lines(decode_unicode=True):
if not line or not line.startswith("data: "):
continue
payload = line[6:]
if payload == "[DONE]":
break
event = json.loads(payload)
if "error" in event:
raise RuntimeError(event["error"])
if event.get("type") == "summary":
print(event["content"], end="", flush=True)
stream_summary("research-paper.pdf")
Пакетная обработка папки с PDF
import pathlib, time
out_dir = pathlib.Path("summaries")
out_dir.mkdir(exist_ok=True)
for pdf in sorted(pathlib.Path("pdfs").glob("*.pdf")):
target = out_dir / (pdf.stem + ".md")
if target.exists():
continue # удобно для возобновления
for attempt in range(3):
try:
data = summarize_pdf(str(pdf), length="long", fmt="mixed")
target.write_text(data["summary"], encoding="utf-8")
print("готово", pdf.name, data["page_count"], "стр.")
break
except RuntimeError as e:
if str(e).startswith("429"):
time.sleep(30 * (attempt + 1)) # превышен лимит: ждем перед повтором
else:
print("ошибка", pdf.name, e)
break
Возможные ошибки
| Статус | Значение | Что делать |
|---|---|---|
| 400 | Файл не передан, неверный тип, превышен лимит страниц | Проверьте файл и лимит страниц вашего тарифного плана |
| 401 | Отсутствует или недействителен ключ API | Проверьте заголовок Authorization |
| 403 | Аккаунт заблокирован | Обратитесь в службу поддержки |
| 413 | Файл слишком большой | Сжатите или разделите PDF-файл |
| 422 | Нет читаемого текста (пустой файл, защита или нечитаемый скан) | Удалите пароль; улучшите качество сканирования |
| 429 | Превышен лимит запросов или месячная квота | Подождите и повторите запрос или обновите тариф |
| 500 | Функция суммирования временно недоступна | Повторите запрос позже с задержкой |
Советы
- Задавайте таймауты с запасом (2–3 минуты) для обработки больших PDF-файлов.
- Кэшируйте результаты по хэшу файла, чтобы не платить дважды за обработку одного и того же документа.
- Храните ключи на сервере — никогда не встраивайте их во фронтенд или мобильные приложения.
- Полный справочник параметров доступен в документации по API.
Часто задаваемые вопросы
Доступен ли бесплатный тариф API?
Да. Бесплатный тариф включает месячную квоту запросов без необходимости указывать данные кредитной карты. См. страницу тарифов.
Можно ли передать URL вместо файла PDF?
API принимает сам файл. Скачайте PDF в своем коде (например, с помощью requests) и отправьте его байты.
На каких языках можно получить сводку?
Используйте параметр outputLang=auto, чтобы сохранить язык исходного документа, или укажите код языка, например en, fr, es, de.
Как обрабатывать сканированные PDF-файлы через API?
Отправляйте их так же, как любые другие PDF: если текстовый слой отсутствует, система автоматически задействует OCR-распознавание.