THotPDF.SetFormUnicodeFontDict Methode

 

THotPDF.SetFormUnicodeFontDict

THotPDF

 

Boven

Registreert een door de aanroeper opgegeven Unicode-lettertype in de AcroForm-default-resources-dict zodat HotPDF's auto-appearance-streamgenerator (PDF 1.7 ISO 32000-1 12.7.4.3) niet-ASCII Tx-widget beginwaarden rechtstreeks in /AP kan renderen, in plaats van de lege AP-placeholder uit v2.46.0 uit te geven. Gebruik dit samen met CreateIndirectFontDict om de indirecte font-dict aan te maken die u wilt vullen

 

Delphi-syntaxis:

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

 

C++-syntaxis:

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

 

Beschrijving

Zodra LogicalName en FontDict beide zijn ingevuld, veranderen drie dingen in de daaropvolgende uitvoer: (a) de AcroForm /DA-tekenreeks op documentniveau schakelt van '/Helv 12 Tf 0 0 0 rg' naar '/<LogicalName> 12 Tf 0 0 0 rg'; (b) de AcroForm /DR /Font-subdict krijgt een vermelding /<LogicalName> <FontDict-indirect-ref> naast de bestaande /Helv + /ZaDb; (c) elke Tx-widget die via AddTextField of AddRichTextField wordt toegevoegd krijgt zijn per-veld /DA op dezelfde manier ingesteld. Wanneer AutoFormAppearances aan staat en de beginwaarde van de widget een byte bevat die >= 0x80 is, geeft GenerateTextFieldAP een echte /AP /N Form XObject uit waarvan de contentstream het geregistreerde lettertype via Tf selecteert en de tekst als een CID-hexstring Tj-operator rendert; de /Resources/Font-subdict van het Form verwijst naar hetzelfde indirecte lettertype zodat de AP zelfstandig is

Wanneer het geregistreerde lettertype uit RegisterUnicodeTTF komt, worden Unicode-tekens uit het aanvullende vlak (bijvoorbeeld U+1F600) via één intern toegewezen CID uitgegeven in plaats van het UTF-16-surrogaatpaar in twee Identity-H-CIDs te splitsen. HotPDF ververst de gegenereerde /CIDToGIDMap-, /W- en /ToUnicode-streams bij de afronding zodat de interne CID naar de echte fontglyph verwijst en tekstextractie terugkoppelt naar het oorspronkelijke UTF-16BE-surrogaatpaar

ASCII-Tx-velden blijven /Helv gebruiken en geven byte-identieke /AP-uitvoer terug aan v2.46.0-aanroepers. Geef een lege LogicalName + nil FontDict door om de registratie te wissen en terug te keren naar alleen /Helv-gedrag. Typische workflow: roep SetFormUnicodeFontDict één keer aan direct na BeginDoc, vóór enige AddTextField - widgets die eerder zijn gemaakt worden niet met terugwerkende kracht bijgewerkt

 

LogicalName - de PDF-naam die als sleutel in /DR/Font wordt gebruikt en als operand voor Tf binnen de /DA-tekenreeks. Typisch: 'F0'. Mag niet leeg zijn bij registratie; een lege naam met een niet-nil FontDict veroorzaakt een fout

FontDict - een indirect THPDFDictionaryObject met een geldige PDF Font-resource. De aanroeper is verantwoordelijk voor het correct opbouwen van de font-dict - doorgaans een Type 0 / CIDFontType2 + Identity-H + ToUnicode CMap-composietlettertype; voor alleen-streek- of eenvoudige weergave werkt een Type 1 / TrueType-subset ook. HotPDF valideert de inhoud niet; het serialiseert alleen de verwijzing

 

Scope - v2.56.0 dekt alleen enkelregelige Tx-widgets. Meerregelige (ffMultiline) en comb (ffComb) Tx-widgets met niet-ASCII beginwaarden geven nog steeds de lege AP-placeholder uit v2.46.0 uit; de Unicode-AP-uitbreiding voor die takken staat gepland voor v2.57.0+. RTL-bidi-opmaak (Arabisch / Hebreeuws) vereist Unicode Bidi Algorithm (UAX #9) + Arabische contextuele koppeling; ook dit valt onder v2.57.0+

 

Codevoorbeeld

// 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;

 

Zie ook

CreateIndirectFontDict, AutoFormAppearances, AddTextField, AddRichTextField, Version