Получение списка шрифтов из любого PDF с PHP - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь получить список всех шрифтов, используемых в загруженном 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

Моим последним решением будет чтение файла строка за строкой и поиск строки за строкой для шрифтов. Но это слишком увеличило бы время обработки.

Кто-нибудь предлагает? Другой шаблон (пробовал несколько)?

1 Ответ

0 голосов
/ 22 марта 2020

Изменен шаблон на:

$box="/BaseFont\ ?.*>>/U";

Объяснение:

  • Наиболее важным изменением является U в конце, оно называется модификатором шаблона - см. Модификаторы шаблона - он используется, чтобы сделать сопоставление не жадным, поэтому он не будет соответствовать всей строке, поскольку отвечает на шаблон, но только, как только он обнаружит >>
  • говоря о >> это второе добавление к вашему шаблону, оно необходимо, чтобы оно соответствовало всему определению BaseFont, или же оно соответствовало только слову BaseFont, поскольку совпадение не является жадным.
...