Я хочу сделать веб-приложение для извлечения выделенного текста из файла PDF. Я использовал fpdf и PDFlib для многих целей, но я не считаю их полезными в этом. Пожалуйста, скажите мне, как я могу это сделать. Или, по крайней мере, скажите мне, какие библиотеки PHP или фреймворки могут его поддерживать. Я хотел бы знать, даже если есть какой-либо API, который я могу использовать для этой цели. Буду очень признателен за вашу помощь.
Вы можете сделать это с SetaPDF-Extractor компонент (коммерческий продукт из нас!). Он позволяет получить доступ к выделенным аннотациям, с помощью которых вы можете создавать специальные фильтры для процесса извлечения. Простой пример скрипта может выглядеть так:
<?php
// load and register the autoload function
require_once('library/SetaPDF/Autoload.php');
// create a document instance
$document = SetaPDF_Core_Document::loadByFilename('path/to/the/highligted.pdf');
// initate an extractor instance
$extractor = new SetaPDF_Extractor($document);
// get page documents pages object
$pages = $document->getCatalog()->getPages();
// we are going to save the results in this variable
$results = array();
// iterate over all pages
for ($pageNo = 1, $pageCount = $pages->count(); $pageNo <= $pageCount; $pageNo++) {
// get the page object
$page = $pages->getPage($pageNo);
// get the highlight annotations
$annotations = $page->getAnnotations()->getAll(SetaPDF_Core_Document_Page_Annotation::TYPE_HIGHLIGHT);
// create a strategy instance
$strategy = new SetaPDF_Extractor_Strategy_Word();
// create a multi filter instance
$filter = new SetaPDF_Extractor_Filter_Multi();
// and pass it to the strategy
$strategy->setFilter($filter);
// iterate over all highlight annotations
foreach ($annotations AS $annotation) {
/**
* @var SetaPDF_Core_Document_Page_Annotation_Highlight $annotation
*/
$name = $annotation->getName();
// iterate over the quad points to setup our filter instances
$quadpoints = $annotation->getQuadPoints();
for ($pos = 0, $c = count($quadpoints); $pos < $c; $pos += 8) {
$llx = min($quadpoints[$pos + 0], $quadpoints[$pos + 2], $quadpoints[$pos + 4], $quadpoints[$pos + 6]);
$urx = max($quadpoints[$pos + 0], $quadpoints[$pos + 2], $quadpoints[$pos + 4], $quadpoints[$pos + 6]);
$lly = min($quadpoints[$pos + 1], $quadpoints[$pos + 3], $quadpoints[$pos + 5], $quadpoints[$pos + 7]);
$ury = max($quadpoints[$pos + 1], $quadpoints[$pos + 3], $quadpoints[$pos + 5], $quadpoints[$pos + 7]);
// Add a new rectangle filter to the multi filter instance
$filter->addFilter(
new SetaPDF_Extractor_Filter_Rectangle(
new SetaPDF_Core_Geometry_Rectangle($llx, $lly, $urx, $ury),
SetaPDF_Extractor_Filter_Rectangle::MODE_CONTACT,
$name
)
);
}
}
// if no filters for this page defined, ignore it
if (0 === count($filter->getFilters())) {
continue;
}
// pass the strategy to the extractor instance
$extractor->setStrategy($strategy);
// and get the results by the current page number
$pageResult = $extractor->getResultByPageNumber($pageNo);
// group the resulting words in an result array
foreach ($pageResult AS $word) {
$results[$pageNo][$word->getFilterId()][] = $word->getString();
}
}
// debug output
echo '<pre>';
foreach ($results AS $pageNo => $annotationResults) {
echo 'Page No #' . $pageNo . "\n";
foreach ($annotationResults AS $name => $words) {
echo ' Annotation name: ' . $name . "\n";
echo ' Result: ' . join(' ', $words). "\n";
echo '<br />';
}
}
echo '</pre>';
Вывод представляет собой простой дамп всех найденных слов для каждой аннотации выделения.
Других решений пока нет …