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