Я пытаюсь получить список всех шрифтов, используемых в загруженном PDF. Следующий скрипт прекрасно работает для определенных PDF-файлов, но если шрифты перечислены в PDF-файле в одной строке, скрипт не находит следующий шрифт, только первый.
$box="/BaseFont\ ?.*/";
$stream = new SplFileObject($pdffile);
while (!$stream->eof()) {
if (preg_match_all($box, $stream->fgets(), $matches)) {
for ($i = 0; $i < count($matches[0]); $i++) {
$newfont = substr($matches[0][$i], (strpos($matches[0][$i],"+") + 1));
if (strpos($newfont,"/") > 0)
{
$newfont = str_replace(' ', '',substr($newfont, 0, strpos($newfont,"/")));
$newfont = str_replace(array("\r", "\n"), '',$newfont);
}
if (!in_array($newfont, $fonts))
{
$fontcount = $fontcount + 1;
echo $newfont."<br>";
array_push($fonts,$newfont);
}
}
}
}
$stream = null;
Образец PDF :
<</BaseFont/CMYBYX+Wingdings-Regular/DescendantFonts 27 0 R/Encoding/Identity-H/Subtype/Type0/ToUnicode 28 0 R/Type/Font>>
endobj
14 0 obj
<</BaseFont/CMYBYX+Roboto-Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 30 0 R/LastChar 116/Subtype/TrueType/ToUnicode 31 0 R/Type/Font/Widths[249 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 873 708 0 651 0 0 634 0 0 636 0 0 0 0 0 0 0 0 0 0 0 0 518 0 529 0 564 564 267 0 0 267 0 564 564 0 0 0 516 349]>>
endobj
15 0 obj
<</BaseFont/CMYBYX+Roboto-Light/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 33 0 R/LastChar 127/Subtype/TrueType/ToUnicode 34 0 R/Type/Font/Widths[243 0 0 0 0 0 0 0 0 0 0 0 0 0 239 397 583 554 554 554 554 0 554 554 554 554 0 0 0 0 0 0 913 625 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 538 557 518 0 515 329 557 557 227 0 0 227 886 557 557 557 0 340 509 332 557 0 757 0 0 0 0 0 0 0 323]>>
endobj
Что на самом деле:
<</BaseFont/CMYBYX+Wingdings-Regular/DescendantFonts 27 0 R/Encoding/Identity-H/Subtype/Type0/ToUnicode 28 0 R/Type/Font>>endobj14 0 obj<</BaseFont/CMYBYX+Roboto-Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 30 0 R/LastChar 116/Subtype/TrueType/ToUnicode 31 0 R/Type/Font/Widths[249 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 873 708 0 651 0 0 634 0 0 636 0 0 0 0 0 0 0 0 0 0 0 0 518 0 529 0 564 564 267 0 0 267 0 564 564 0 0 0 516 349]>>endobj15 0 obj<</BaseFont/CMYBYX+Roboto-Light/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 33 0 R/LastChar 127/Subtype/TrueType/ToUnicode 34 0 R/Type/Font/Widths[243 0 0 0 0 0 0 0 0 0 0 0 0 0 239 397 583 554 554 554 554 0 554 554 554 554 0 0 0 0 0 0 913 625 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 538 557 518 0 515 329 557 557 227 0 0 227 886 557 557 557 0 340 509 332 557 0 757 0 0 0 0 0 0 0 323]>>endobj
Моим последним решением будет чтение файла строка за строкой и поиск строки за строкой для шрифтов. Но это слишком увеличило бы время обработки.
Кто-нибудь предлагает? Другой шаблон (пробовал несколько)?