Скачаем PDF по ссылке и извлечём его текст штатным узлом Extract from File. На учебном документе проверим кириллицу и обе страницы. Отдельно разберём пустой результат: PDF может оказаться сканом, а настройки чтения — ограничить число страниц.
Результат инструкции
Получим текст двухстраничного PDF в поле text, сохраним исходный binary.document и проверим фразы с первой и второй страниц. В конце workflow выдаст verified: true только для нашего известного образца. Нейросети, OCR, отправка клиентам и запись в рабочие системы не используются.
PDF должен содержать текстовый слой. Фотография страницы внутри PDF остаётся изображением: операция Extract From PDF не распознает её автоматически. Также этот пример не восстанавливает таблицы как Excel и не проверяет содержание документа по смыслу.
Что понадобится
- Локальный n8n и отдельный новый workflow. Проверено на n8n 2.42.4, HTTP Request 4.4, Extract from File 1.1 и Code 2.
- Доступ n8n к HTTPS-файлу ezgpt.ru из этой статьи. Это вымышленный документ, без клиентских данных.
- Браузер или PDF-просмотрщик для сравнения исходника с текстом. Платные API и ключи для примера не нужны.
Установить n8n локально через Docker
Шаг 1. Откройте учебный PDF
Скачать двухстраничный n8n-pdf-text-demo.pdf
Откройте файл в PDF-просмотрщике. На первой странице должны быть заголовок «Учебный PDF для n8n», заявка DEMO-001 и тестовая компания. На второй — заголовок «Страница 2» и строка «Следующий шаг: ручная проверка.».
Попробуйте выделить предложение курсором и скопировать. В нашем образце текст выделяется, кириллица читается, всего две страницы. У произвольного файла невозможность выделения ещё не доказывает, что это скан: бывают ограничения и дефекты документа. Но обычная картинка страницы требует отдельного OCR-сценария.
Шаг 2. Импортируйте workflow
Скачать n8n-extract-pdf-text.json
Создайте новый workflow, выберите Import from File и загрузите JSON. Назовите его «Учебное чтение PDF». В схеме пять узлов:
Manual Trigger → Download PDF → Check PDF → Read PDF → Check Text
Download PDF — HTTP Request, Read PDF — Extract from File, Check PDF и Check Text — Code. Сохраните схему, но не публикуйте её: для ручного запуска это не требуется. Не меняйте действующие workflows.
Шаг 3. Настройте загрузку PDF как файла
В Download PDF выберите Method: GET, Authentication: None и адрес:
https://ezgpt.ru/storage/article-files/n8n-pdf-text-demo.pdf
В Options добавьте Response и сверьте параметры:
| Поле HTTP Request | Значение | Зачем |
|---|---|---|
| Response Format | File | Получить binary, не строку JSON |
| Put Output in Field | document | Имя файла внутри n8n |
| Include Response Headers and Status | Включено | Проверить код и MIME ответа |
| Never Error | Выключено | Не считать 404 и 503 успехом |
В Redirects выключите Follow Redirects, Timeout установите 15000 мс. Ignore SSL Issues оставьте выключенным. Здесь известная HTTPS-ссылка: перенаправление на вход или другой домен не должно незаметно заменить документ. Timeout ограничивает ожидание начала ответа, а не является общим лимитом на все этапы обработки.
После загрузки ожидаются statusCode: 200, Content-Type: application/pdf и binary.document. Просто имя с расширением .pdf не доказывает, что сервер отдал PDF: вместо него может прийти HTML-страница авторизации.
Шаг 4. Проверьте загруженный файл
В Check PDF выберите Run Once for All Items, JavaScript. При ручной сборке вставьте:
const items = $input.all();
if (items.length !== 1) throw new Error('Expected one download');
const item = items[0];
const type = String(item.json.headers?.['content-type'] ?? '').split(';')[0].trim().toLowerCase();
if (item.json.statusCode !== 200 || type !== 'application/pdf') {
throw new Error('Expected HTTP 200 with application/pdf');
}
if (Object.keys(item.binary ?? {}).join('|') !== 'document') {
throw new Error('Expected binary.document');
}
const bytes = await this.helpers.getBinaryDataBuffer(0, 'document');
if (bytes.length < 5 || bytes.length > 250000 || bytes.subarray(0, 5).toString('ascii') !== '%PDF-') {
throw new Error('Expected a PDF up to 250000 bytes');
}
return [{ json: { source_bytes: bytes.length }, binary: { document: item.binary.document } }];
Проверка принимает один файл, код 200, MIME application/pdf, начало %PDF- и размер не более 250000 байт. Учебный исходник занимает 84549 байт. Это проверка после загрузки, не защита сервера от больших входящих запросов. Сигнатура PDF также не заменяет настоящий разбор формата и проверку безопасности.
getBinaryDataBuffer читает байты файла, в том числе при хранении binary на диске. Не передавайте в парсер текст из headers, URL или служебное значение binary.document.data. После узла остаётся исходный binary и число source_bytes.
Шаг 5. Настройте извлечение текста
Откройте Read PDF. Выберите Operation: Extract From PDF и проверьте:
| Поле Read PDF | Значение | Результат |
|---|---|---|
| Input Binary Field | document | Читается скачанный файл |
| Join Pages | Включено | Одна строка text, не массив |
| Max Pages | 2 | Читаются обе страницы образца |
| Keep Source | Both | Сохраняются source_bytes и binary |
Password оставьте пустым: образец не зашифрован. В этой операции нет Destination Output Field: текст появляется в поле text. Не переносите настройки text или rows из примеров чтения TXT и JSON.
В проверенном n8n 2.42.4 значение Max Pages: 0 дало пустой text. Поэтому в этой инструкции лимит указан явно. Значение 1 прочитало только первую страницу, хотя numpages осталось равным 2. Для вашего документа выбирайте лимит осознанно и проверяйте содержимое, а не только число страниц в метаданных.
Join Pages выключено меняет тип text на массив текстов страниц. Это допустимый режим самого узла, но наша проверка ниже ожидает строку. Keep Source: Both нужен, чтобы на выходе сохранились и source_bytes, и PDF для сравнения.
Шаг 6. Проверьте текст обеих страниц
В Check Text оставьте Run Once for All Items и JavaScript:
const item = $input.first();
if (typeof item.json.text !== 'string' || !item.json.text.trim()) {
throw new Error('No extracted text; check PDF text layer and Max Pages');
}
if (item.json.numpages !== 2 || !Number.isInteger(item.json.source_bytes) || !item.binary?.document) {
throw new Error('Expected two-page sample with source metadata and binary');
}
const normalized = item.json.text.replace(/\s+/gu, ' ').trim();
const markers = [
'Учебный PDF для n8n', 'Заявка: DEMO-001', 'Клиент: Тестовая компания',
'Страница 2', 'Следующий шаг: ручная проверка.',
];
for (const marker of markers) {
if (!normalized.includes(marker)) throw new Error('Missing sample text: ' + marker);
}
return [{
json: {
file_name: 'n8n-pdf-text-demo.pdf', pages: item.json.numpages,
request_id: 'DEMO-001', text: item.json.text, verified: true, action: false,
},
binary: { document: item.binary.document },
}];
Код отклоняет пустой текст, отсутствие исходного файла или метаданных и проверяет несколько известных фраз. Среди них есть строка со второй страницы: только первая страница не пройдёт проверку. Для поиска нормализуются пробелы, а в итоговом text сохраняется исходный результат извлечения.
Это проверка конкретного учебного PDF. request_id: DEMO-001 — известный номер образца, а не универсальное извлечение реквизитов из любого документа. При замене файла нужно заменить ожидаемые фразы и число страниц, иначе корректный чужой PDF будет отклонён. verified не означает юридическую или смысловую проверку документа.
Шаг 7. Запустите всю цепочку
Сохраните workflow и нажмите Execute workflow от Manual Trigger. Не запускайте только Read PDF или Check Text без предыдущих данных. Должны успешно завершиться все пять узлов.
В Read PDF проверьте text: в нём должны быть и DEMO-001, и фраза со второй страницы. Само numpages: 2 этого не доказывает. В JSON узла Check Text для неизменённого образца ожидается:
{
"file_name": "n8n-pdf-text-demo.pdf",
"pages": 2,
"request_id": "DEMO-001",
"text": "ezGPT\nУчебный PDF для n8n\nЗаявка: DEMO-001\nКлиент: Тестовая компания\nЗадача: Извлечь текст из документа.\nТекстовый слой можно выделить курсором.\nУчебный пример. Только вымышленные данные. 1 / 2\n\nezGPT\nСтраница 2\nРезультат проверки\nДокумент содержит две страницы.\nСледующий шаг: ручная проверка.\nЭтот файл не содержит реальных данных.\nУчебный пример. Только вымышленные данные. 2 / 2",
"verified": true,
"action": false
}
Переводы строк в JSON показаны экранированно. Оформление страниц не сохраняется как в просмотрщике: заголовки, колонтитулы и основной текст превращаются в последовательность строк. action: false означает отсутствие внешней отправки и бизнес-действий; загрузка и чтение уже выполнены.
Шаг 8. Сравните извлечённое с оригиналом
Сопоставьте text с обеими страницами PDF: имя компании, номер заявки и последняя смысловая строка второй страницы должны читаться без повреждённой кириллицы. В нашем примере также извлекаются подпись ezGPT и номера страниц. Это ожидаемо, они действительно находятся в документе.
Если результат нужен для RAG или дальнейшего анализа, сначала решите, какие колонтитулы убрать и как сохранять связь с источником. Не удаляйте все повторяющиеся строки без проверки: повтор может быть значимым текстом. Таблицы и колонки особенно важно сверять вручную, порядок слов в них не гарантирован этой схемой.
Исходный PDF остаётся в Binary узла Check Text, поле document. Его можно скачать из результата для сравнения. Редакция проверила реальную загрузку файла и извлечённый текст; клики скачивания внутри редактора n8n не тестировались.
Шаг 9. Проверьте неполное чтение
В Read PDF временно замените Max Pages: 2 на 1 и запустите весь workflow. Ожидается ошибка Check Text: Missing sample text: Страница 2. В JSON Read PDF при этом может остаться numpages: 2, потому что это число страниц документа, а не доказательство чтения каждой из них.
Верните Max Pages: 2 и повторите запуск. Обе страницы должны снова пройти проверку. Отдельно можно поставить 0: в проверенной версии это даёт пустой текст и остановку Check Text. Не скрывайте такую ошибку через Continue On Fail, Always Output Data или возврат verified вручную.
Шаг 10. Определите, нужен ли OCR
Если ваш собственный PDF состоит из изображений страниц, этот workflow не сможет распознать буквы. В тесте на специально подготовленном PDF из картинок Read PDF вернул пустой text, а Check Text остановил обработку. OCR здесь не запускался.
Пустой результат не всегда означает скан. Сначала проверьте Max Pages, наличие текстового слоя, пароль и исправность файла. Если проблема именно в изображениях, нужен отдельный OCR-инструмент. После распознавания всё равно сверяйте номера, имена и строки с оригиналом.
Для защищённого PDF используйте только известный вам пароль и разрешённый доступ. В тесте без пароля и с неверным значением Read PDF завершился ошибкой, с правильным — прочитал учебный документ. Это не обход защиты; подбор паролей в инструкции не выполняется.
Если результат отличается
| Симптом | Что проверить | Действие |
|---|---|---|
| 404 или HTML вместо PDF | Адрес, доступ и Content-Type | Использовать прямую ссылку на файл |
| Нет binary.document | Response Format и выходное поле | Выбрать File и document |
| text пустой | Max Pages, текстовый слой и пароль | Не считать пустой ответ успехом |
| Пропала вторая страница | Лимит чтения и контрольные фразы | Вернуть Max Pages: 2 для образца |
| Ошибка Check Text | Join Pages, Both и сам документ | Сверить режимы и ожидаемые фразы |
Перед работой с реальными документами
Схема скачивает только известный публичный учебный PDF. Не превращайте её в загрузчик произвольных URL без проверки адресов и прав доступа. Для закрытых документов используйте документированные credentials и храните секреты отдельно от публичного workflow.
Не отправляйте договоры и персональные данные в OCR или LLM без согласованного способа обработки. Извлечение текста в n8n здесь не требует такой отправки, но PDF и текст могут сохраняться в истории executions. Настройте доступ и сроки хранения.
Как принять файл через Webhook в n8n
Как скачать файл через HTTP Request
Что проверено редакцией
17 октября 2026 года схема проверена на n8n 2.42.4 в отдельном Docker-экземпляре с binary на диске. Все 26 тестов прошли: точная публичная схема с HTTPS-файлом ezgpt.ru, локальная копия, лимит 10 страниц, PDF из изображений, зашифрованный PDF без пароля, с неверным и правильным паролем; HTML и HTML под видом PDF, пустой, слишком большой и повреждённый файл, 404, 503, редирект и задержка ответа; неверные настройки формата, binary-поля, Join Pages, Max Pages 0 и 1, потеря JSON или binary, изменение текста и числа страниц. Текст обеих страниц и кириллица подтверждены. Скан и Max Pages 0 дали пустой текст; лимит 1 сохранил numpages 2, но не текст второй страницы. Учебный PDF создан редакцией, извлечение дополнительно проверено pypdf, обе страницы отрисованы Poppler и просмотрены. Контейнер остановлен, существующие workflows не менялись. OCR, Cloud, клики редактора, таблицы, большие PDF и реальные клиентские документы не тестировались. Обложка — AI-иллюстрация.
Частые вопросы
Extract From PDF распознаёт сканы?
Нет, в этой инструкции читается существующий текстовый слой. PDF из изображений в тесте дал пустой текст. Для распознавания изображений нужен OCR.
Почему при numpages: 2 есть текст только первой страницы?
Это число страниц документа. В тесте с Max Pages: 1 метаданные показывали 2, но текст второй страницы отсутствовал. Проверяйте лимит и контрольные фразы.
Почему Max Pages: 0 не означает прочитать всё?
В проверенном n8n 2.42.4 эта настройка дала пустой text. Для учебного двухстраничного PDF задайте 2 явно. Поведение других версий проверяйте отдельно.
Где поле Destination Output Field для PDF?
В этой операции его нет. Извлечённый текст приходит в text. При Join Pages: включено это строка, при выключенном — массив.
Можно извлечь таблицу PDF как готовый Excel?
Эта схема этого не делает. Она извлекает текст, не восстанавливает ячейки и не проверяет порядок колонок. Для таблиц нужен отдельный сценарий и сверка с оригиналом.