PDFlibPas usmerava zadržani odlomak kroz jednu do 64 kolone jednake širine pomoću DrawTextFlowColumns, i prelama njegove redove ograničenim deljenjem reči svesnim jezika čim pozovete SetTextFlowLanguage i SetTextFlowHyphenation. Podržano je devet jezika, a jezik se može nasleđivati iz vrednosti /Lang u Catalog-u dokumenta, umesto da se podešava za svaki tok posebno
Obe funkcije postoje iz istog razloga: uska kolona je mesto gde naivno prelamanje redova prestaje da liči na slog, a počinje da liči na prijavu greške
Zašto se obostrano poravnat tekst raspada u uskim kolonama?
Zato što obostrano poravnanje raspoređuje preostali prostor u razmake između reči u redu, a količina preostalog prostora zavisi od toga šta stane. Kod širokog stupca preostali prostor je mali i oko ga nikada ne primeti. Prepolovite širinu i jedna duga reč koja ne stane prebacuje se u sledeći red, ostavljajući prethodne reči da upiju sav taj prostor. Tri takva reda zaredom proizvode vertikalne bele kanale koje tipografi nazivaju rekama, a čitaoci ih doživljavaju kao tekst koji je teško pratiti, a da ne znaju zašto
Deljenje reči (hyphenation) rešava uzrok umesto simptoma, dozvoljavajući prelom unutar reči. Nemačke i holandske složenice čine ovo neizbežnim: imenica od 24 karaktera u koloni širine 60 milimetara nema dobar ishod bez tačke preloma. Engleski jezik podnosi odsustvo deljenja bolje, zbog čega proizvodi razvijeni prvo za engleski jezik često isporučuju kod za raspored koji se raspadne čim ga prvi put pokrene nemački klijent
Koji jezici, i odakle dolazi podatak o jeziku?
Deljenje reči pokriva engleski, nemački, holandski, francuski, španski, italijanski, portugalski, ruski i turski jezik. Podesite ga eksplicitno za svaki tok pomoću SetTextFlowLanguage, ili mu dozvolite da se nasledi iz unosa /Lang u Catalog-u dokumenta, što je vrednost koju označeni i pristupačan dokument već nosi
To nasleđivanje vredi koristiti umesto prepisivanja. Dokument koji deklariše svoj jezik u Catalog-u saopštava čitačima ekrana, indeksarima za pretragu i deljenju reči istu činjenicu sa jednog mesta, a jedno mesto je tamo gde činjenica i treba da živi. Ako već proizvodite označeni (tagged) izlaz kako je opisano u automatskom označavanju za pristupačne PDF-ove, unos jezika je već podešen i tok može jednostavno da ga sledi
var
Lib: TPDFlib;
Flow, Drawn: Integer;
begin
Lib := TPDFlib.Create;
try
Lib.SetOrigin(1);
Lib.AddTrueTypeFont('Georgia', 1);
Lib.SetTextSize(10.5);
Flow := Lib.NewTextFlow(ArticleBody);
try
Lib.SetTextFlowLanguage(Flow, 'de');
// Omogući, najmanje 3 karaktera pre preloma, 3 posle
Lib.SetTextFlowHyphenation(Flow, 1, 3, 3);
Lib.SetTextFlowMinLines(Flow, 2); // nikada ne ostavi usamljen red
repeat
// Tri kolone u regionu širine 480 pt, razmak 18 pt, uravnoteženo
Drawn := Lib.DrawTextFlowColumns(Flow, 72, 720, 480, 620, 3, 18, 1);
if (Drawn = 0) or (Lib.TextFlowFinished(Flow) = 1) then
Break;
Lib.NewPage;
until False;
finally
Lib.ReleaseTextFlow(Flow);
end;
Lib.SaveToFile('newsletter.pdf');
finally
Lib.Free;
end;
end;
MinPrefix i MinSuffix su tipografija, ne validacija
Dva cela broja posle zastavice za omogućavanje podešavaju minimalan broj karaktera koji mora ostati pre i posle preloma. Tri i tri je konzervativna podrazumevana vrednost koju prihvata većina internih stilova. Dva i dva daje više prilika za prelom i primetno ružnije rezultate, jer fragment od dva slova koji visi na kraju reda deluje kao greška u kucanju
Povećajte minimume kada je pismo veliko, gde je svaki fragment vizuelno uočljiv, a smanjujte ih samo kada je kolona zaista uska i kada ste odlučili da je uzak stubac važniji od urednog. Ovo je odluka internog stila, a ne tehnička odluka, i upravo zato je parametar, a ne konstanta
Šta ovde zapravo znači „uravnoteženo”?
Parametar Balance menja ponašanje samo na kraju odlomka. Kada je uravnotežavanje uključeno, kolone se skraćuju na tačno jednak broj redova kada sve što je preostalo stane unutar regiona, što sprečava da poslednja stranica prikaže dve pune kolone i treću sa jednim usamljenim redom. Kada odlomak ne stane, svaka kolona zadržava punu visinu, tako da stranica nosi što je moguće više teksta, a ostatak se nastavlja na sledećoj stranici
Ta asimetrija je ispravna podrazumevana vrednost za kontinuirane dokumente. Uravnotežavanje u sredini teksta koji teče trošilo bi vertikalni prostor na svakoj stranici radi kozmetičkog efekta koji niko ne primećuje, pošto su kolone ionako pune. Uravnotežavanje na kraju je mesto gde ga oko zaista primeti, i upravo tu se i primenjuje
Prelamanje redova meri cele reči
Algoritam preloma meri cele reči umesto da sabira širine karaktera, i rezerviše ograničenu pretragu za preterano velike tokene koji uopšte ne mogu da stanu u red, poput URL-a ili inventarnog broja. To čini uobičajen slučaj brzim, a patološki slučaj ograničenim, umesto obrnuto
Meki crtice po izboru (soft hyphens) i automatske crtice se renderuju samo kada je prelom koji označavaju upravo onaj prelom koji je izabran. Ovo zvuči očigledno, a klasičan je nedostatak: naivna implementacija upisuje znak crtice tokom merenja, i ako se prelom pomeri, crtica ostane usred reda. Ništa ne izgleda više kao pokvaren tekstualni mehanizam nego zalutala crtica usred reči
var
Lib: TPDFlib;
Flow, Needed: Integer;
begin
// Odlučite o rasporedu pre nego što bilo šta nacrtate
Flow := Lib.NewTextFlow(ArticleBody);
try
Lib.SetTextFlowLanguage(Flow, 'fr');
Lib.SetTextFlowHyphenation(Flow, 1, 3, 3);
// Broj redova koji je ostatku odlomka potreban na širini jedne kolone
Needed := Lib.MeasureTextFlow(Flow, 148);
if Needed > 3 * LinesPerColumn then
UseTwoPageSpread
else
UseSinglePage;
Lib.DrawTextFlowColumns(Flow, 72, 720, 480, 620, 3, 18, 1);
if Lib.TextFlowFinished(Flow) <> 1 then
CarryOver(Lib.GetTextFlowRemaining(Flow));
finally
Lib.ReleaseTextFlow(Flow);
end;
end;
Održavajte podešavanja fonta identičnim kroz sve okvire
Jedno pravilo upravlja svakim rasporedom zasnovanim na toku, i vredi ga jasno izreći: DrawTextFlow, DrawTextFlowColumns i MeasureTextFlow svi prelamaju redove koristeći font izabran u trenutku kada su pozvani. Promenite font ili veličinu između dva okvira istog toka, ili započnite novu stranicu bez ponovnog izbora fonta, i drugi okvir će se prelamati drugačije nego što je prvi izmerio
Simptom izluđuje upravo zato što deluje povremeno: tekst koji stane na prvu stranicu prelije se na drugu, ili se izmeren broj redova ne poklapa sa onim što je nacrtano. Izaberite font jednom pre petlje, ponovo ga izaberite posle svakog NewPage, i tok će se ponašati ispravno. Kada se u istom odlomku pojave mešovita pisma, rešenje opisano u automatskom font fallback-u za CJK i emoji tekst primenjuje se i na merenje i na crtanje, tako da širine ostaju usklađene i kroz fallback tokove
Za rasporede izveštaja gde je tok samo jedan element među zaglavljima, podnožjima i blokovima vođenim podacima, obrasci kompozicije u mehanizmu za izveštaje nad skupovima podataka čisto se kombinuju sa tokovima kolona: prvo izmerite, postavite fiksne elemente, a zatim dajte toku koji god region je preostao
PDFlibPas je PDF biblioteka za Delphi, C++Builder i Lazarus, a kompletan životni ciklus TextFlow-a, kreiranje, crtanje, merenje, inspekcija, premotavanje i oslobađanje, izložen je i kroz DLL i ActiveX interfejse. Potpuna dokumentacija nalazi se na stranici PDFlibPas Delphi PDF biblioteke