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

Руководство разработчика по Gotenberg

Пакет Gotenberg делегирует преобразование в Portable Document Format (PDF) внешней службе. В коде приложения явно фиксируйте эту границу службы: проверяйте входные данные, формируйте полезную нагрузку, отправляйте запрос, разбирайте результат и обрабатывайте сбои службы.

Используйте это руководство при создании процессов преобразования офисных документов в PDF, конечных точек загрузки, проверок работоспособности службы или транспортной политики для nextpdf/gotenberg.

СлойКому принадлежитОтветственностьЧто не размещать здесь
Источник загрузки или документаПриложениеАвторизует вызывающую сторону, проверяет источник и выбирает политику преобразования.Выбор конечной точки службы или закрепления транспорта.
Определение форматаnextpdf/gotenbergСопоставляет безопасные расширения с OfficeFormat.Доверие к заявленным типам мультимедиа без проверки на стороне приложения.
Мостnextpdf/gotenbergФормирует составной (multipart) запрос, вызывает Gotenberg и разбирает ответ в формате PDF.Запросы предметной области или политика хранения.
Служба GotenbergразвёртываниеПреобразует офисный документ в PDF.Авторизация приложения Hypertext Preprocessor (PHP).
Базовый движокnextpdf/nextpdfИмпортирует или объединяет преобразованные данные PDF при необходимости.Преобразование офисных документов.
ЭтапПоведениеДействие разработчика
Создание конфигурацииКонечная точка application programming interface (API), тайм-аут, максимальный размер, ключ API и закрепления загружаются из конфигурации.Храните конечную точку службы и токен вне исходного кода.
Проверка входных данныхПроверяются путь к файлу, размер файла, имя файла, расширение и безопасность Uniform Resource Locator (URL).Отклоняйте неподдерживаемые входные данные до отправки.
Построение полезной нагрузкиGotenbergConvertPayload формирует данные составной формы (multipart).Сохраняйте исходное имя файла только там, где это безопасно.
Запрос к службеМост отправляет запрос на /forms/libreoffice/convert.Настройте тайм-аут и транспортную политику.
Разбор результатаGotenbergResponseParser::parse() возвращает байты PDF и метаданные.Считайте ответы с ошибками и ответы не в формате PDF сбоями преобразования.
ПутьНазначение
app/Pdf/Conversion/*Обёртка приложения вокруг GotenbergBridge.
app/Pdf/Uploads/*Проверка загрузки, хранение и политика именования файлов.
app/Pdf/ConversionPolicy/*Политика выбора размера, формата и службы.
tests/Pdf/Conversion/*Тесты формата, файла, службы и транспорта.

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

<?php
use NextPDF\Gotenberg\GotenbergBridge;
final readonly class OfficeConversionService
{
public function __construct(
private GotenbergBridge $bridge,
) {}
public function convertUploadedFile(string $safePath): string
{
$result = $this->bridge->convertFile($safePath);
if (!$result->isValid()) {
throw new RuntimeException('The conversion service did not return a valid PDF.');
}
return $result->pdfData;
}
}
ШаблонAPIКогда использоватьОграничение
Преобразование по пути к файлуGotenbergBridge::convertFile()Документ уже сохранён на диске.Путь должен быть доступен для чтения и одобрен политикой.
Преобразование байтов в памятиGotenbergBridge::convertString()У приложения уже есть байты из загрузки или объектного хранилища.Определение формата по-прежнему зависит от имени файла.
Построение полезной нагрузки напрямуюGotenbergConvertPayloadНужны составные (multipart) байты для тестов или собственного транспортного кода.Генерируйте разделитель (boundary) независимо от пользовательского ввода.
Разбор ответа напрямуюGotenbergResponseParser::parse()Собственным вызовам Hypertext Transfer Protocol (HTTP) по-прежнему нужен парсер пакета.Нужно передать ожидаемый OfficeFormat.

GotenbergBridge::isAvailable() — это сигнал готовности, а не ваша единственная защита во время выполнения. Служба может пройти проверку готовности и всё равно дать сбой при следующем преобразовании.

ПроверкаНазначениеЭксплуатационное примечание
Корректность конфигурацииОбнаружение отсутствующей конечной точки API.Проверяйте это при загрузке приложения или во время проверок развёртывания.
/health доступностьПроверка доступности службы.Используйте это для панелей мониторинга готовности.
Преобразование небольшой фикстурыВыявление сбойного поведения LibreOffice или регрессии службы.Запускайте это в плановых дымовых тестах, а не при каждом запросе.
Мониторинг тайм-аутовОбнаружение медленной работы службы.Отслеживайте по формату и размеру файла.
Точка расширенияИспользуйте её дляОграничение
Рекомендация по стандартам PHP (PSR)-18 ClientInterfaceСобственное поведение HTTP-клиента.Поведение должно следовать семантике ответов и исключений PSR-18.
Фабрики PSR-17Создание запроса и потока.Требуются для построения моста.
HtmlSecurityPolicyInterfaceПолитика уровня разбора для входных данных Hypertext Markup Language (HTML).Дополняет политику безопасности Gotenberg.
ResponseFactoryInterfaceПостроение ответа закреплённого транспорта cURL.Требуется только при использовании транспортного пути пакета.
GotenbergSecurityPolicyПроверка URL, размера файла, имени файла и закреплений.Держите авторизацию приложения вне этого уровня.
  1. Начните с convertString() в тестах, чтобы фикстуры оставались явными.
  2. Добавляйте convertFile() только после того, как пути файловой системы будут под контролем.
  3. Держите максимальный размер файла ниже лимитов службы и инфраструктуры.
  4. Используйте isAvailable() для сигналов готовности, а не как замену обработки ошибок.
  5. Записывайте в журнал имя файла, формат, размер, статус и длительность. Не записывайте в журнал байты документа.
  6. Добавьте тесты тайм-аутов и режимов сбоев перед открытием конечных точек загрузки.
СбойГде его следует обрабатыватьРекомендуемая реакция
Неподдерживаемое расширениеОпределение формата.Отклоните до того, как отправите в службу.
Небезопасное имя файлаПолитика безопасности.Отклоните его и нормализуйте политику именования при загрузке.
Файл сверх допустимого размераПолитика загрузки и проверка в пакете.Отклоните до того, как прочитаете или отправите крупные полезные нагрузки.
Gotenberg недоступенГраница моста.Верните ошибку приложения, допускающую повторную попытку, когда это уместно.
Ответ, отличный от PDFПарсер ответов.Считайте это сбоем преобразования и зафиксируйте статус службы.
Сбой проверки закрепления или URLТранспортная политика.Завершите отказом по принципу fail-closed и оповестите операторов.
АспектПо умолчаниюКогда переопределять
Тайм-аут30 секунд.Увеличивайте только после того, как измерите реальную задержку службы.
Максимальный размер файла52,428,800 байт.Понизьте для публичных или многопользовательских конечных точек.
Ключ APIПусто.Задайте для частных развёртываний Gotenberg.
Поддерживаемые форматыdocx, xlsx, pptx, odt, ods, odp.Добавляйте форматы только тогда, когда их поддерживают OfficeFormat и парсер.
Наборы закрепленийПусто.Добавляйте их вместе с резервными закреплениями и процедурой ротации.
  • Тесты формата охватывают поддерживаемые и неподдерживаемые расширения.
  • Тесты файлов охватывают отсутствующие файлы, нечитаемые файлы, файлы сверх допустимого размера и небезопасные имена файлов.
  • Тесты службы охватывают ответы, отличные от 2xx, недопустимые тела ответов и транспортные исключения.
  • Тесты безопасности охватывают частные или недопустимые URL службы, когда политика их запрещает.
  • Тесты тайм-аутов проверяют, что настроенный тайм-аут передаётся в транспорт.
  • В тестах с фикстурами образцы документов должны быть небольшими и не содержать конфиденциальных данных.