THotPDF.SetFormUnicodeFontDict Method

 

THotPDF.SetFormUnicodeFontDict

THotPDF

 

Øverst

Registrerer en Unicode-font som kalles inn av brukeren i AcroForm-defaultressursordboken slik at HotPDFs generator for automatisk utseendestrøm (PDF 1.7 ISO 32000-1 12.7.4.3) kan rendere ikke-ASCII-verdier i Tx-widgeter direkte inn i /AP i stedet for å skrive v2.46.0-plassholderen for tom AP. Bruk sammen med CreateIndirectFontDict for å opprette den indirekte fontordboken som skal fylles

 

Delphi syntax:

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

 

C++ syntax:

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

 

Beskrivelse

Når både LogicalName og FontDict er fylt ut, endres tre ting i etterfølgende generering: (a) AcroForm-/DA-strengen skifter fra '/Helv 12 Tf 0 0 0 rg' til '/<LogicalName> 12 Tf 0 0 0 rg'; (b) AcroForm-understrukturen /DR /Font får en oppføring /<LogicalName> <FontDict-indirect-ref> ved siden av de eksisterende /Helv + /ZaDb; (c) hver Tx-widget som legges til gjennom AddTextField eller AddRichTextField får sin per-felt-/DA satt på samme måte. Når AutoFormAppearances er på og widgetens initialverdi inneholder en byte >= 0x80, skriver GenerateTextFieldAP en ekte /AP /N Form XObject der innholdsstrømmen velger den registrerte fonten via Tf og rendrer teksten som en CID hex-streng med Tj-operatoren; Formens /Resources/Font-underside peker til den samme indirekte fonten slik at AP blir selvstendig

Når den registrerte fonten kommer fra RegisterUnicodeTTF, skrives Unicode-tegn i supplementærplanet (for eksempel U+1F600) gjennom én intern tildelt CID i stedet for å splitte UTF-16-surrogatparet i to Identity-H-CID-er. HotPDF oppdaterer de genererte strømmene /CIDToGIDMap, /W og /ToUnicode ved avslutning slik at den interne CID-en peker til den faktiske fontglyfen og tekstuttrekk peker tilbake til det opprinnelige UTF-16BE-surrogatparet

ASCII-Tx-felt fortsetter å bruke /Helv og skriver byte-identisk /AP-utdata til v2.46.0-kallere. Send tom LogicalName + nil FontDict for å rydde registreringen og gå tilbake til bare /Helv-atferd. Typisk arbeidsflyt: kall SetFormUnicodeFontDict én gang rett etter BeginDoc, før noen AddTextField - widgeter som ble opprettet tidligere blir ikke oppdatert i etterkant

 

LogicalName - PDF-navnet som brukes som nøkkel i /DR/Font og som operand til Tf inne i /DA-strengen. Typisk: 'F0'. Må ikke være tom ved registrering; et tomt navn med en ikke-null FontDict utløser feil

FontDict - en indirekte THPDFDictionaryObject som inneholder en gyldig PDF-fontressurs. Kalleren er ansvarlig for å bygge fontordboken riktig - vanligvis en Type 0 / CIDFontType2 + Identity-H + ToUnicode CMap-komposittfont; for ren strekbruk eller enkel visning fungerer også et Type 1 / TrueType-delsett. HotPDF validerer ikke innholdet; det serialiserer bare referansen

 

Scope - v2.56.0 dekker bare Tx-widgeter med én linje. Flerlinje-ffMultiline og ffComb-Tx-widgeter med ikke-ASCII initialverdier skriver fortsatt v2.46.0-plassholderen for tom AP; Unicode-AP-utvidelsen for disse grenene er planlagt til v2.57.0+. RTL bidi-forming (arabisk / hebraisk) krever Unicode Bidi Algorithm (UAX #9) + arabisk kontekstuell sammenkobling; også dette ligger i v2.57.0+-omfang

 

Kodeeksempel

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

 

Se også

CreateIndirectFontDict, AutoFormAppearances, AddTextField, AddRichTextField, Version