PDF: сайт → файл → текст
Два входа: напечатать текущую страницу или взять готовый файл (кнопка «Скачать», вложение письма, экспорт из Word). Дальше объект pdffile.
Откуда берётся файл
Текущая страница браузера. webpage→print_to_pdf($filepath) — с 6.0.41. Сначала дождитесь контента, иначе в PDF уедет пустой каркас SPA.
$input->wait_element_exist_by_inner_text("Итого");
$webpage->print_to_pdf("C:\\bots\\out\\page.pdf");
Кнопка «Скачать» на сайте. Это не print_to_pdf, а загрузка: wait_download_and_get_file_path.
Вложение письма. IMAP save attachments.
Из Word. export_pages / convert.
Перед разбором: is_pdf_file — отсечь HTML, который сайт отдал с расширением .pdf.
Текст страниц
- get_page_count / get_info
- read_page($path, $page) — номер с нуля (с 7.0.56)
- Весь текст: read
- Найти страницу по фрагменту: get_page_number_by_text
- Ссылки: get_links_count, get_all_links, get_link_by_number
$n = $pdffile->get_page_count("C:\\data\\act.pdf");
$text0 = $pdffile->read_page("C:\\data\\act.pdf", 0);
$all = $pdffile->read("C:\\data\\act.pdf");
Пустой read_page при ненулевом числе страниц — часто скан без текстового слоя. Тогда не парсите regex по пустой строке, идите в картинки/OCR.
| Объект | Первая страница |
|---|---|
pdffile read_page | 0 |
word export_pages | 1 |
Смешаете индексы — либо промахнётесь мимо страницы, либо получите пусто. Сверяйте хаб метода, не «как в прошлом скрипте».
Склеить и разрезать
combine($outpath, $inpaths, $is_compressed=false) — массив путей в один файл (с 7.0.57). Сжатие — третий аргумент.
$pdffile->combine(
"C:\\bots\\out\\pack.pdf",
array("C:\\bots\\in\\a.pdf", "C:\\bots\\in\\b.pdf"),
true
);
split($path, $to_folder, $pages_per_file=1, $timeout=6000) — страницы в отдельные файлы. Печать: print_pages. Запись: write.
Картинки внутри PDF
Извлечённые PNG отдайте в Tesseract, если текстового слоя нет.
Если текста нет
Скан «как фото». read пустой — это не баг pdffile. Цепочка: extract_images → OCR или FineReader. Не запускайте regex «сумма:» по пустой строке в цикле на 200 файлах — только сожжёте ночь расписания.
Альтернатива картинкам страниц: print_pages — страницы как отдельные файлы-картинки, затем OCR по каждому PNG.
Пачка: скачать → проверить → склеить
$browser->set_default_download("C:\\bots\\in");
$browser->disable_download_file_dialog();
$anchor->click_by_inner_text("Скачать PDF");
$path = $browser->wait_download_and_get_file_path(120);
if (!$pdffile->is_pdf_file($path)) {
echo "это не PDF";
}
$n = $pdffile->get_page_count($path);
$text = $pdffile->read_page($path, 0);
$pdffile->combine("C:\\bots\\out\\pack.pdf", array($path, "C:\\bots\\in\\stamp.pdf"), true);
Скачивание — гайд файлов. Не вызывайте combine, пока wait_download не вернул путь: иначе в массив попадёт пустая строка и метод вернёт false.
FAQ
Не та страница. Индексация с нуля: первая — 0, последняя — count-1.
combine false. Один из путей не PDF, файл залочен, нет прав на outpath. Проверьте is_pdf_file по каждому входу.
Огромный таймаут split. Параметр timeout у split; тяжёлые сканы режьте по одному файлу.
print_to_pdf пустой. SPA ещё не отрисовалась. Сначала wait ключевого текста, потом печать. Это не баг pdffile — в файл уехал каркас страницы.
read_page(1) при одной странице. Индексация с нуля: единственная страница — 0. Для Word export_pages счёт с 1 — не путайте объекты.
Поиск: pdffile.