HotPDF gali laikyti TrueType ir OpenType šriftų poaibius diske ir pakartotinai juos naudoti dokumentų ir proceso paleidimų tarpe, todėl paketui, atvaizduojančiam dešimt tūkstančių išrašų su tais pačiais trim šriftais, tie šriftai sudaromi į poaibius vieną kartą, o ne dešimt tūkstančių kartų. Podėlis konfigūruojamas dviem savybėmis, tikrinamas vienu įrašu ir saugu palikti įjungtą: podėlio triktis grįžta prie įprasto poaibių sudarymo atmintyje ir niekada nesustabdo dokumento gamybos
Poaibių sudarymas yra brangus dėl priežasties. Poaibio sudarymas reiškia glyph uždaros perėjimą, loca ir glyf perrašymą, cmap ir hmtx atkūrimą ir CID atvaizdavimo išspausdinimą, kurį PDF gali adresuoti. Vienam dokumentui ta sąnauda dingsta triukšme. Ataskaitų serveriui, gaminančiam dokumentus cikle, tai dažnai didžiausias vienas procesoriaus laiko blokas paleidime
Kas padaro podėlio pataikymą įmanomą
Turi sutapti keturi dalykai: šrifto turinys, naudojamų glyph rinkinys, poaibių režimas ir podėlio schema. Prairiešite vieną, ir HotPDF sudaro poaibius iš nulio, nes poaibis yra pakartotinai naudojamas tik tada, kai jis vis tiek būtų baitiškai identiškas
Glyph rinkinys yra sąlyga, kuri stebina žmones. Dvi sąskaitos, besiskiriančios vienu kliento vardu, naudoja skirtingus glyph rinkinius, todėl gamina skirtingus poaibius ir skirtingus podėlio įrašus. Podėlis atsiperka, kai dokumentai dalijasi glyph repertuaru — išrašai iš fiksuoto šablono, formos, kurių kintamieji duomenys yra skaitmeniniai, katalogai, braižomi iš vienos produktų duomenų bazės — ir neduoda nieko, kai kiekvienas dokumentas braižo skirtingą didelio CJK šrifto riekę. Pamatuokite prieš spėdami, kuriame atvejyje esate
var
Pdf: THotPDF;
Info: THPDFFontSubsetCacheInfo;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.EnableFontSubsetting := True;
Pdf.FontSubsetCacheFolder := 'C:\ProgramData\Reports\fontcache';
Pdf.FontSubsetCacheMaxBytes := 64 * 1024 * 1024; // 64 MiB, default is 256
// ... generate the batch ...
Info := Pdf.GetFontSubsetCacheInfo;
LogFmt('subset cache: %d hits, %d misses, %d bytes in %d files',
[Info.HitCount, Info.MissCount, Info.CurrentBytes, Info.FileCount]);
finally
Pdf.Free;
end;
end;
Iš kur žinote, kad podėlis ką nors daro?
GetFontSubsetCacheInfo grąžina devynis skaitiklius, o pirmųjų dviejų santykis tiesiogiai atsako į klausimą. HitCount ir MissCount duoda pataikymo dažnį. WriteCount ir EvictionCount parodo, ar įrašai išgyvena pakankamai ilgai, kad būtų pakartotinai naudojami, ar yra išstumiami per mažo biudžeto. CurrentBytes ir FileCount praneša, kas šiuo metu yra diske
Likusieji trys yra tie, verti įspėti. CorruptCount skaičiuoja įrašus, nepraėjusius tikrinimo ir pašalintus — keli po netvarkaus išjungimo yra normalu, nuolatinis srautas reiškia, kad saugykla nepatikima. RejectedCount skaičiuoja įrašus, atmestus prieš naudojimą. WriteFailureCount skaičiuoja įrašus, kurių išvis nepavyko užrašyti, kas dažniausiai reiškia leidimų problemą aplanke, o ne ką nors apie šriftus. Nė vienas iš šių trijų nesustabdo dokumentų generavimo, ir būtent todėl į juos reikia pažiūrėti: podėlis, kuris tyliai niekada neužrašo, atrodo taip pat kaip veikiantis, išskyrus procesoriaus sąskaitą
Išstūmimas, biudžetai ir akimirka, kai sumažinate vieną
FontSubsetCacheMaxBytes numatytasis yra 268435456 baitų, tai yra 256 MiB, ir jį galima sumažinti vykdymo metu. Sumažinimas iššaukia nedelsiantinį mažiausiai neseniai naudotų išstūmimą, užuot laukus kito užrašymo, todėl paslauga, reaguojanti į disko spaudimą, gali atlaisvinti vietą akimirką, kai nusprendžia, o ne vėliau, kai nebevaldo
FontSubsetCacheFolder nustatymas į tuščią eilutę išjungia disko pakopą neišvalant nieko, kas jau saugoma, ir nepakeičiant nė vieno šriftų išvesties baito. Tai yra savybė, kurios griebiatės, kai trikčių šalinimo metu norite izoliuoti podėlį: išjunkite, paleiskite tą patį paketą ir palyginkite pagamintus PDF. Jie turėtų būti identiški, nes podėlis saugo rezultatą, o ne politiką
Ką podėlis daro, kai įrašas pažeistas
Pašalina jį ir sudaro poaibius įprastai. Sukurti ar nukarpyti įrašai atmetami dar prieš poaibiui pasiekiant PDF srautą, kas yra dizaino dalis, svarbiausia: pažeistas podėlio įrašas, patekęs į dokumentą, gamintų PDF su sulaužyta šrifto programa, ir ta triktis iškiltų toli nuo savo priežasties — žiūryklėje, kliento kompiuteryje, po savaičių
Užrašymai yra atominiai, todėl skaitytojas niekada nemato perrašinėto įrašo, o triktis užrašymo viduryje palieka podėlį nuoseklų, o ne apnuodytą. Kompaktiški poaibių įrašai išlaiko CID pertvėrimo duomenis, kurių reikalauja PDF/A šriftų žodynai, todėl podėlyje esantis poaibis vis dar yra atitinkantis poaibis — archyvinė išvestis neturi apeiti podėlio, kad išliktų galiojanti
// Reset the disk tier after a font upgrade or a schema change
Pdf.ClearFontSubsetCache;
// Or move it somewhere writable and let the budget apply immediately
Pdf.SetFontSubsetCacheFolder('D:\cache\fonts');
Kur dėti aplanką realiame diegime
Tris savybės tai sprendžia: aplankas turi būti įrašomas sąskaitos, kuria veikia paslauga, jis turėtų būti vietinėje saugykloje, o ne tinklo bendrinime, ir jis neturėtų būti kataloge, kurį išvalo diegimo žingsnis. Podėlis bendrinime kiekvieną prašovimą paverčia kelione, o kiekvieną pataikymą — dviem; podėlis programos aplanke, kurį atkuria diegyklė, yra podėlis, kuris po kiekvieno atnaujinimo pradeda šaltas
Daugelio egzempliorių paslaugoms suteikite kiekvienam egzemplioriui savo aplanką, nebent patvirtinote, kad saugykla tvarko lygiagretų atominį pakeitimą taip, kaip tikitės. Dubliuoto įrašo kaina yra vienas papildomas poaibių sudarymo praėjimas; bendro podėlio lenktynės derinimo kaina yra popietė
Kada griebtis ko kito
Podėlis mažina pasikartojantį darbą. Jis nemažina pirmojo dokumento darbo ir nepadeda darbo apkrovai, kurios glyph rinkiniai niekada nesikartoja. Jei jūsų išvestį dominuoja vienas didžiulis CJK šriftas, naudojamas neprognozuojamam tekstui, veiksmingesnis svertas yra pats poaibių uždaras — kurie glyph įtraukiami ir kodėl — tai padengiama šriftų poaibių uždaro ir formuojamų glyph pastabose. Jei jūsų paketas lėtas dėl priežasčių, kurios pasirodo išvis ne šriftai, ataskaitų išvesties su šriftais ir paveikslais aprašymas parodo, kur įprastai eina kitas laikas, o EndDoc šriftų poaibių tvarkos rikto atvejo tyrimas primena, kad poaibių sudarymo teisingumas ir poaibių sudarymo greitis yra atskiros problemos
HotPDF yra natyvus VCL PDF komponentas, skirtas Delphi ir C++Builder, o poaibių podėlis yra bibliotekos dalis, o ne priedo paslauga, todėl ataskaitų serveris gauna ją nustačius vieną aplanko kelią — žr. HotPDF komponento puslapį pilnam šriftų ir našumo savybių sąrašui