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