THotPDF.SetFormUnicodeFontDict-Methode

 

THotPDF.SetFormUnicodeFontDict

THotPDF

 

Oben

Registriert eine vom Aufrufer bereitgestellte Unicode-Schriftart im default-resources-Wörterbuch von AcroForm, sodass der Generator für automatische Appearance-Streams von HotPDF (PDF 1.7 ISO 32000-1 12.7.4.3) Nicht-ASCII-Initialwerte für Tx-Widgets direkt in /AP rendern kann, anstatt den in v2.46.0 leeren AP-Platzhalter auszugeben; verwenden Sie dies zusammen mit CreateIndirectFontDict, um das zu befüllende indirekte Schriftarten-Wörterbuch zuzuweisen

 

Delphi-Syntax:

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

 

C++-Syntax:

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

 

Beschreibung

Sobald sowohl LogicalName als auch FontDict gefüllt sind, ändern sich drei Dinge bei der nachfolgenden Ausgabe: (a) die /DA-Zeichenkette auf AcroForm-Ebene wechselt von '/Helv 12 Tf 0 0 0 rg' zu '/<LogicalName> 12 Tf 0 0 0 rg'; (b) das AcroForm-Unterwörterbuch /DR /Font erhält einen Eintrag /<LogicalName> <FontDict-indirect-ref> neben den bestehenden Einträgen /Helv + /ZaDb; (c) jedes Tx-Widget, das über AddTextField oder AddRichTextField hinzugefügt wird, erhält sein /DA-Attribut pro Feld auf dieselbe Weise gesetzt; wenn AutoFormAppearances aktiviert ist und der Initialwert des Widgets ein Byte >= 0x80 enthält, gibt GenerateTextFieldAP ein echtes /AP /N Form-XObject aus, dessen Content-Stream die registrierte Schriftart über Tf auswählt und den Text als CID-Hex-Zeichenkette Tj-Operator rendert; das Unterwörterbuch /Resources/Font des Formulars verweist auf dieselbe indirekte Schriftart, sodass das AP in sich geschlossen ist

Wenn die registrierte Schriftart aus RegisterUnicodeTTF stammt, werden Unicode-Zeichen aus ergänzenden Ebenen (z. B. U+1F600) über eine einzige intern zugewiesene CID ausgegeben, anstatt das UTF-16-Ersatzpaar (Surrogate Pair) in zwei Identity-H CIDs aufzuteilen; HotPDF aktualisiert die generierten Streams /CIDToGIDMap, /W und /ToUnicode bei der Fertigstellung des Dokuments, sodass die interne CID der tatsächlichen Schriftzeichen-Glyphe entspricht und die Textextraktion wieder dem ursprünglichen UTF-16BE-Ersatzpaar zugeordnet wird

ASCII-Tx-Felder verwenden weiterhin /Helv und erzeugen eine Byte-identische /AP-Ausgabe für v2.46.0-Aufrufer; übergeben Sie einen leeren LogicalName + nil für FontDict, um die Registrierung zu löschen und zum reinen /Helv-Verhalten zurückzukehren; typischer Workflow: Rufen Sie SetFormUnicodeFontDict einmal unmittelbar nach BeginDoc auf, bevor Sie AddTextField aufrufen — Widgets, die zuvor erstellt wurden, werden nicht rückwirkend aktualisiert

 

LogicalName - der PDF-Name, der als Schlüssel in /DR/Font und als Operand für Tf innerhalb der /DA-Zeichenkette verwendet wird; typischerweise: 'F0'; darf bei der Registrierung nicht leer sein; ein leerer Name mit einem Nicht-nil FontDict führt zu einem Fehler

FontDict - ein indirektes THPDFDictionaryObject, das eine gültige PDF-Schriftartressource enthält; der Aufrufer ist dafür verantwortlich, das Schriftarten-Wörterbuch korrekt aufzubauen — typischerweise eine Type 0 / CIDFontType2 + Identity-H + ToUnicode CMap zusammengesetzte Schriftart; für rein umrandete oder einfache Anzeigen funktioniert auch eine TrueType-Subset-Schriftart (Type 1); HotPDF validiert den Inhalt nicht, sondern serialisiert lediglich die Referenz

 

Gültigkeitsbereich - v2.56.0 deckt nur einzeilige Tx-Widgets ab; mehrzeilige (ffMultiline) und gekämmte (ffComb) Tx-Widgets mit Nicht-ASCII-Initialwerten geben weiterhin den v2.46.0 leeren AP-Platzhalter aus; die Unicode-AP-Erweiterung für diese Zweige ist für v2.57.0+ geplant; RTL-Bidi-Gestaltung (Arabisch / Hebräisch) erfordert den Unicode-Bidi-Algorithmus (UAX #9) + arabische kontextuelle Verbindung; ebenfalls für den Gültigkeitsbereich v2.57.0+ geplant

 

Code Example

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

 

Siehe auch

CreateIndirectFontDict, AutoFormAppearances, AddTextField, AddRichTextField, Version