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