跳到內容

Gotenberg 開發者指南

Gotenberg 套件會將轉換工作委派給外部服務。應用程式碼應清楚劃定服務邊界:驗證輸入、組出 payload、送出請求、解析(resolve)結果,並處理服務失敗。

當你要建置 office 轉 PDF 的轉換流程、上傳 endpoint、服務健康檢查,或設計圍繞 nextpdf/gotenberg 的傳輸政策時,請參閱本指南。

層級由誰擁有職責不應放在此處
上傳或文件來源應用程式授權呼叫端、驗證來源、選擇轉換政策。服務 URL 或傳輸 pinning 決策。
格式偵測nextpdf/gotenberg將安全的副檔名對映到 OfficeFormat未經應用程式驗證就信任 MIME。
橋接層nextpdf/gotenberg組裝 multipart 請求、呼叫 Gotenberg、解析 PDF 回應。領域查詢或儲存政策。
Gotenberg 服務部署把 office 文件轉換成 PDF。PHP 應用程式的授權。
核心引擎nextpdf/nextpdf視需要匯入或合併已轉換的 PDF 資料。Office 轉換。
階段行為開發者該做的事
建立組態載入 API URL、timeout、最大大小、API key 與 pins。不要把服務 URL 與 token 寫進原始碼。
輸入驗證檢查檔案路徑、檔案大小、檔名、副檔名與 URL 安全性。在派送前先拒絕不支援的輸入。
組出 payloadGotenbergConvertPayload 會組成 multipart 表單資料。只有在安全時才保留原始檔名。
服務請求橋接層會將請求送往 /forms/libreoffice/convert設定 timeout 與傳輸政策。
解析結果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()應用程式已從上傳或物件儲存取得位元組。格式偵測仍由檔名主導。
直接組出 payloadGotenbergConvertPayload測試或自訂傳輸程式碼需要 multipart 位元組。讓 boundary 產生過程不受使用者輸入影響。
直接解析回應GotenbergResponseParser::parse()自訂 HTTP 呼叫仍需要沿用套件解析邏輯。必須傳入預期的 OfficeFormat

GotenbergBridge::isAvailable() 是就緒訊號。它不應是唯一的執行期防護。服務可能在就緒檢查時可用,下一次轉換卻仍然失敗。

檢查項目用途維運備註
組態有效性偵測缺漏的 API URL。在應用程式啟動或部署檢查時執行。
/health 可用性偵測服務是否可連線。用於就緒狀態儀表板。
小型 fixture 轉換偵測 LibreOffice 故障或服務退化。在排程的 smoke 測試中執行,不要每次請求都跑。
timeout 監控偵測服務回應變慢的情況。依格式與檔案大小追蹤。
擴充點用於限制
PSR-18 ClientInterface自訂 HTTP 用戶端行為。必須遵循 PSR-18 的 response/exception 語意。
PSR-17 工廠建立請求與串流。建構橋接層時必需。
HtmlSecurityPolicyInterface針對 HTML 輸入的解析層政策。與 Gotenberg 安全政策互補。
ResponseFactoryInterface以 pinned cURL 傳輸建構回應。只有在使用套件的傳輸路徑時才需要。
GotenbergSecurityPolicy驗證 URL、檔案大小、檔名與 pin。將應用程式授權留在這一層之外。
  1. 測試時先用 convertString(),讓 fixture 清楚可見。
  2. 只有在檔案系統路徑受控之後才加入 convertFile()
  3. 將最大檔案大小設定在服務與基礎設施限制之下。
  4. isAvailable() 當作就緒訊號,而非錯誤處理的替代品。
  5. 記錄檔名、格式、大小、狀態與耗時。不要記錄文件的位元組內容。
  6. 開放上傳 endpoint 前,先加入 timeout 與失敗模式的測試。
失敗應在哪裡處理建議的回應方式
不支援的副檔名格式偵測。在派送至服務前先拒絕。
不安全的檔名安全政策。拒絕,並依上傳命名政策進行正規化。
超大檔案上傳政策與套件驗證。在讀取或送出大型 payload 之前先拒絕。
Gotenberg 無法使用橋接邊界。視情況回傳可重試的應用程式錯誤。
非 PDF 回應回應解析器。視為轉換失敗,並記錄服務狀態。
pin 或 URL 驗證失敗傳輸政策。安全地關閉,並通知維運人員。
關注項目預設值何時應覆寫
逾時(timeout)30 秒。只有在量測過實際服務延遲後才調高。
最大檔案大小52,428,800 位元組。在公開或多租戶 endpoint 上應調低。
API 金鑰空白。為私有 Gotenberg 部署設定。
支援的格式docxxlsxpptxodtodsodp只有在 OfficeFormat 與解析器都支援時才新增格式。
pin 組空白。新增 pin 時,請一併加入備援 pin 與輪替程序。
  • 格式測試需涵蓋支援與不支援的副檔名。
  • 檔案測試需涵蓋缺漏、無法讀取、超大與不安全的檔名。
  • 服務測試需涵蓋非 2xx 回應、無效的回應主體與傳輸例外。
  • 安全測試需涵蓋政策禁止的私有服務 URL 或無效服務 URL。
  • timeout 測試需斷言已設定的 timeout 會傳入傳輸層。
  • fixture 測試應讓範例文件保持小型,且不含敏感資料。