|
Registrerer en brugerleveret Unicode-skrifttype in AcroForm default-resources-ordbogen, så HotPDF's automatiske udseendestrøm-generator (PDF 1.7 ISO 32000-1 12.7.4.3) kan gengive ikke-ASCII Tx-widget-startværdier direkte i/AP, i stedet for at udsende den tomme AP-pladsholder fra v2.46.0; par medCreateIndirectFontDictfor at allokere den indirekte skrifttypeordbog, der skal udfyldes
Delphi-syntaks:
procedure SetFormUnicodeFontDict(constLogicalName: AnsiString; FontDict: THPDFDictionaryObject);
C++-syntaks:
void SetFormUnicodeFontDict(const AnsiString& LogicalName, THPDFDictionaryObject* FontDict);
Beskrivelse
Når beggeLogicalName and FontDicter udfyldt, ændres tre ting i efterfølgende udsendelse: (a) på AcroForm-niveau/DAskifter strengen fra'/Helv 12 Tf 0 0 0 rg' to '/<LogicalName> 12 Tf 0 0 0 rg'; (b) AcroForm/DR /Fontunderordbogen får en post/<LogicalName> <FontDict-indirect-ref>ved siden af den eksisterende/Helv + /ZaDb; (c) enhver Tx-widget tilføjet viaAddTextField or AddRichTextFieldfår sit pr. felt/DAindstillet på samme måde; nårAutoFormAppearanceser slået til og widgetens startværdi indeholder enhver byte >= 0x80,GenerateTextFieldAPudsender en rigtig/AP /NForm XObject, hvis indholdsstrøm vælger den registrerede skrifttype viaTfog gengiver teksten som en CID-hex-strengTjoperator; Formens/Resources/Fontunderordbog refererer til den samme indirekte skrifttype, så AP'en er selvstændig
Når den registrerede skrifttype kommer fra RegisterUnicodeTTF, udsendes Unicode-tegn i det supplerende plan (f.eks. U+1F600) via et enkelt internt allokeret CID i stedet for at opdele UTF-16-surrogatparret i to Identity-H CID'er. HotPDF opretter de genererede /CIDToGIDMap-, /W- og /ToUnicode-streams ved afslutning, så det interne CID kortlægges til den rigtige skrifttypeglyf, og tekstudtrækning kortlægges tilbage til det originale UTF-16BE-surrogatpar
ASCII Tx-felter fortsætter med at bruge/Helvog udsende byte-identiske/APoutput til v2.46.0-kaldere; overfør tomLogicalName + nil FontDictfor at rydde registreringen og vende tilbage til/Helv-kun adfærd; typisk arbejdsgang: kald SetFormUnicodeFontDict én gang umiddelbart efter BeginDoc, før enhver AddTextField - widgets oprettet tidligere opdateres ikke med tilbagevirkende kraft
LogicalName - det PDF-navn, der bruges som nøgle i/DR/Fontog som operand tilTfinden i/DAstrengen; typisk:'F0'; må ikke være tomt ved registrering; et tomt navn med en ikke-nil FontDict udløser en undtagelse
FontDict - en indirekteTHPDFDictionaryObjectder indeholder en gyldig PDF Font-ressource; kalderen er ansvarlig for at bygge skrifttypeordbogen korrekt - typisk en Type 0 / CIDFontType2 + Identity-H + ToUnicode CMap sammensat skrifttype; til udelukkende stregede eller simple visninger fungerer en Type 1 / TrueType-delmængde også; HotPDF validerer ikke indholdet, det serialiserer blot referencen
Scope - v2.56.0 dækker kun enkeltlinjede Tx-widgets; flerlinjede (ffMultiline) og kam (comb) (ffComb) Tx-widgets med ikke-ASCII-startværdier udsender stadig den tomme AP-pladsholder fra v2.46.0; Unicode-AP-udvidelsen til disse grene er planlagt til v2.57.0+; RTL bidi-formning (arabisk/hebraisk) kræver Unicode Bidi-algoritmen (UAX #9) + arabisk kontekstuel samling; ligeledes inden for rammerne af v2.57.0+
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
|