THotPDF.SetFormUnicodeFontDict Method

 

THotPDF.SetFormUnicodeFontDict

THotPDF

 

Sus

Înregistrează un font Unicode furnizat de apelant în dicționarul de resurse implicite AcroForm, astfel încât generatorul de fluxuri de aspect automate al HotPDF (PDF 1.7 ISO 32000-1 12.7.4.3) să poată reda valorile inițiale non-ASCII ale widgeturilor Tx direct în /AP, în loc să emită marcajul gol empty-AP din v2.46.0. Folosiți-l împreună cu CreateIndirectFontDict pentru a aloca dicționarul de font indirect care va fi completat

 

Sintaxă Delphi:

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

 

Sintaxă C++:

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

 

Descriere

După ce LogicalName și FontDict sunt ambele completate, în emisia următoare se schimbă trei lucruri: (a) șirul /DA la nivel de AcroForm trece de la '/Helv 12 Tf 0 0 0 rg' la '/<LogicalName> 12 Tf 0 0 0 rg'; (b) sub-dicționarul AcroForm /DR /Font primește o intrare /<LogicalName> <FontDict-indirect-ref> alături de /Helv și /ZaDb existente; (c) fiecare widget Tx adăugat prin AddTextField sau AddRichTextField primește propriul /DA setat în același fel. Când AutoFormAppearances este activ și valoarea inițială a widgetului conține orice octet >= 0x80, GenerateTextFieldAP emite un Form XObject real /AP /N al cărui flux de conținut selectează fontul înregistrat prin Tf și redă textul ca operator Tj de tip CID hex-string; sub-dicționarul /Resources/Font al formularului face referire la același font indirect, astfel încât AP-ul să fie autonom

Când fontul înregistrat provine din RegisterUnicodeTTF, caracterele Unicode din planul suplimentar, de exemplu U+1F600, sunt emise printr-un singur CID alocat intern, în loc să despartă perechea surrogate UTF-16 în doi CIDs Identity-H. HotPDF reîmprospătează fluxurile generate /CIDToGIDMap, /W și /ToUnicode la momentul finalizării, astfel încât CID-ul intern să se potrivească cu gliful real al fontului, iar extragerea textului să revină la perechea surrogate UTF-16BE originală

Câmpurile Tx ASCII continuă să folosească /Helv și să emită ieșire /AP identică la nivel de octet față de apelurile v2.46.0. Transmiteți un LogicalName gol plus nil pentru FontDict ca să ștergeți înregistrarea și să reveniți la comportamentul numai cu /Helv. Flux tipic: apelați SetFormUnicodeFontDict imediat după BeginDoc, înainte de orice AddTextField - widgeturile create mai devreme nu sunt actualizate retroactiv

 

LogicalName - numele PDF folosit ca cheie în /DR/Font și ca operand pentru Tf în șirul /DA. Exemplu tipic: 'F0'. Nu trebuie să fie gol la înregistrare; un nume gol împreună cu un FontDict nenul generează eroare

FontDict - un THPDFDictionaryObject indirect care conține o resursă PDF Font validă. Apelantul este responsabil pentru construirea corectă a dicționarului de fonturi - de obicei un font compozit de tip 0 / CIDFontType2 + Identity-H + ToUnicode CMap; pentru afișare simplă sau numai contur, funcționează și un subset Type 1 / TrueType. HotPDF nu validează conținutul; doar serializează referința

 

Scope - v2.56.0 acoperă doar widgeturile Tx cu o singură linie. Widgeturile Tx multi-linie (ffMultiline) și comb (ffComb) cu valori inițiale non-ASCII emit în continuare marcajul empty-AP din v2.46.0; extensia Unicode-AP pentru aceste ramuri este programată pentru v2.57.0+. Modelarea bidi RTL (arabă / ebraică) necesită Unicode Bidi Algorithm (UAX #9) plus conectarea contextuală arabă; și aceasta intră în zona v2.57.0+

 

Exemplu de cod

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

 

See Also

CreateIndirectFontDict, AutoFormAppearances, AddTextField, AddRichTextField, Version