Nhập Form XObject SVG

THotPDF.ImportSVGFormXObject phân tích SVG một lần và đăng ký một Form XObject PDF tái sử dụng, còn THPDFPage.DrawSVGFormXObject đặt nó ở mọi kích thước và tùy chọn tạo chú thích liên kết trang

Khai báo

function ImportSVGFormXObject(const Input: TBytes): AnsiString; overload;
function ImportSVGFormXObject(
  const Input: TBytes;
  out Statistics: THPDFSVGImportStatistics
): AnsiString; overload;

procedure DrawSVGFormXObject(
  const FormName: AnsiString;
  X, Y, W, H: Single;
  AddLinks: Boolean = True
);

Hồ sơ vector

Biên giới văn bản và màu sơn

Văn bản hỗ trợ tô đặc, biến thể đậm và nghiêng, cỡ chữ, phép biến đổi, neo, độ mờ, và clip hình học; sơn văn bản gradient fail closed, và mỗi node text hoặc tspan vẫn là một run định vị độc lập chứ không phải một engine bố cục luồng văn bản SVG hoàn chỉnh

Nhập văn bản tài liệu giữ nguyên face đậm và nghiêng đã chọn qua các kiểm tra glyph nhận biết style và bố cục fallback, bảo toàn ink bounds đã đo, và từ chối các glyph thực sự chưa giải quyết được

Văn bản UTF-8 và tham chiếu ký tự XML thập lục phân hoặc thập phân bảo toàn cùng các scalar Unicode trên Delphi lẫn FPC, bao gồm các scalar supplementary được biểu diễn bằng cặp surrogate UTF-16

Overload HPDFBuildSVGFormData đứng riêng không có text builder dùng advance đã đo của Helvetica, Times, và Courier Base 14 và từ chối ký tự ngoài WinAnsi thay vì thay bằng dấu hỏi; overload có THPDFSVGTextRunBuilder nhận các form văn bản nhúng và số liệu do bên gọi cung cấp

Gradient giữ nguyên phép xấp xỉ dải vector có giới hạn; tài nguyên trong suốt đòi hỏi PDF 1.4 và bị profile nghiêm ngặt PDF/A-1 từ chối

Style nét

stroke-dasharray, stroke-dashoffset, và stroke-miterlimit hoạt động qua thuộc tính trình bày, CSS nhúng, style nội tuyến, và kế thừa, bao gồm nhóm và các instance use chỉ đến phân đoạn

Mảng dash nhận các số phân tách bằng dấu phẩy hoặc khoảng trắng cùng các độ dài được hỗ trợ; phần trăm dùng đường chéo viewport đã chuẩn hóa, tính theo sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)

Mảng lẻ độ dài được lặp lại để tạo pattern chẵn độ dài, mỗi đường con khởi động lại pattern, và offset dương hoặc âm chạy vòng qua pattern trọn vẹn; none và mảng toàn số không cho ra nét đặc

Dash độ dài bằng không vẫn được sơn và giữ dấu cap tròn hoặc vuông; nét đặc thường, pattern nét gradient, clip, mask, và nhóm opacity isolated dùng chung các cài đặt nét đã chọn

Giới hạn miter mặc định là 4; các giá trị SVG 2 từ 0 đến 1 được chấp nhận và dùng nối bevel tại nơi miter sẽ vượt giới hạn, trong khi biên giới tài nguyên gradient và transparency giữ nối sắc trong giới hạn đã chọn

Dựng gốc dùng hình học dash có giới hạn để giữ offset, độ dài phân số, và mảng dài hơn giới hạn bút GDI, với flattening đường cong thích nghi và nối sơn liên tục xuyên qua biên giới đoạn

Hiệu chỉnh dash bằng pathLength vẫn nằm ngoài profile này; hình kết hợp mảng dash không đặc với pathLength fail closed thay vì lặng lẽ dùng độ dài chưa hiệu chỉnh

Ngữ nghĩa nét theo mô hình nét SVG 2 trong các ngân sách parser và renderer mô tả dưới đây

Cấu hình shaping văn bản

Văn bản SVG nhúng dùng các cài đặt ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam, và AutoShapeHanifiRohingya của tài liệu nhập, cùng các lựa chọn script và ngôn ngữ GSUB và chuỗi font fallback của tài liệu

Các cài đặt này áp dụng trong cả advance đã đo lẫn text appearance được tạo ra mà không đổi cấu hình của bên gọi; shaping vẫn là tùy chọn chủ động và đòi hỏi font cung cấp các glyph cùng bảng OpenType được yêu cầu

Mỗi text appearance được tạo nhận tối đa 256 lựa chọn font shaping phân biệt và 64 MiB dữ liệu font thô cộng dồn; dữ liệu font không được hỗ trợ hoặc vượt giới hạn sẽ làm import thất bại nguyên tử

Độ mờ đối tượng và nhóm

opacity áp dụng một lần lên kết quả sơn trọn vẹn của node của nó và không được kế thừa bởi phần tử con; fill-opacity và stroke-opacity giữ các giá trị sơn kế thừa riêng của chúng

Hai hình chữ nhật đỏ đặc chồng lấn bên trong <g opacity="0.5"> vẫn đồng đều trong suốt ở vùng chồng, trong khi hai hình chữ nhật độc lập trong suốt trở nên đậm hơn nơi chúng chồng nhau

Nhóm lồng nhau composite theo thứ tự: hai độ mờ bao ngoài 0.5 cho hiệu ứng thực tế 0.25 lên một phần tử con đặc, và opacity tường minh bằng 1 của phần tử con không ghi đè nhóm bao ngoài

Node SVG gốc, container, liên kết, tham chiếu phân đoạn, văn bản, ảnh, và hình dùng chung đường dẫn opacity đối tượng; tham chiếu use chỉ đến phân đoạn bảo toàn style của cả instance lẫn node được tham chiếu

Alpha tô và nét vẫn độc lập, kể cả tại vùng chồng của chúng bên trong một đối tượng trong suốt, và alpha stop gradient kết hợp với alpha sơn tương ứng trước khi composite đối tượng

Hiệu ứng clip và mask thuộc về node của chúng thay vì kế thừa như cài đặt sơn của phần tử con; hình học liên kết vẫn nhận biết vị trí, và biên giới Form isolated thận trọng giữ nét và cap đã biến đổi

Importer giữ toán tử vector, form văn bản nhúng, tài nguyên ảnh, pattern, và mask bên trong các nhóm isolated; nó không flatten toàn bộ SVG thành bitmap

Hành vi được hỗ trợ theo mô hình opacity đối tượng và nhóm của SVG; các giới hạn văn bản, gradient, và hình học khác trên trang này vẫn áp dụng

Bảo mật và ngân sách

Bộ nhập chấp nhận SVG thuần hoặc nén gzip tối đa 8 MiB, giới hạn đầu vào mở rộng ở 32 MiB, toán tử chính, pattern, mask, và nhóm gộp lại ở 16 MiB, nút ở 4.096, độ lồng ở 64 cấp, quy tắc CSS ở 256 và giá trị đường dẫn ở 100.000

Ảnh nhúng chỉ nhận payload Base64 nghiêm ngặt data:image/png;base64, và data:image/jpeg;base64,, với tối đa 128 ảnh, 16.384 pixel mỗi chiều, và 16.777.216 pixel đã giải mã trên toàn bộ ảnh; kích thước được kiểm tra trước khi giải mã gốc

Văn bản giới hạn 128 run và 65.536 đơn vị UTF-16 mỗi run, còn pattern nét gradient, mask, và nhóm opacity được giới hạn mỗi loại 128 tài nguyên; tham chiếu mask đệ quy fail closed

Mảng dash chứa tối đa 64 mục nguồn trước khi mở rộng mảng lẻ; mục dương phải ít nhất 0,000001 đơn vị người dùng, độ dài riêng lẻ và chu kỳ chuẩn hóa không được vượt 1.000.000.000, offset tuyệt đối không được vượt 1.000.000.000, và giới hạn miter phải nằm giữa 0 và 1.000.000

Hiệu ứng transparency lồng nhau thực tế giới hạn tám cấp để khớp renderer gốc, độc lập với giới hạn chiều sâu cây SVG; container lồng nhau thường không có hiệu ứng transparency không tốn hạn mức này

Biên giới hiệu ứng transparency phải hữu hạn và mỗi tọa độ phải nằm trong giá trị tuyệt đối 1.000.000.000; import ngoài profile tọa độ có giới hạn này thất bại trước khi đăng ký nhóm hoặc mask

Import thất bại rollback các đối tượng đã tạo, form văn bản nhúng, mục registry, và trạng thái phiên bản cùng màu thiết bị, nên bên gọi có thể tái sử dụng cùng tài liệu và bảo toàn một graph transaction bao ngoài

Script, trình xử lý sự kiện, DTD, foreignObject, kiểu media dữ liệu không được hỗ trợ, URL JavaScript, và URL sơn hoặc tài nguyên ảnh ngoài đều fail closed

Tham chiếu phân đoạn như url(#gradient), url(#clip) và href="#symbol" vẫn nằm trong tài liệu đã phân tích và không bao giờ kích hoạt truy cập tệp hoặc mạng

Thống kê

THPDFSVGImportStatistics báo cáo nút, quy tắc CSS, gradient, nét gradient, mask, ảnh, liên kết, run văn bản, nhóm opacity isolated qua GroupCount, và byte toán tử chính, pattern, mask, và nhóm tạo ra gộp lại

HPDFBuildSVGFormData phơi bày riêng trình phân tích có giới hạn qua THPDFSVGFormData và THPDFSVGLinkInfo cho bên gọi cần nội dung Form, kích thước nội tại, tài nguyên độ mờ, payload ảnh, stream pattern và mask, tên tài nguyên văn bản, hoặc siêu dữ liệu liên kết trước khi đăng ký; Groups cung cấp các stream toán tử nhóm isolated và biên giới Form thận trọng

Ví dụ

Document.BeginDoc;
FormName := Document.ImportSVGFormXObject(SVGBytes, Statistics);
if FormName = '' then
  raise Exception.Create('SVG import failed');

Document.CurrentPage.DrawSVGFormXObject(
  FormName,
  36,
  72,
  240,
  120,
  True
);

Document.CurrentPage.DrawSVGFormXObject(
  FormName,
  320,
  72,
  120,
  60,
  False
);

Xem thêm: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, Nhập Phương Tiện Phân Trang HTML5