Я решил свою проблему, удалив первый код и добавив экземпляр репозитория файла.
$fileRepository = GeneralUtility::makeInstance(FileRepository::class);
$fileObjects = $fileRepository->findByRelation('targetTable', 'targetField', $uid);
ОЧЕНЬ ВАЖНО!
Если вы создаете новый элемент, TYPO3 назначает переменную temp UID с именем, похожим на это NEW45643476 . Чтобы получить $ uid из processDatamap_afterDatabaseOperations, вам нужно добавить этот код, прежде чем вы получите экземпляр fileRepository.
if (GeneralUtility::isFirstPartOfStr($uid, 'NEW')) {
$uid = $pObj->substNEWwithIDs[$uid];
}
Теперь, что касается текста, я извлек из pdf. Сначала я должен был получить базовое имя файла, чтобы найти его место хранения и имя. Поскольку у меня есть только один файл, мне не нужен цикл foreach, и я также могу использовать [0]. Итак, код выглядел так:
$fileID = $fileObjects[0]->getOriginalFile()->getProperties()['uid'];
$fullPath[] = [PathUtility::basename($fileObjects[0]->getOriginalFile()->getStorage()->getConfiguration()['basePath']), PathUtility::basename($fileObjects[0]->getOriginalFile()->getIdentifier())];
Это возвращает мне массив, похожий на этот:
array(1 item)
0 => array(2 items)
0 => 'fileadmin' (9 chars)
1 => 'MyPdf.pdf' (9 chars)
Теперь мне нужно сохранить текст с каждой страницы в переменной. Итак, код выглядит так:
$getPdfText = '';
foreach ($fullPath as $file) {
$parser = new Parser();
$pdf = $parser->parseFile(PATH_site . $file[0] . '/' . $file[1]);
$pages = $pdf->getPages();
foreach ($pages as $page) {
$getPdfText .= $page->getText();
}
}
Теперь, когда у меня есть текст, я хочу добавить его в базу данных, чтобы иметь возможность использовать его в своем поисковом действии. Теперь я использую пул соединений, чтобы получить файл из sys_file.
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file');
$queryBuilder
->update('sys_file')
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($fileID))
)
->set('pdf_text', $getPdfText)
->execute();
Теперь каждый раз, когда я выбираю PDF из своего расширения, я сохраняю его текст в базе данных.
ДОПОЛНИТЕЛЬНОЕ СОДЕРЖАНИЕ
Если вы также хотите включить PDFParser и находитесь в режиме композитора, добавьте это в ваш composer.json:
"smalot/pdfparser" : "*"
и при автозагрузке:
"Smalot\\PdfParser\\" : "Packages/smalot/pdfparser/src/"
Затем в: yourExtension / Classes / Hooks / DataHandler.php добавить пространство имен:
use Smalot\PdfParser\Parser;
Теперь вы можете использовать функции getPages()
и getText()
.
Документация
Если я что-то пропустил, дайте мне знать, и я добавлю это.