Как конвертировать PDF в текст (извлечь текст из PDF) с помощью PHP в Symfony 3

Если вы работаете с файлами Portable Document Format (PDF), пользователь вашей системы может захотеть извлечь весь текст из файла PDF. Таким образом, пользователю не нужно выделять весь текст PDF с помощью мыши, а затем что-то делать с ним, поскольку вы можете автоматизировать это действие с помощью JavaScript в вашем браузере. Если ты не хочешь извлечь текст PDF в браузере с помощью JavaScript потому что вы заботитесь о пользовательском опыте, то вы можете сделать это на стороне сервера.

В этой статье вы узнаете, как извлечь текст из PDF на стороне сервера с помощью PHP в вашем проекте Symfony 3, используя библиотеку PDF Parser. Хотя есть и другие библиотеки, которые могут помочь вам извлечь текст, как PDF в текст от @spatie, PDF Parser также работает лучше, так как он очень прост в установке, использовании и не зависит от программного обеспечения (если вы используете библиотеку pdf-to-text от spatie, вам потребуется устанавливать pdftotext в вашей машине, так как библиотека является оберткой для утилиты).

Давайте начнем !

1. Установите PDF Parser

PdfParser — это потрясающая автономная библиотека PHP, которая предоставляет различные инструменты для извлечения данных из файла PDF. Некоторые особенности парсера PDF:

  • Загрузка / анализ объектов и заголовков
  • Извлечение метаданных (автор, описание, …)
  • Извлечь текст из упорядоченных страниц
  • Поддержка сжатого PDF
  • Поддержка кодировки римской кодировки MAC OS
  • Обработка гекса и восьмеричного кодирования в текстовых разделах
  • PSR-0 совместимый (автопогрузчик)
  • PSR-1 совместимый (стиль кода)

Вы можете даже проверить, как работает библиотека на этой странице. Единственным ограничением этого парсера является то, что он не может обрабатывать защищенные документы.

Предпочтительный способ установки этой библиотеки — через Composer. Откройте новый терминал, перейдите в каталог вашего проекта и выполните на нем следующую команду:

composer require smalot/pdfparser

Если вам не нравится устанавливать новые библиотеки напрямую с терминала в вашем проекте, вы все равно можете изменить composer.json файл и добавить зависимость вручную:

{
"require": {
"smalot/pdfparser": "*"
}
}

Сохраните изменения и затем выполните composer install в вашем терминале. После завершения установки вы сможете легко извлечь текст из PDF.

Если вам нужна дополнительная информация о библиотеке PDF Parser, посетите официальный репозиторий в Github здесь или их сайт здесь.

2. Извлечение текста

Извлечение текста с PDFParse довольно просто, вам нужно всего лишь создать экземпляр Smalot\PdfParser\Parser Класс и затем загрузить файл PDF по его абсолютному или относительному пути, проанализированный файл должен быть сохранен в переменной, а затем этот объект позволит вам обрабатывать PDF по страницам. Вы можете извлекать непосредственно весь текст из всего PDF или отдельно по страницам.

Оформить заказ на следующие примеры:

Заметка

Поскольку мы работаем с Symfony, мы можем получить путь к /web папка в проекте с помощью $this->get('kernel')->getRootDir() . '/../web' пока вы находитесь в контроллере.

Извлечь весь текст со всех страниц

Вы можете извлечь весь текст из PDF, используя getText метод, доступный в экземпляре PDF:

get('kernel')->getRootDir() . '/../web/example.pdf';
// Create an instance of the PDFParser
$PDFParser = new Parser();
// Create an instance of the PDF with the parseFile method of the parser
// this method expects as first argument the path to the PDF file
$pdf = $PDFParser->parseFile($pdfFilePath);
// Extract ALL text with the getText method
$text = $pdf->getText();
// Send the text as response in the controller
return new Response($text);
}
}

Перебирайте каждую страницу PDF и извлекайте текст

Если вы хотите обрабатывать отдельно каждую страницу PDF, вы можете перебирать массив страниц, которые вы можете получить с помощью getPages метод экземпляра PDF:

get('kernel')->getRootDir() . '/../web/example.pdf';
// Create an instance of the PDFParser
$PDFParser = new Parser();
// Create an instance of the PDF with the parseFile method of the parser
// this method expects as first argument the path to the PDF file
$pdf = $PDFParser->parseFile($pdfFilePath);
// Retrieve all pages from the pdf file.
$pages  = $pdf->getPages();
// Retrieve the number of pages by counting the array
$totalPages = count($pages);
// Set the current page as the first (a counter)
$currentPage = 1;
// Create an empty variable that will store thefinal text
$text = "";
// Loop over each page to extract the text
foreach ($pages as $page) {
// Add a HTML separator per page e.g Page 1/14
$text .= "

Page $currentPage/$totalPages

"; // Concatenate the text $text .= $page->getText(); // Increment the page counter $currentPage++; } // Send the text as response in the controller return new Response($text); } }

Вы можете извлечь текст со страницы в формате массива (где каждый элемент в массиве — это новая строка), используя getTextArray метод вместо getText,

Извлечь текст из определенной страницы в PDF

Хотя нет способа получить прямой доступ к странице по ее номеру, вы можете просто получить к ней доступ в массиве страниц с помощью getPages метод экземпляра PDF. Этот массив упорядочен так же, как PDF (индекс 0 равен странице № 1 PDF), поэтому вы можете получить доступ к странице, извлекая ее из массива с индексом.

Обратите внимание, что вам нужно проверить, существует ли индекс (номер страницы) в массиве страниц, в противном случае вы получите исключение:

get('kernel')->getRootDir() . '/../web/example.pdf';
// Create an instance of the PDFParser
$PDFParser = new Parser();
// Create an instance of the PDF with the parseFile method of the parser
// this method expects as first argument the path to the PDF file
$pdf = $PDFParser->parseFile($pdfFilePath);
// Get all the pages of the PDF
$pages = $pdf->getPages();
// Let's extract the text of the page #2 of the PDF
$customPageNumber = 2;
// If the page exist, then extract the text
// As every array starts with 0 add +1
if(isset($pages[$customPageNumber + 1])){
// As every array starts with 0 add +1
$pageNumberTwo = $pdf->getPages()[$customPageNumber + 1];
// Extract the text of the page #2
$text = $pageNumberTwo->getText();
// Send the text as response in the controller
return new Response($text);
}else{
return new Response("Sorry the page #$customPageNumber doesn't exist");
}
}
}
Ссылка на основную публикацию
Adblock
detector