Перейти к содержимому

Справочник API Artisan

Пакет Artisan (nextpdf/artisan) предоставляет две связанные группы API. API отрисовки в Chrome — ChromeRendererConfig, ChromeHtmlRenderer, ChromeSecurityPolicy, ChromeRenderResult, ViewportCalculator и BrowserPool — превращает фрагмент Hypertext Markup Language (HTML) в файл Portable Document Format (PDF), созданный в Chrome. API парсера и импортёра — PdfReader, PageImporter, ImportedFormXObject, а также вспомогательные классы токенизатора и перекрёстных ссылок — встраивает этот результат обратно в документ NextPDF как Form XObject с выделяемым текстом.

С чего начать: если вам нужен только PDF из HTML, этот пакет редко приходится использовать напрямую. Подключите ChromeRendererConfig к документу NextPDF Document и вызовите writeHtmlChrome(); см. краткое руководство. Используйте приведённые ниже классы, когда встраиваете отрисовщик в обработчик-воркер или диагностируете парсер. Первый пример в разделе “Типовые задачи” показывает путь в один вызов.

Три сценария ниже охватывают почти все промышленные варианты использования: от самого высокоуровневого вызова до явного конвейера отрисовки и импорта. Каждый пример проверен по nextpdf-Artisan/src (а также по README.md / ci/tests/ пакета).

Отрисуйте фрагмент HTML в PDF с выделяемым текстом каноническим вызовом.

<?php
declare(strict_types=1);
use NextPDF\Core\Document;
use NextPDF\Artisan\ChromeRendererConfig;
require __DIR__ . '/vendor/autoload.php';
$config = new ChromeRendererConfig(chromeBinaryPath: '/usr/bin/chromium');
$doc = Document::createStandalone();
$doc->setChromeRendererConfig($config);
$doc->addPage();
$doc->writeHtmlChrome('<div style="display:flex;gap:20px"><h2>Revenue</h2><p>$124,500</p></div>');
$doc->save('/tmp/report.pdf');

Что делает: Chrome выполняет вёрстку фрагмента. Мост встраивает страницу 0 как Form XObject, поэтому текст остаётся выделяемым. writeHtmlChrome(string $html, ?float $width = null, ?float $height = null): static автоматически подбирает высоту, когда $height равен null.

Запустите отрисовщик и импортируйте страницу самостоятельно, когда нужен явный конвейер, лежащий в основе writeHtmlChrome(), например в обработчиках-воркерах или собственных сценариях размещения.

<?php
declare(strict_types=1);
use NextPDF\Artisan\ChromeHtmlRenderer;
use NextPDF\Artisan\ChromeRendererConfig;
use NextPDF\Artisan\ImportedFormXObject;
use NextPDF\Artisan\PageImporter;
use NextPDF\Parser\PdfReader;
$renderer = new ChromeHtmlRenderer(new ChromeRendererConfig(renderTimeout: 30));
try {
$result = $renderer->render($html, widthPt: 595.28);
$reader = new PdfReader($result->getPdfData());
$reader->parse();
$form = (new PageImporter())->import($reader);
} finally {
$renderer->close();
}

Что делает: отрисовывает байты PDF в Chrome, парсит их и импортирует страницу 0 в ImportedFormXObject, который вы можете разместить. Всегда вызывайте close() у отрисовщика, чтобы освободить процесс Chrome.

Соберите конфигурацию из массива в стиле фреймворка для config/*.php или из параметров бандла, а не из жёстко заданных аргументов конструктора.

<?php
declare(strict_types=1);
use NextPDF\Artisan\ChromeRendererConfig;
$config = ChromeRendererConfig::fromArray([
'chrome_binary' => '/usr/bin/chromium',
'render_timeout' => 45,
'max_html_size' => 2_000_000,
'no_sandbox' => false,
]);

Что делает: сопоставляет массив конфигурации в snake-case с конструктором. Для незаданных ключей используются значения по умолчанию, а chrome_binary применяется, только если это непустая строка.

Эти типы реализуют путь отрисовки. Создайте ChromeRendererConfig, передайте его в ChromeHtmlRenderer, затем вызовите render(), чтобы получить ChromeRenderResult.

СимволПараметрыПоведение по умолчаниюВозвращаетВыбрасывает или завершается с ошибкойПримечания
new ChromeRendererConfig(?string $chromeBinaryPath = null, int $renderTimeout = 30, string $defaultCss = '', int $maxHtmlSize = 5000000, bool $noSandbox = false)Путь к исполняемому файлу, тайм-аут, Cascading Style Sheets (CSS), ограничение размера HTML, флаг песочницы.Автоматически находит Chrome, когда путь к исполняемому файлу равен null; песочница остаётся включённой, пока её не отключат.ChromeRendererConfigне ожидается.Задавайте noSandbox, только если этого требует среда выполнения.
ChromeRendererConfig::fromArray(array $config)chrome_binary, render_timeout, default_css, max_html_size, no_sandbox.Для отсутствующих значений используются значения по умолчанию конструктора.ChromeRendererConfigПри несовпадении типов для необязательных ключей применяются значения по умолчанию.Подходит для массивов конфигурации в стиле фреймворка.
new ChromeHtmlRenderer(ChromeRendererConfig $config, ?LoggerInterface $logger = null, ?HtmlSecurityPolicyInterface $htmlSecurityPolicy = null)Конфигурация, необязательный логгер, необязательная политика HTML на уровне парсинга.Использует DefaultHtmlSecurityPolicy, если политика не передана.ChromeHtmlRendererОшибки настройки Chrome возникают при первой отрисовке.Отрисовщик владеет пулом браузеров до вызова close().
ChromeHtmlRenderer::render(string $html, float $widthPt, float $heightPt = 0)html: входной фрагмент; widthPt: ширина листа; heightPt: целевая высота или авто.Автоматически вычисляет высоту содержимого, когда heightPt <= 0.ChromeRenderResultChromeRenderException; сбой проверки размера HTML.Блокирует сетевые запросы к подресурсам через Chrome DevTools Protocol (CDP).
ChromeHtmlRenderer::getHtmlSecurityPolicy()нет.Возвращает настроенную политику уровня парсинга.HtmlSecurityPolicyInterfaceне ожидается.Дополняет средства контроля Chrome на транспортном уровне.
ChromeHtmlRenderer::close()нет.Закрывает пул браузеров и очищает его.voidИз нижележащей библиотеки могут всплывать ошибки завершения работы браузера.Вызывайте при завершении работы обработчика-воркера.

Используйте эти API, когда проверяете и оборачиваете внешний HTML перед отрисовкой, вместо прямого вызова ChromeHtmlRenderer::render(), где они уже вызываются.

СимволПараметрыПоведение по умолчаниюВозвращаетВыбрасывает или завершается с ошибкойПримечания
ChromeSecurityPolicy::validate(string $html, int $maxSize)Входной HTML и максимальный размер в байтах.Принимает входные данные, только если размер и недопустимые конструкции проходят проверку.voidChromeRenderException или исключение проверки.Запускайте перед отрисовкой в браузере, когда принимаете внешний HTML.
ChromeSecurityPolicy::wrapHtml(string $html, int $viewportWidth, string $defaultCss = '')Фрагмент HTML, ширина области просмотра, необязательный CSS по умолчанию.Формирует полный документ для отрисовки вокруг фрагмента.stringОшибки проверки или построения строки.Держит CSS, специфичный для отрисовщика, отдельно от HTML приложения.

Помощники для результата и преобразований

Заголовок раздела «Помощники для результата и преобразований»

Используйте эти помощники, чтобы читать результат отрисовки (ChromeRenderResult) и преобразовывать точки PDF в пиксели CSS Chrome и обратно при задании размера области просмотра или вычислении высоты.

СимволПараметрыПоведение по умолчаниюВозвращаетВыбрасывает или завершается с ошибкойПримечания
new ChromeRenderResult(string $pdfData, float $widthPt, float $heightPt, float $contentHeightCssPx)Сырые байты PDF, ширина, высота, измеренная высота содержимого.Нет проверок, кроме типизированных свойств конструктора.ChromeRenderResultне ожидается.Обычно возвращается из ChromeHtmlRenderer::render().
ChromeRenderResult::getPdfData()нет.Возвращает сырые байты PDF, созданные в Chrome.stringне ожидается.Используйте с PdfReader и PageImporter при встраивании.
ChromeRenderResult::getWidthPt()нет.Возвращает запрошенную ширину в точках.floatне ожидается.Используется для задания размера импортированного form-объекта.
ChromeRenderResult::getHeightPt()нет.Возвращает вычисленную или запрошенную высоту в точках.floatне ожидается.Автоматическая высота включает буфер макета печати.
ViewportCalculator::pointsToCssPx(float $pt)pt: точки PDF.Преобразует из расчёта 96 пикселей CSS на 72 точки PDF.intне ожидается.Округляется для ширины области просмотра Chrome.
ViewportCalculator::cssPxToPoints(float $px)px: пиксели CSS.Преобразует из расчёта 72 точки PDF на 96 пикселей CSS.floatне ожидается.Используется для вычисления автоматической высоты.

Это путь импорта. Распарсите байты PDF из Chrome с помощью PdfReader, затем передайте reader в PageImporter::import(), чтобы получить встраиваемую страницу; остальные методы PdfReader предназначены для диагностики.

СимволПараметрыПоведение по умолчаниюВозвращаетВыбрасывает или завершается с ошибкойПримечания
new PdfReader(string $data)data: полные байты PDF.Парсер не запускается до вызова parse().PdfReaderне ожидается.Предназначен для PDF, созданных в Chrome.
PdfReader::parse()нет.Парсит цепочку перекрёстных ссылок (xref) и трейлер.voidPdfParseException при недопустимой структуре PDF.Вызывайте перед доступом к object/page.
PdfReader::getObject(int $objNum)Номер объекта.Разрешает распарсенный объект по номеру.PdfObjectPdfParseException, когда объект отсутствует или повреждён.Используйте после parse().
PdfReader::getTrailer()нет.Возвращает распарсенный словарь трейлера.arrayPdfParseException, когда данные трейлера недоступны.Используется диагностикой и анализом ревизий.
PdfReader::getObjectNumbers()нет.Возвращает распарсенные номера объектов.arrayне ожидается после парсинга.Полезно для диагностики импортёра.
PdfReader::getPage(int $pageIndex)pageIndex: индекс страницы, отсчитываемый от нуля.Без неявного парсинга.PdfObjectPdfParseException, когда страница отсутствует или индекс вне диапазона.По умолчанию импортёр использует страницу 0.
PdfReader::getPageContentStream(PdfObject $page)page: распарсенный объект страницы.Разрешает поток содержимого.stringPdfParseException при недопустимых потоках.Пустой поток приводит к сбою импортёра.
PdfReader::getPageResources(PdfObject $page)page: распарсенный объект страницы.Разрешает ресурсы страницы.arrayPdfParseException при недопустимых ресурсах.Словарь ресурсов встраивается вместе с form-объектом.
PdfReader::getPageMediaBox(PdfObject $page)page: распарсенный объект страницы.Если отсутствует, возвращает размеры, близкие к A4.arrayСбои парсера.Возвращает координаты в пространстве PDF.
PdfReader::resolveRef(mixed $value)Распарсенное значение.Рекурсивно разрешает ссылки на объекты, где это применимо.mixedPdfParseException при недопустимых ссылках.Внутренний по уровню помощник, доступный для сценариев работы импортёра.
PdfReader::collectPageResources(PdfObject $page)page: распарсенный объект страницы.Обходит ссылки на ресурсы страницы.arrayСбои парсера.Используется для встраивания зависимых объектов вместе с импортированными страницами.
PdfReader::getRevisionCount()нет.Подсчитывает распарсенные инкрементальные ревизии.intне ожидается после парсинга.Полезно для подписанных или инкрементально обновлённых PDF.
PdfReader::getRevisionXRef(int $index)Индекс ревизии, отсчитываемый от нуля.Возвращает одну таблицу xref ревизии.RevisionXRefTablePdfParseException при недопустимом индексе.Используйте для низкоуровневой диагностики ревизий.
PdfReader::getRevisions()нет.Возвращает все распарсенные таблицы xref ревизий.arrayне ожидается после парсинга.Представление состояния парсера только для чтения.
PageImporter::import(PdfReader $reader, int $pageIndex = 0)Распарсенный reader и индекс страницы, отсчитываемый от нуля.Импортирует первую страницу, когда индекс не указан.ImportedFormXObjectPdfParseException, когда страницу не удаётся извлечь.Собирает поток содержимого, media box, ресурсы и объекты, на которые есть ссылки.

Эти объекты-значения и помощники возвращаются парсером или используются внутри него. Используйте их, когда исследуете импортированные объекты, ресурсы, потоки или таблицы ревизий.

СимволПараметрыПоведение по умолчаниюВозвращаетВыбрасывает или завершается с ошибкойПримечания
new ImportedFormXObject(string $contentStream, array $mediaBox, array $embeddedObjects, array $resourcesDict)Декодированный поток содержимого, media box, встроенные объекты, словарь ресурсов.Хранит самодостаточную полезную нагрузку импортированной формы.ImportedFormXObjectне ожидается.Обычно возвращается из PageImporter::import().
ImportedFormXObject::getWidth()нет.Возвращает ширину импортированной формы в точках.floatне ожидается.Используйте при размещении вывода Chrome на странице.
ImportedFormXObject::getHeight()нет.Возвращает высоту импортированной формы в точках.floatне ожидается.Результаты отрисовки с автоматической высотой передаются через это значение.
ImportedFormXObject::getEmbeddedObjects()нет.Возвращает объекты, необходимые импортированной форме.arrayне ожидается.Код записи использует эти объекты для сохранения ресурсов.
ImportedFormXObject::getResourcesDict()нет.Возвращает импортированный словарь ресурсов.arrayне ожидается.Используется при построении form XObject.
ImportedFormXObject::getMediaBox()нет.Возвращает импортированный media box.arrayне ожидается.Используйте для диагностики размещения.
ImportedFormXObject::getContentStream()нет.Возвращает импортированный поток содержимого страницы.stringне ожидается.Предназначен для интеграции writer/import.
new PdfObject(int $objectNumber, int $generation, array $dictionary, ?string $rawStreamData = null, ?string $decodedStreamData = null, ?string $rawDictionaryBytes = null)Номер объекта, поколение, распарсенный словарь, необязательные байты потока, необязательный декодированный поток, необязательные сырые байты словаря.Хранит распарсенное состояние объекта.PdfObjectне ожидается.Создаётся внутренними механизмами парсера.
PdfObject::getRawDictionaryBytes()нет.Возвращает исходные байты словаря, когда они доступны.`stringnull`не ожидается.
PdfObject::getRawStreamData()нет.Возвращает недекодированные байты потока, когда они доступны.`stringnull`не ожидается.
PdfObject::getDictionary()нет.Возвращает распарсенные записи словаря.arrayне ожидается.Представление парсера только для чтения.
PdfObject::get(string $key)Ключ словаря.Возвращает null, когда ключ отсутствует.mixedне ожидается.Избавляет вызывающий код от парсинга сырых словарей.
PdfObject::getRef(string $key)Ключ словаря.Возвращает кортеж ссылки на объект, когда значение является ссылкой.`arraynull`не ожидается.
PdfObject::getArray(string $key)Ключ словаря.Возвращает значение-массив или пустой массив, когда оно недоступно.arrayне ожидается.Удобная обёртка для записей словаря со значениями-массивами.
PdfObject::hasStream()нет.Проверяет, присутствуют ли байты потока.boolне ожидается.Отличает объекты, состоящие только из словаря.
PdfObject::getType()нет.Читает /Type.`stringnull`не ожидается.
PdfObject::getSubtype()нет.Читает /Subtype.`stringnull`не ожидается.
RevisionExtractor::extractRevision(string $pdfData, PdfReader $reader, int $revision)Байты PDF, распарсенный reader и индекс ревизии, отсчитываемый от нуля.Извлекает одну инкрементальную ревизию.stringPdfParseException при недопустимых границах.Используется тестами и диагностикой парсера.
RevisionExtractor::getRevisionBoundaries(string $pdfData, PdfReader $reader)Байты PDF и распарсенный reader.Обнаруживает диапазоны байтов для инкрементальных ревизий.arrayPdfParseException при некорректной структуре xref.Помогает анализировать подписанные или инкрементально обновлённые PDF.
`StreamDecoder::decode(string $data, stringarray $filter)`Байты потока и один или несколько фильтров PDF.Применяет фильтры по порядку.stringPdfParseException при неподдерживаемых или недопустимых фильтрах.
new ResourceCollector(PdfReader $reader)Распарсенный reader.Начинает с пустого набора собранных объектов.ResourceCollectorне ожидается.Используется в PdfReader::collectPageResources().
ResourceCollector::traverse(mixed $value, int $depth = 0)Распарсенное значение и глубина рекурсии.Обходит ссылки на ресурсы до внутренних ограничений глубины.voidСбои парсера при недопустимых ссылках.Внутренний помощник для замыкания ресурсов при импорте страницы.
ResourceCollector::getCollected()нет.Возвращает собранные объекты ресурсов.arrayне ожидается.Вызывайте после traverse().
new RevisionXRefTable(int $index, int $xrefOffset, array $xrefEntries, array $trailer, ?int $prevOffset)Индекс ревизии, смещение xref, записи xref, трейлер, необязательное предыдущее смещение.Неизменяемый снимок одной инкрементальной ревизии.RevisionXRefTableне ожидается.Создаётся внутренними механизмами парсера.
RevisionXRefTable::getObjectNumbers()нет.Возвращает номера объектов, активных в таблице ревизии.arrayне ожидается.Низкоуровневый API диагностики ревизий.
RevisionXRefTable::getActiveObjectCount()нет.Подсчитывает активные объекты.intне ожидается.Полезно для проверок парсера.
RevisionXRefTable::hasRootUpdate()нет.Сообщает, обновляет ли ревизия корень документа.boolне ожидается.Полезно для анализа инкрементальных обновлений.
RevisionXRefTable::getSize()нет.Возвращает значение размера таблицы xref.intне ожидается.Отражает распарсенные метаданные xref PDF.

Используйте эти API только для глубокой диагностики парсера или сокращения фикстур. Они открывают доступ к лексеру и механизму перекрёстных ссылок под PdfReader и не нужны при обычном импорте.

СимволПараметрыПоведение по умолчаниюВозвращаетВыбрасывает или завершается с ошибкойПримечания
new PdfTokenizer(string $data, int $offset = 0)Байты PDF и необязательное начальное смещение.Начинает со смещения ноль.PdfTokenizerне ожидается.Низкоуровневый лексический парсер.
PdfTokenizer::getOffset()нет.Возвращает текущее байтовое смещение.intне ожидается.Диагностический помощник для ошибок парсера.
PdfTokenizer::setOffset(int $offset)Байтовое смещение.Перемещает курсор токенизатора.voidPdfParseException при недопустимом смещении.Используйте осторожно: состоянием парсера владеет вызывающий код.
PdfTokenizer::isEof()нет.Проверяет, достиг ли курсор конца.boolне ожидается.Низкоуровневый помощник цикла парсера.
PdfTokenizer::skipWhitespace()нет.Продвигается за пробельные символы и комментарии PDF.voidне ожидается.Используется перед чтением токенов.
PdfTokenizer::readToken()нет.Читает следующий скалярный токен.`stringintfloat
PdfTokenizer::readName()нет.Читает объект-имя PDF.stringPdfParseException при некорректном имени.Декодирует escape-последовательности в имени.
PdfTokenizer::readLiteralString()нет.Читает литеральную строку.stringPdfParseException при некорректной строке.Обрабатывает вложенные скобки и escape-последовательности.
PdfTokenizer::readHexString()нет.Читает шестнадцатеричную строку.stringPdfParseException при некорректном hex.Дополняет hex нечётной длины по правилам парсера.
PdfTokenizer::readNumber()нет.Читает целое число или число с плавающей точкой.`intfloat`PdfParseException при недопустимом числе.
PdfTokenizer::readKeyword()нет.Читает ключевое слово PDF.stringPdfParseException при недопустимом ключевом слове.Сохраняет парсинг ключевых слов централизованным.
PdfTokenizer::readDictionary()нет.Читает словарь PDF.arrayPdfParseException при некорректных словарях.Используется для объектов, потоков и трейлеров.
PdfTokenizer::readArray()нет.Читает массив PDF.arrayPdfParseException при некорректных массивах.Рекурсивный помощник парсера.
PdfTokenizer::readValue()нет.Читает любое поддерживаемое значение PDF.mixedPdfParseException при некорректных значениях.Распространённый примитив парсера.
PdfTokenizer::readStreamData(int $length)Длина потока.Читает ровно запрошенные байты потока.stringPdfParseException при недопустимых границах потока.Используется после определения длины потока из словаря.
PdfTokenizer::peek(int $length = 1)Количество байтов.Читает вперёд без продвижения.stringне ожидается.Полезно для ветвления парсера.
PdfTokenizer::searchBackward(string $pattern, int $startFrom = 0)Шаблон и необязательное начальное смещение.Ищет назад от конца или от заданного смещения.`intfalse`не ожидается.
PdfTokenizer::readLine()нет.Читает строку с текущего смещения.stringне ожидается.Низкоуровневый помощник сканера.
CrossRefParser::parseXRefTable(string $data, int $offset)Байты PDF и смещение таблицы xref.Парсит записи классической таблицы перекрёстных ссылок.arrayPdfParseException при некорректных данных xref.Низкоуровневый API парсера.
CrossRefParser::parseXRefStream(string $data, int $offset)Байты PDF и смещение потока xref.Парсит записи потока перекрёстных ссылок.arrayPdfParseException при некорректных данных потока.Поддерживает современные потоки xref PDF.

EInvoiceServiceFactory лениво разрешает необязательные контракты Premium для электронных счетов и возвращает null, когда они отсутствуют. BrowserPool управляет жизненным циклом Chrome, которым владеет отрисовщик; управляйте им напрямую только в долго работающих обработчиках-воркерах.

СимволПараметрыПоведение по умолчаниюВозвращаетВыбрасывает или завершается с ошибкойПримечания
EInvoiceServiceFactory::makeEmbedder()нет.Возвращает null, если не установлена поддержка электронных счетов Premium Pro.`EmbedderInterfacenull`Ошибки создания необязательного пакета.
EInvoiceServiceFactory::makeValidator()нет.Возвращает null, если не установлена поддержка проверки Premium Enterprise.`ValidatorInterfacenull`Ошибки создания необязательного пакета.
EInvoiceServiceFactory::makeDefaultProfile()нет.Возвращает профиль электронного счёта по умолчанию, если он доступен.`ProfileInterfacenull`Ошибки необязательного пакета.
EInvoiceServiceFactory::makeSchematronRunner()нет.Возвращает null, если не установлена поддержка Schematron Premium Enterprise.`SchematronRunnerInterfacenull`Ошибки создания необязательного пакета.
new BrowserPool(ChromeRendererConfig $config, ?LoggerInterface $logger = null)Конфигурация отрисовщика и необязательный логгер.Браузер запускается лениво при первом вызове getBrowser().BrowserPoolне ожидается до запуска браузера.Помощник жизненного цикла, которым владеет отрисовщик.
BrowserPool::getBrowser()нет.Запускает или возвращает текущий экземпляр браузера Chrome.BrowserОшибки запуска браузера.Помощник жизненного цикла, которым владеет отрисовщик.
BrowserPool::incrementRenderCount()нет.Увеличивает счётчик отрисовок и выполняет ротацию, когда этого требует политика пула.voidОшибки жизненного цикла браузера.Используется долго работающими обработчиками-воркерами.
BrowserPool::close()нет.Закрывает управляемый экземпляр браузера.voidОшибки завершения работы браузера.Вызывайте при завершении работы обработчика-воркера.
  • Отрисовщик не является браузерной песочницей для недоверенного HTML. Перед отрисовкой проверяйте размер, политику ресурсов и авторизацию вызывающей стороны.
  • API парсера намеренно узкие. Используйте их для импорта вывода Chrome, а не для общего восстановления PDF.
  • Явно закрывайте отрисовщики в долго живущих обработчиках-воркерах.