THotPDF.SetFormUnicodeFontDict Méthode

 

THotPDF.SetFormUnicodeFontDict

THotPDF

 

Haut

Enregistre une police Unicode fournie par l’appelant dans le dictionnaire des ressources par défaut AcroForm afin que le générateur de flux d’apparence automatique de HotPDF (PDF 1.7 ISO 32000-1 12.7.4.3) puisse rendre directement les valeurs initiales non ASCII des widgets Tx dans /AP, au lieu d’émettre l’espace réservé AP vide de la v2.46.0. Associez-le à CreateIndirectFontDict pour allouer le dictionnaire de police indirect à renseigner

 

Syntaxe Delphi :

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

 

Syntaxe C++ :

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

 

Description

Lorsque LogicalName et FontDict sont tous deux renseignés, trois choses changent dans les émissions suivantes : (a) la chaîne /DA au niveau AcroForm passe de '/Helv 12 Tf 0 0 0 rg' à '/<LogicalName> 12 Tf 0 0 0 rg' ; (b) le sous-dictionnaire /DR /Font d’AcroForm reçoit une entrée /<LogicalName> <FontDict-indirect-ref> en plus de /Helv et /ZaDb ; (c) chaque widget Tx ajouté via AddTextField ou AddRichTextField reçoit le même /DA par champ. Lorsque AutoFormAppearances est activé et que la valeur initiale du widget contient au moins un octet >= 0x80, GenerateTextFieldAP émet un véritable Form XObject /AP /N dont le flux de contenu sélectionne la police enregistrée via Tf et rend le texte avec un opérateur Tj sous forme de chaîne hexadécimale CID ; le sous-dictionnaire /Resources/Font du Form référence la même police indirecte afin que l’AP soit autonome

Lorsque la police enregistrée provient de RegisterUnicodeTTF, les caractères Unicode du plan supplémentaire, par exemple U+1F600, sont émis via un seul CID alloué en interne au lieu de séparer la paire substitutive UTF-16 en deux CIDs Identity-H. HotPDF actualise les flux /CIDToGIDMap, /W et /ToUnicode générés au moment de la finalisation afin que le CID interne pointe vers le vrai glyphe de police et que l’extraction de texte revienne à la paire substitutive UTF-16BE d’origine

Les champs Tx ASCII continuent d’utiliser /Helv et produisent une sortie /AP binaire identique pour les appelants de la v2.46.0. Passez un LogicalName vide et nil pour FontDict afin d’effacer l’enregistrement et de revenir au comportement limité à /Helv. Type de workflow : appelez SetFormUnicodeFontDict une seule fois juste après BeginDoc, avant tout AddTextField ; les widgets créés plus tôt ne sont pas mis à jour rétroactivement

 

LogicalName - le nom PDF utilisé comme clé dans /DR/Font et comme opérande de Tf dans la chaîne /DA. Exemple courant : 'F0'. Ne doit pas être vide lors de l’enregistrement ; un nom vide avec un FontDict non nul déclenche une exception

FontDict - un THPDFDictionaryObject indirect contenant une ressource de police PDF valide. Il appartient à l’appelant de construire correctement le dictionnaire de police, en général une police composite de type 0 / CIDFontType2 + Identity-H + ToUnicode CMap ; pour un affichage simple ou uniquement tracé, un sous-ensemble Type 1 / TrueType convient aussi. HotPDF ne valide pas le contenu ; il sérialise seulement la référence

 

Portée - la v2.56.0 ne couvre que les widgets Tx à une seule ligne. Les widgets Tx multilignes (ffMultiline) et comb (ffComb) avec des valeurs initiales non ASCII émettent encore l’espace réservé AP vide de la v2.46.0 ; l’extension Unicode-AP pour ces branches est prévue pour la v2.57.0+. Le façonnage bidi RTL, arabe / hébreu, exige l’algorithme Unicode Bidi (UAX #9) et le chaînage contextuel arabe ; cela relève aussi de la v2.57.0+

 

Exemple de code

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

 

Voir aussi

CreateIndirectFontDict, AutoFormAppearances, AddTextField, AddRichTextField, Version