THotPDF.SetFormUnicodeFontDict Method

 

THotPDF.SetFormUnicodeFontDict

THotPDF

 

Đầu trang

Đăng ký một phông Unicode do người gọi cung cấp vào dict tài nguyên mặc định của AcroForm để trình tạo auto-appearance-stream của HotPDF (PDF 1.7 ISO 32000-1 12.7.4.3) có thể kết xuất giá trị khởi tạo của widget Tx không phải ASCII trực tiếp vào /AP, thay vì phát ra placeholder empty-AP kiểu v2.46.0. Hãy ghép với CreateIndirectFontDict để tạo dict phông gián tiếp cần điền

 

Delphi syntax:

procedure SetFormUnicodeFontDict(const LogicalName: AnsiString; FontDict: THPDFDictionaryObject);

 

C++ syntax:

void SetFormUnicodeFontDict(const AnsiString& LogicalName, THPDFDictionaryObject* FontDict);

 

Mô tả

Khi cả LogicalName lẫn FontDict đã được điền, ba điểm sẽ thay đổi trong lần phát sinh tiếp theo: (a) chuỗi /DA ở cấp AcroForm đổi từ '/Helv 12 Tf 0 0 0 rg' sang '/<LogicalName> 12 Tf 0 0 0 rg'; (b) sub-dict /DR /Font của AcroForm nhận thêm mục /<LogicalName> <FontDict-indirect-ref> bên cạnh /Helv và /ZaDb hiện có; (c) mọi widget Tx được thêm qua AddTextField hoặc AddRichTextField sẽ có /DA riêng của trường được đặt theo cách tương tự. Khi AutoFormAppearances bật và giá trị khởi tạo của widget chứa bất kỳ byte nào >= 0x80, GenerateTextFieldAP sẽ phát ra một Form XObject /AP /N thật với content stream chọn phông đã đăng ký qua Tf và hiển thị văn bản dưới dạng toán tử Tj chuỗi hex CID; sub-dict /Resources/Font của Form tham chiếu cùng phông gián tiếp đó nên AP tự chứa được

Khi phông đã đăng ký đến từ RegisterUnicodeTTF, các ký tự Unicode ở supplementary plane (ví dụ U+1F600) sẽ được phát ra bằng một CID nội bộ duy nhất thay vì tách cặp surrogate UTF-16 thành hai CID Identity-H. HotPDF làm mới các stream /CIDToGIDMap, /W và /ToUnicode đã tạo ở thời điểm hoàn tất để CID nội bộ ánh xạ sang glyph thật của phông và việc trích xuất văn bản ánh xạ ngược về cặp surrogate UTF-16BE gốc

Các trường Tx ASCII vẫn dùng /Helv và tạo đầu ra /AP giống byte với các lời gọi v2.46.0. Hãy truyền LogicalName rỗng + FontDict nil để xóa đăng ký và quay lại hành vi chỉ dùng /Helv. Quy trình điển hình: gọi SetFormUnicodeFontDict một lần ngay sau BeginDoc, trước bất kỳ AddTextField nào - các widget tạo trước đó sẽ không được cập nhật hồi tố

 

LogicalName - PDF Name dùng làm khóa trong /DR/Font và làm toán hạng của Tf bên trong chuỗi /DA. Dạng thường dùng: 'F0'. Khi đăng ký, giá trị này không được rỗng; tên rỗng kèm FontDict khác nil sẽ báo lỗi

FontDict - một THPDFDictionaryObject gián tiếp chứa tài nguyên Font PDF hợp lệ. Người gọi chịu trách nhiệm dựng dict phông đúng cách - thường là một composite font Type 0 / CIDFontType2 + Identity-H + ToUnicode CMap; với hiển thị đơn giản hoặc chỉ stroke thì một subset Type 1 / TrueType cũng dùng được. HotPDF không kiểm tra nội dung; nó chỉ tuần tự hóa tham chiếu

 

Scope - v2.56.0 chỉ bao phủ widget Tx một dòng. Widget Tx nhiều dòng (ffMultiline) và comb (ffComb) với giá trị khởi tạo không phải ASCII vẫn phát ra placeholder empty-AP kiểu v2.46.0; phần mở rộng Unicode-AP cho các nhánh này dự kiến ở v2.57.0+. Tạo hình bidi RTL (Arabic / Hebrew) cần Unicode Bidi Algorithm (UAX #9) + ghép ngữ cảnh Arabic; cũng thuộc phạm vi v2.57.0+

 

Ví dụ mã

// Register a Type 0 / CIDFontType2 + Identity-H composite font for
// AcroForm Tx widget AP rendering. (Real production code adds a
// /FontFile2 stream and a ToUnicode CMap so the glyphs actually
// render - omitted here for brevity.)
var
  F0, Descendant, FontDescriptor, CIDSysInfo: THPDFDictionaryObject;
  Descendants: THPDFArrayObject;
  R: TRect;
begin
  HPDF.BeginDoc;
  HPDF.AutoFormAppearances := True;

  F0 := HPDF.CreateIndirectFontDict;          // empty indirect dict
  F0.AddNameValue('Type', 'Font');
  F0.AddNameValue('Subtype', 'Type0');
  F0.AddNameValue('BaseFont', 'MyCJK');
  F0.AddNameValue('Encoding', 'Identity-H');

  CIDSysInfo := THPDFDictionaryObject.Create(nil);
  CIDSysInfo.AddStringValue('Registry', 'Adobe');
  CIDSysInfo.AddStringValue('Ordering', 'Identity');
  CIDSysInfo.AddNumericValue('Supplement', 0);

  FontDescriptor := THPDFDictionaryObject.Create(nil);
  FontDescriptor.AddNameValue('Type', 'FontDescriptor');
  // ... fill required Ascent / Descent / FontBBox / etc

  Descendant := THPDFDictionaryObject.Create(nil);
  Descendant.AddNameValue('Type', 'Font');
  Descendant.AddNameValue('Subtype', 'CIDFontType2');
  Descendant.AddNameValue('BaseFont', 'MyCJK');
  Descendant.AddValue('CIDSystemInfo', CIDSysInfo);
  Descendant.AddValue('FontDescriptor', FontDescriptor);
  Descendant.AddNumericValue('DW', 1000);

  Descendants := THPDFArrayObject.Create(nil);
  Descendants.AddObject(Descendant);
  F0.AddValue('DescendantFonts', Descendants);

  HPDF.SetFormUnicodeFontDict('F0', F0);

  R.Left := 60; R.Top := 60; R.Right := 280; R.Bottom := 100;
  HPDF.CurrentPage.AddTextField('Greeting', '你好世界', R);

  HPDF.EndDoc;
end;

 

See Also

CreateIndirectFontDict, AutoFormAppearances, AddTextField, AddRichTextField, Version