Вопрос по pdfparser

D
На сайте с 28.06.2008
Offline
975
319

Есть необходимость вытащить некоторые цифры из отчетов фирм.

Отчеты в ПДФ.

Написал парсер с использованием библиотеки pdfparser.

Протестировал на первом - все работает, увеличил лимит и все повисло.

Начал разбираться, оказалось что второй пдф весь из картинок, текста нет.

Это не проблема я бы с радостью такие пропускал, но не знаю как обработать это событие.

Вот часть кода парсера

include '/var/tmp/vendor/autoload.php';
// Создаем объект для парсинга PDF
$parser = new \Smalot\PdfParser\Parser();
// парсим PDF файл
$pdf = $parser->parseFile('https://urlfirm/get_file.php?id='.$idOtchet[0][1].'&name=file.pdf');
// ссылка из PDF
// Извлекаем все страницы из PDF файла
$pages = $pdf->getPages();
var_dump($pages);
// проходимся по каждой странице и получаем текст
foreach ($pages as $page) {

Вот где у меня var_dump - на этом участке зависает намертво и все. Как мне это можно обработать?

Например - если $pages не получен за 5 сек, прерываем и идем дальше?

IL
На сайте с 20.04.2007
Offline
412
#1
Dram:
второй пдф весь из картинок, текста нет.

1) объём

2) возможно, по свойствам пробежаться.. закономерности поискать

$details  = $pdf->getDetails();

3) Если текста нет, зачем лезть в страницы?

$pdf->getText();
D
На сайте с 28.06.2008
Offline
975
#2

ivan-lev, попробовал получить инфу о файле, тоже зависло на этом

$pdf = $parser->parseFile('https://urlfirm/get_file.php?id='.$idOtchet[0][1].'&name=file.pdf');
$details = $pdf->getDetails();
var_dump($details);



---------- Добавлено 15.09.2019 в 12:56 ----------

Так тоже висит

$details = $pdf->getDetails();

// Loop over each property to extract values (string or array).
foreach ($details as $property => $value) {
if (is_array($value)) {
$value = implode(', ', $value);
}
echo $property . ' => ' . $value . "\n";
}
I
На сайте с 15.03.2008
Offline
144
#3

Дайте два пдф'а, с проблемный и нормальный, посмотрю чем вам можно помочь.

П.С. На var_dump у вас виснет, т.к. не хватает памяти на процесс.

D
На сайте с 28.06.2008
Offline
975
#4

infant, спс, отправил в личку.

У проблемного файла размер всего 3,5 мб. А на серваке в данный моменты свободно 5 гб оперативы и мунин не показывает что идет како-то рост потребления ресурсов когда виснет все.

I
На сайте с 15.03.2008
Offline
144
#5

Как я и предполагал, проблема в памяти.

Ваш парсер обрабатывает сразу все страницы, загоняя их в пулл процесса. Отсюда нехватка времени и памяти. (У меня не самый слабый и комп , на нем тоже не хватило ))) )

В качестве решения вашей проблемы подключаем еще одну библиотеку и с помощью нее скармливаем парсеру по одной странице за раз. На выходе получите массив со страницами без картинок. Обрабатывать вероятные ошибки в коде не стал, это на ваше усмотрение. Вырезать из массива пустые элементы (там где были картинки) тоже не стал, вдруг вам нужен четкий порядок страниц.

/**
* @param $pagePdf
* @return string
*/
function getText($pagePdf)
{
$parser = new \Smalot\PdfParser\Parser();
$pdf = $parser->parseContent($pagePdf);
$txt = trim($pdf->getText());
return $txt;
}

/**
* @param string $url
* @return array
*/
function getContents(string $url)
{
$res = [];

$content = file_get_contents($url);
$sourceFile = \setasign\Fpdi\PdfParser\StreamReader::createByString($content);

$pdf = new \setasign\Fpdi\Fpdi();
$pageCount = $pdf->setSourceFile($sourceFile);
for ($i = 1; $i <= $pageCount; $i++) {
$pdf_ = new \setasign\Fpdi\Fpdi();
$pdf_->AddPage();
$pdf_->setSourceFile($sourceFile);
$pdf_->useTemplate($pdf_->importPage($i));
$out = $pdf_->Output('S');

$txt = $this->getText($out);

$res[$i] = $txt;
}
return $res;
}

$contents = $this->getContents($url);

Парсер форума вырезает квадратные скобки.

$res = []; и $res[$i] = $txt;

D
На сайте с 28.06.2008
Offline
975
#6

infant, большое спасибо!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий