Runtime widget XFA Dynamic tương tác
TXFAWidgetRuntime cung cấp một mô hình tương tác trung lập với host cho các biểu mẫu XFA dynamic mà không chuyển chúng thành trường AcroForm hay làm phẳng nội dung của chúng
Runtime phơi bày bounds và trạng thái widget tất định để một renderer trên desktop, service, hoặc tùy biến có thể tự cung cấp input, vẽ, khả năng truy cập, và event loop riêng
Tạo một runtime
Hãy tạo runtime trực tiếp từ byte XDP hoặc gọi THotPDF.CreateLoadedXFAWidgetRuntime sau khi nạp một PDF mà AcroForm chứa một mục /XFA dạng single-stream hoặc packet-array
var
Runtime: TXFAWidgetRuntime;
State: TXFAWidgetState;
begin
Runtime := PDF.CreateLoadedXFAWidgetRuntime;
try
if (Runtime <> nil) and (Runtime.WidgetCount > 0) then
begin
State := Runtime.Widgets[0];
Runtime.FocusWidget(State.ID);
Runtime.BeginEdit(State.ID);
Runtime.ReplaceSelection(0, Length(State.Value), 'Updated value');
if not Runtime.CommitEdit then
raise Exception.Create(Runtime.LastDiagnostic);
end;
finally
Runtime.Free;
end;
end;
Factory tài liệu đã nạp là read-only đối với đồ thị đối tượng PDF và XFAFlattenWarnings hiện có; lưu tài liệu sẽ giữ nguyên các mục /XFA và /NeedsRendering gốc
Mô hình tương tác
FocusWidgetvàClearFocusduy trì đúng một widget đang focus và phát hành các callback focus có thứ tựBeginEdit,ReplaceSelection,CancelEdit, vàCommitEditbảo toàn văn bản Unicode bao gồm khoảng trắng đầu và cuốiHitTestánh xạ tọa độ trang tới widget hiển thị trên cùngOnWidgetInvalidated,OnLayoutChanged, vàOnFocusChangedcho phép host chỉ làm mới phần trạng thái bị ảnh hưởng
Xác thực và tính toán nguyên tử
Một commit phân giải các binding SOM tường minh và ngữ cảnh dữ liệu của hàng lặp hiện hành trước khi chạy script validate và calculate
Giá trị đã sửa, các giá trị đã tính, node dữ liệu, mô hình widget, trạng thái focus và edit, cảnh báo, và bộ đếm pass chỉ được công bố cùng nhau sau khi validation và layout ổn định
Script bị từ chối, ngân sách cạn, ranh giới chọn UTF-16 không hợp lệ, và exception của layout hoặc phép đo từ host khôi phục toàn bộ trạng thái trước đó và đặt LastDiagnostic
Ngân sách
TXFAWidgetRuntimeOptions giới hạn số widget, độ dài giá trị đã sửa, số calculate pass, số reflow pass, số thao tác layout, số thao tác script, thời gian script đã trôi qua, và các tài nguyên FormCalc hoặc JavaScript khác
Trần widget được áp khi các mục layout và mảnh phân trang được nối thêm, trong khi giải nén và lắp ráp packet của XFA đã nạp dừng ở giới hạn đầu vào XFA DOM trước khi phân tích
MaxLayoutOperations mặc định 200000 và giới hạn cả việc đi qua tài liệu lẫn công việc layout; chiều sâu layout giới hạn 128, chiều sâu event target và khởi tạo instance giới hạn 64, và dispatch sự kiện đệ quy bị từ chối
Sự kiện động bị giới hạn
DispatchEvent chấp nhận các phép toán literal phân tách bằng dấu chấm phẩy trong script sự kiện field khớp, với content type FormCalc hoặc JavaScript; các phép toán này được phân tích trực tiếp và không cần JavaScript DLL
row.instanceManager.addInstance(true);
row.instanceManager.removeInstance(0);
target.presence = "hidden";
addInstance nối thêm một instance và nhận true, false, 1, hoặc 0 làm đối số merge; bỏ qua đối số thì dùng true, và dạng viết tắt _row.addInstance(1) cũng được chấp nhận
Mô hình được hỗ trợ bind mọi nhóm dữ liệu cùng tên đang tồn tại, nên một instance mới nhận một nhóm dữ liệu mới được khởi tạo từ các mặc định template bất kể đối số merge; việc tạo instance không sao chép các giá trị đã nhập của hàng trước
removeInstance dùng chỉ mục số nguyên tính từ 0 trong các nhóm dữ liệu cùng tên của subform được chọn; subform phải có phần tử occur với maximum lặp được, và cả hai phép toán đều thi hành minimum và maximum của nó, bao gồm max="-1"
Thay đổi instance đòi hỏi binding dataset đặt tên ngầm định và tên dữ liệu XML ASCII; binding tham chiếu dữ liệu tường minh và ngữ cảnh cha mơ hồ bị từ chối trước khi công bố transaction
Đích được giải qua các phần tử con template có tên trong các scope bao quanh sự kiện, bao gồm đường dẫn chấm và this.parent; manager lồng trong một scope lặp lại dùng nhóm dữ liệu riêng của sự kiện
presence nhận visible, hidden, và invisible trên field template, draw, subform, và exclusion group; nội dung hidden không chiếm chỗ luồng, còn nội dung invisible giữ chỗ của nó nhưng bị bỏ khỏi widget và đầu ra flatten
Thay đổi presence áp dụng cho node template được chọn và do đó cho mọi lần lặp lại của nó; presence theo chỉ mục từng instance, inactive, biểu thức tùy ý, biến, điều kiện, vòng lặp, và các phép toán script sự kiện khác bị từ chối
Một lô sự kiện công bố thay đổi dữ liệu, tính toán, layout, focus, và trạng thái sửa cùng nhau sau khi reflow ổn định; bất kỳ phép toán bị từ chối hoặc ngân sách đầu vào, thao tác, instance, giá trị, widget, layout, hay thời gian đã trôi qua bị cạn kiệt đều khôi phục toàn bộ trạng thái tài liệu và tương tác trước đó
Xóa một hàng giữ nguyên focus và các sửa đổi đang chờ cho các nhóm dữ liệu còn sống ngay cả khi chỉ mục widget của chúng thay đổi; xóa hoặc che widget đang focus sẽ xóa focus và phát callback focus tương ứng sau khi thành công
Lưu biểu mẫu đã cập nhật
SaveToBytes trả về XDP đã cập nhật trọn vẹn của runtime, bao gồm các dataset đã sửa và thuộc tính presence của template; dùng các byte này với SetXFADocument khi ghi PDF hoặc với HPDFXFAFlatten cho đầu ra flatten đã cập nhật
Factory tài liệu đã nạp tạo một runtime độc lập, nên các sự kiện runtime không tự động sửa đồ thị đối tượng của PDF nguồn
Ranh giới hiện tại
Runtime là một đối tượng host đơn luồng và không cung cấp GUI, painter, hay engine script sự kiện XFA tổng quát
Vào và ra focus được hỗ trợ trực tiếp khi không có script sự kiện khớp; các phép toán sự kiện bị giới hạn này không đồng nghĩa với hỗ trợ JavaScript hoặc FormCalc đầy đủ, các sự kiện vòng đời XFA, hay một form DOM riêng với ghi đè trình bày theo từng instance
Xem Bounded XFA FormCalc and JavaScript, XFA Packet DOM, và Interactive Document Processing