Bỏ qua để đến nội dung

Hướng dẫn cho nhà phát triển Gotenberg

Gói Gotenberg chuyển tác vụ chuyển đổi sang Portable Document Format (PDF) cho một dịch vụ bên ngoài. Trong mã ứng dụng, hãy giữ ranh giới dịch vụ đó thật rõ ràng: xác thực đầu vào, dựng payload, gửi yêu cầu, phân tích kết quả và xử lý lỗi dịch vụ.

Hãy dùng hướng dẫn này khi xây dựng quy trình chuyển đổi office sang PDF, endpoint tải lên, kiểm tra tình trạng dịch vụ hoặc chính sách truyền tải xoay quanh nextpdf/gotenberg.

LớpThuộc vềTrách nhiệmĐừng đặt ở đây
Nguồn tải lên hoặc tài liệuỨng dụngCấp quyền cho bên gọi, xác thực nguồn và chọn chính sách chuyển đổi.Quyết định về endpoint dịch vụ hoặc pinning truyền tải.
Phát hiện định dạngnextpdf/gotenbergÁnh xạ các phần mở rộng an toàn sang OfficeFormat.Tin vào media type đã khai báo mà không xác thực ở phía ứng dụng.
Bridgenextpdf/gotenbergDựng yêu cầu multipart, gọi Gotenberg và phân tích phản hồi PDF.Truy vấn miền hoặc chính sách lưu trữ.
Dịch vụ GotenbergTriển khaiChuyển đổi tài liệu office sang PDF.Cấp quyền trong ứng dụng Hypertext Preprocessor (PHP).
Engine lõinextpdf/nextpdfNhập hoặc gộp dữ liệu PDF đã chuyển đổi khi cần.Chuyển đổi office.
Giai đoạnHành viHành động của nhà phát triển
Tạo cấu hìnhEndpoint application programming interface (API), thời gian chờ, kích thước tối đa, API key và các pin được nạp từ cấu hình.Hãy để endpoint dịch vụ và token ở ngoài mã nguồn.
Xác thực đầu vàoĐường dẫn tệp, kích thước tệp, tên tệp, phần mở rộng và độ an toàn của Uniform Resource Locator (URL) đều được kiểm tra.Hãy từ chối đầu vào không được hỗ trợ trước khi gửi đi.
Dựng payloadGotenbergConvertPayload dựng dữ liệu form multipart.Chỉ giữ lại tên tệp gốc khi nó an toàn.
Yêu cầu dịch vụBridge gửi yêu cầu đến /forms/libreoffice/convert.Cấu hình thời gian chờ và chính sách truyền tải.
Phân tích kết quảGotenbergResponseParser::parse() trả về các byte PDF và metadata.Hãy xem các phản hồi không phải PDF và các phản hồi lỗi là lỗi chuyển đổi.
Đường dẫnMục đích
app/Pdf/Conversion/*Lớp bao bọc ở phía ứng dụng quanh GotenbergBridge.
app/Pdf/Uploads/*Xác thực tải lên, lưu trữ và chính sách tên tệp.
app/Pdf/ConversionPolicy/*Chính sách về kích thước, định dạng và lựa chọn dịch vụ.
tests/Pdf/Conversion/*Các bài kiểm thử về định dạng, tệp, dịch vụ và truyền tải.

Hãy tách xác thực tệp khỏi chuyển đổi. Dịch vụ chuyển đổi của bạn nên nhận đầu vào đã được cấp quyền, đồng thời vẫn dựa vào phần xác thực của gói như một lớp phòng thủ chiều sâu.

<?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;
}
}
MẫuAPIDùng khiRàng buộc
Chuyển đổi từ đường dẫn tệpGotenbergBridge::convertFile()Tài liệu đã được lưu sẵn trên đĩa.Đường dẫn phải đọc được và đã được chính sách phê duyệt.
Chuyển đổi từ byte trong bộ nhớGotenbergBridge::convertString()Ứng dụng của bạn đã có sẵn byte từ một lượt tải lên hoặc kho lưu trữ đối tượng.Tên tệp vẫn quyết định việc phát hiện định dạng.
Dựng payload trực tiếpGotenbergConvertPayloadBạn cần các byte multipart cho bài kiểm thử hoặc mã truyền tải tùy chỉnh.Hãy giữ việc tạo boundary ở ngoài đầu vào của người dùng.
Phân tích phản hồi trực tiếpGotenbergResponseParser::parse()Các lệnh gọi Hypertext Transfer Protocol (HTTP) tùy chỉnh vẫn cần phần phân tích của gói.Bạn phải truyền vào OfficeFormat dự kiến.

GotenbergBridge::isAvailable() là tín hiệu về mức độ sẵn sàng, không phải lớp bảo vệ thời gian chạy duy nhất của bạn. Một dịch vụ có thể vượt qua kiểm tra sẵn sàng nhưng vẫn thất bại ở lượt chuyển đổi tiếp theo.

Kiểm traMục đíchLưu ý vận hành
Tính hợp lệ của cấu hìnhPhát hiện endpoint API bị thiếu.Hãy chạy kiểm tra này khi khởi động ứng dụng hoặc trong các bước kiểm tra triển khai.
/health sẵn sàngPhát hiện xem dịch vụ có truy cập được hay không.Hãy dùng kiểm tra này cho các bảng theo dõi mức độ sẵn sàng.
Chuyển đổi fixture nhỏPhát hiện hành vi LibreOffice bị hỏng hoặc dịch vụ bị thoái lui.Hãy chạy kiểm tra này trong các bài kiểm thử smoke theo lịch, không phải trên mỗi yêu cầu.
Giám sát thời gian chờPhát hiện hành vi dịch vụ chậm.Hãy theo dõi theo định dạng và kích thước tệp.
Điểm mở rộngDùng choRàng buộc
PHP Standard Recommendation (PSR)-18 ClientInterfaceHành vi HTTP client tùy chỉnh.Phải tuân thủ ngữ nghĩa phản hồi và ngoại lệ của PSR-18.
PSR-17 factoriesTạo request và stream.Bắt buộc để dựng bridge.
HtmlSecurityPolicyInterfaceChính sách ở lớp phân tích cho các đầu vào Hypertext Markup Language (HTML).Bổ trợ cho chính sách bảo mật của Gotenberg.
ResponseFactoryInterfaceDựng phản hồi cho truyền tải cURL có pinning.Chỉ bắt buộc khi bạn dùng đường truyền tải của gói.
GotenbergSecurityPolicyXác thực URL, kích thước tệp, tên tệp và pin.Hãy giữ phần cấp quyền ứng dụng ở ngoài lớp này.
  1. Hãy bắt đầu với convertString() trong các bài kiểm thử để fixture luôn rõ ràng.
  2. Chỉ thêm convertFile() sau khi các đường dẫn hệ thống tệp đã được kiểm soát.
  3. Hãy giữ kích thước tệp tối đa thấp hơn giới hạn của dịch vụ và hạ tầng.
  4. Hãy dùng isAvailable() cho các tín hiệu về mức độ sẵn sàng, chứ không thay thế cho việc xử lý lỗi.
  5. Hãy ghi log tên tệp, định dạng, kích thước, trạng thái và thời lượng. Đừng ghi log các byte của tài liệu.
  6. Hãy thêm các bài kiểm thử về thời gian chờ và chế độ lỗi trước khi bạn mở các endpoint tải lên.
LỗiNơi nên được xử lýPhản hồi được khuyến nghị
Phần mở rộng không được hỗ trợPhát hiện định dạng.Hãy từ chối trước khi bạn gửi đến dịch vụ.
Tên tệp không an toànChính sách bảo mật.Hãy từ chối tệp đó và chuẩn hóa chính sách đặt tên khi tải lên.
Tệp quá kích thướcChính sách tải lên và phần xác thực của gói.Hãy từ chối trước khi đọc hoặc gửi payload lớn.
Gotenberg không khả dụngRanh giới bridge.Trả về một lỗi ứng dụng có thể thử lại khi phù hợp.
Phản hồi không phải PDFBộ phân tích phản hồi.Hãy xem đó là lỗi chuyển đổi và ghi lại trạng thái của dịch vụ.
Lỗi xác thực pin hoặc URLChính sách truyền tải.Hãy fail closed và cảnh báo cho người vận hành.
Vấn đềMặc địnhKhi nào nên ghi đè
Thời gian chờ30 giây.Chỉ tăng lên sau khi bạn đo được độ trễ thực tế của dịch vụ.
Kích thước tệp tối đa52,428,800 byte.Hãy hạ thấp cho các endpoint công khai hoặc đa người thuê.
API keyTrống.Thiết lập cho các bản triển khai Gotenberg riêng tư.
Các định dạng được hỗ trợdocx, xlsx, pptx, odt, ods, odp.Chỉ thêm các định dạng khi OfficeFormat và bộ phân tích hỗ trợ chúng.
Tập pinTrống.Hãy thêm pin kèm pin dự phòng và một quy trình luân chuyển.
  • Các bài kiểm thử về định dạng bao quát cả phần mở rộng được hỗ trợ và không được hỗ trợ.
  • Các bài kiểm thử về tệp bao quát các tệp bị thiếu, tệp không đọc được, tệp quá kích thước và tên tệp không an toàn.
  • Các bài kiểm thử về dịch vụ bao quát các phản hồi không phải 2xx, phần thân phản hồi không hợp lệ và các ngoại lệ truyền tải.
  • Các bài kiểm thử về bảo mật bao quát các URL dịch vụ riêng tư hoặc không hợp lệ khi chính sách cấm chúng.
  • Các bài kiểm thử về thời gian chờ khẳng định rằng thời gian chờ đã cấu hình được truyền tới lớp truyền tải.
  • Các bài kiểm thử về fixture giữ cho các tài liệu mẫu nhỏ gọn và không nhạy cảm.