Tehnički članak

HotPDF TextOut u Delphiju: Veličina, stil, rotacija i razmak

Svaki vidljivi niz znakova u HotPDF dokumentu ispisuje se jednim pozivom: TextOut(X, Y, angle, Text). "Hello World" primjer ga koristi u najosnovnijem obliku, s jednim podešavanjem fonta te četiri argumenta ostavljena na prihvatljivim zadanim postavkama. Nakon te prve stranice, ista četiri argumenta nose potpunu odgovornost za raspored i ispis samog teksta. Treći argument utječe na rotaciju. Postavka fonta određuje samu veličinu kao i izgled teksta. X, Y koordinate računaju se obično od ruba točke i jedine u potpunosti odvajaju i kontroliraju pravilan čist izvještaj od teksta koji se preklapa, propušta podatke te "klizi" po pisaču ili samom mediju drugog računala. Tu TextOut funkcija opravdava svoje postojanje i tu zadane postavke prestaju biti dovoljne

Potpis valja imati na umu: X i Y su brojevi Single tipa za točke. angle jest Extended za samo računanje kutova u stupnjevima, a sami tekst tj Text se predstavlja kao tip WideString, koji potom glatko dopušta i Unicode unos pri samom ispisu teksta. Dodatna opcija omogućuje upis sa PWORD oznakom kao i specifičnu dužinu te glifove, dok ćete češće pri normalnim nizovima za rad izabrati oblik teksta WideString

Veličina i stil određuju se s pomoću SetFont, a ne TextOut

TextOut nema parametar veličine. Sama veličina, vizualna težina (bold/debljina fonta), nagib (italic), sve to živi unutar poziva SetFont koji prethodi iscrtavanju i ostaje na snazi sve dok ga sljedeći poziv SetFont ne zamijeni. To je jedina činjenica koja objašnjava većinu konfuzije tijekom prvih dana primjene: linija izlazi podebljana jer su tri poziva ranije postavili [fsBold] i ništa to nije očistilo

Pdf.CurrentPage.SetFont('Times New Roman', [], 24);
Pdf.CurrentPage.TextOut(72, 740, 0, 'Quarterly Report');        // 24pt regular

Pdf.CurrentPage.SetFont('Times New Roman', [fsBold], 12);
Pdf.CurrentPage.TextOut(72, 712, 0, 'Revenue');                 // 12pt bold

Pdf.CurrentPage.SetFont('Times New Roman', [fsItalic], 11);
Pdf.CurrentPage.TextOut(72, 694, 0, 'figures in thousands');    // 11pt italic

Pdf.CurrentPage.SetFont('Courier New', [fsBold, fsItalic], 10);
Pdf.CurrentPage.TextOut(72, 676, 0, '  +18.4% YoY');            // styles combine

Drugi argument postavlja sam oblik tj. TFontStyles niz. Kad dodijelite [fsBold, fsItalic] ispisati će se deblji zakrivljeni oblik tj bold italic oblik, a s [] ispisat će se čisti tekst bez nagiba i sličnih intervencija. Veličina je u točkama, istim onima iz koordinata te će samim time prored i os kretanja prema dnu biti lagana za sračunati: recimo red od ukupno 12 točaka često traži otprilike 14 do 16 točaka razmaka po vertikalnom nagibu za ispravnu zračnost reda, pa za prvi odabir spuštanja vrijednosti Y stavite prored oko vrijednosti 14. Program ipak ne daje auto opciju novog retka (advance). To znači svaka baza proreda se mora izračunati i uvrstiti ručno kako bi izbjegli tekst gdje rečenica prelama stranicu, već kako bi to odradili s jasnim uvidom unutar koordinata

Važne činjenice o nazivu samog fonta jesu te da će font ovisiti o instaliranoj kolekciji pri vašem računalu pri iscrtavanju grafova iz OS-a s ugrađenim alatima. Prema istom pravilu, naziv i funkcija mogu iscrtavati oblike pod jednim imenom kod korisnika te pri obradi i print serveru u drugim okruženjima pokazivati eventualno neke anomalije lica. Isto vrijedi za niz jezika. Tako se iscrtavaju glifovi uz niz nedostataka pri konverziji teksta za ćirilične, odnosno one azijskog tipa i to ispisom pravokutnika pri zamjeni glifa na sustavima bez izbacivanja ikakvih prijava o grešci, točno radi čega naš glavni primjer za Hello World isprobava i koristi širu Unicode abecedu lica tijekom zamjene skripte

HotPDF TextOut page showing Arial, Times New Roman, and Courier New rendered with regular, bold, and italic styles across several character sets

Parametar za kut vrši rotaciju oko sidrišta

Treći argument je onaj kojeg kodovi ponajviše zauvijek ostave upisanog na nuli. Unesite bilo koju izabranu vrijednost i iscrtavanje pokreće tekstualni red te se prelama odnosno vrti udesno, obrnutom rotacijom suprotnom smjeru kazaljke sata. Sami kut prati vaše (X, Y) točke sidrišta pri postavljenoj vrijednosti broja znakova. Od donjeg kuta i lijeve baze s izabranim unosom iz baze kuta, tekst formira krivulje bez brisanja onih početnih koordinatnih točki baze. To će zapravo rezultirati u potpuno nepromijenjenom okomito čitanom rednom glifu, već će samo rotirati smjer te iste linije i njene znakove

Pdf.CurrentPage.SetFont('Arial', [fsBold], 11);

// A vertical axis label down the left margin: 90 degrees reads bottom-to-top.
Pdf.CurrentPage.TextOut(40, 300, 90, 'Units sold');

// A diagonal DRAFT watermark across the page body.
Pdf.CurrentPage.SetFont('Arial', [fsBold], 60);
Pdf.CurrentPage.TextOut(150, 250, 45, 'DRAFT');

// Column headers tilted 60 degrees so long labels fit a narrow table.
Pdf.CurrentPage.SetFont('Arial', [], 9);
Pdf.CurrentPage.TextOut(120, 600, 60, 'Q1 actual');
Pdf.CurrentPage.TextOut(160, 600, 60, 'Q2 actual');

Izbor vrijednosti kutnog broja od devedeset obično je tipična prilika te česti zahtjev za os u grafikonu. Pedeset i još koja znamenka odličan je trik kako zaobići muke prostranog polja tablice ukoliko ne stanu imena s popisa u usku, pa se time preskoči bilo kakav lom teksta naslova tablica. Bitno za upamtiti za samu uvrštenu vrijednost: usprkos postavljenom parametru od devet desetica on polazi redom od baza te i dalje nastavlja istim putem ravnomjerno prema kutu baze okomito. Time na 90 još polazite iz točaka prema Y bazi iz iste visine. Radije ga za ispravan pregled, ovisno o smjeru teksta jednostavno malo korigirajte u razmacima, kao kod razmjera teksta kod slojevitih vertikala linije

Pozicioniranje koordinata bez nagađanja

Koordinate su onaj dio gdje projekt ili preživljava pregled ili ga tiho narušava. HotPDF u praksi očitava bazu od dna pa s lijevog kraja lista okvira polazeći gore za os Y, za brojeve iz 72 jedinice okvira naspram inča. Standardi za obradu US Letter ispisuju se s po bazi od 612 do oko 792 polja; opcije za A4 u obradama variraju kroz format iz brojke od 595 sve na skroz rubni 842 rez u bazi. Ukoliko za sami 1-inčni okvir želite korigirati formu unosa pri dnu s postavljenim Y omjerom iznosa oko 792 na minus tih postavljenih 72, pa tu smanjiti veličine za vršni ispis teksta, morati ćete dobro razmisliti i to ukalkulirati jer će za suprotno ekran ispisivati s gornje trake nula i preskakivati prvi navod iz ispisa pri upisu preko vrha pa ispod ekrana

Postupajte sa svojim pregledom pri iscrtavanju prema naznačenim utorima umjesto pukog dodavanja magičnih iznosa kolumnama. S izabranim pravim poljima po vršnoj bazi kuta za 1, a onda uz svaki razlomljeni ubačaj formiran kroz red usputnog kodiranja te linijskim spuštanjem, to prolazi kroz niz blok-grafova koda do kraćih, bržih, jednostavnih linija:

const
  LeftMargin = 72;        // 1 inch in
  TopBaseline = 720;       // first line, ~1 inch down on Letter
  Leading = 16;            // vertical step between lines
var
  Y: Single;
  Line: string;
begin
  Pdf.CurrentPage.SetFont('Arial', [], 11);
  Y := TopBaseline;
  for Line in ReportLines do
  begin
    Pdf.CurrentPage.TextOut(LeftMargin, Y, 0, Line);
    Y := Y - Leading;
    if Y < 72 then            // bottom margin reached
    begin
      Pdf.AddPage;
      Pdf.CurrentPage.SetFont('Arial', [], 11);  // font resets on a new page
      Y := TopBaseline;
    end;
  end;
end;

Mjera osiguranja i zaštite preloma pri promjeni, a pogotovo sam rub u okvirima pri dnu znaju biti ona prva linija što lako nestane pod proredima kod prijeloma polja. Kod aplikacije TextOut izostaje podrška protočnom layout formiranju za polje te funkcije prelamanja linije ispod donjih okvira na rub. Stoga Y spušten preko okvira teksta samo prelazi i preslikava dno bez da se to uistinu prijavi preko prozora. Ovdje ćete osobno korigirati tu bazu te preko naredbe za prelaze kod aplikacije stranice tj AddPage izmijeniti osnovni rub. Nakon dodavanja AddPage obavezna stavka SetFont služi kako bi kod stranice kod koje linija fonta probija granice, i pri prelasku i nastavku kod pregleda aplikacije ostavila odrađeni, uvršteni default font preglednika, s obzirom kako original lica izostaje preko okvira

Razmaci u riječima kao i izmjene veličine za prilagodbe kod sučelja

Ponekad je tekst ispravan, ali je krive širine: zaglavlje koje mora pratiti određenu liniju s propisanom širinom, razlučiviji prikaz dugačkih upisa, brojke unosa itd. PDF dolazi oboružan uz dvije mogućnosti i potpore stanju formata i razmaka: za razmak unosa odnosno teksta za mjerenja između karaktera funkcijom (Tc, ili dodatak po samim prostorima po završenom utoru pojedinog razmaka tj glifa unutar linije) plus opcija teksta za sami raspon niza (Tw, što mjeri mjesta prema širini upisanih riječi u točki za mjerenje odnosno pauzi). Uzimajući funkcije u razmjer s veličinom upisanih točki oba slučaja uz fontove, one ne preuzimaju funkciju od uloge koda TextOut pa stoga te argumente vi korigirate, preslikate potom poništite natrag na nulu po okončanju teksta

// Letter-space a short heading so it stretches across a rule.
Pdf.CurrentPage.SetCharacterSpacing(4);
Pdf.CurrentPage.SetFont('Arial', [fsBold], 14);
Pdf.CurrentPage.TextOut(72, 740, 0, 'S U M M A R Y');
Pdf.CurrentPage.SetCharacterSpacing(0);   // reset before normal body text

// Open up the gaps between words on a single wide line.
Pdf.CurrentPage.SetWordSpacing(6);
Pdf.CurrentPage.SetFont('Arial', [], 11);
Pdf.CurrentPage.TextOut(72, 712, 0, 'Name        Department        Extension');
Pdf.CurrentPage.SetWordSpacing(0);

Sami unutar izračunati dio riječi uvelike radi uz samo jedno slovo s razmakom, kod oznake za ASCII 32. Važno za istaknuti je oprez kod primjene CJK teksta u situacijama izračuna razmaka kod nizova unosa riječi. Razmaci iz ASCII funkcije tu redovno uzrokuju anomaliju preko formata tekstova pa time on kod prikaza ne formira ispravan ispis iznad ASCII-ja već kod očitavanja preko baze indeksa lica od originala s kojim manipuliramo. Ukoliko govorimo za format baze podataka latinoameričkih jezika obično se tu traži rješenje i jeftin upad pa tu iskoristite i prijenos raspona kroz redak da izbjegnete tipkanje preopširno na dugačko preko trake pri iscrtavanju preko osnove razmaka pojedinih slova. Ta funkcija razmaka bolje podnaša potrebe za usklađivanjem u rubrikama i samoj strukturi u vrsti širine naspram obično pukog bacanja rješenja kroz razmake riječi unutar okvira teksta

Sam čin prebrisavanja koda jest glavna crta radnog protokola. Smanjenje, te prilagodbe samih lica, idu kroz izmjene postavki slike uz promjene u stanju te iscrtavanju te samih lica okvira po promjeni iz istoga. Izostavite prilagodbe nazad na bazu slova odnosno nulu (reset), razmjeri za niz preneseni ovdje kroz raspon prešutno razvlače red, te to na prijelom stvara jedva prisutnu širinu teksta bez logike i samog opisa baze koda koji uredni probni ispis lako prođe bez da izazove sumnje. Oprez: uz prebrisavanja formirajte vrijednosti u razmacima lica kroz upis do formiranja željenog ispisa, a po završetku okvira tu nulu izbrišite. Niti jedan od kasnije kreiranih koda na okvire neće prepoznati onaj od prije kreiranog bazičnog ispisa ranije napravljenog dijela unosa koda linije

HotPDF TextOut page comparing horizontal text scaling, character spacing, word spacing, and fill versus stroke rendering modes

Provjera rezultata i provjera gdje sustav u stvari pukne pri prikazu

Layout teksta nerijetko zapne već pri prelasku radne stanice unutar preglednika klijenta pri pokretanju, a ne preko vašeg zaslona, jer kontrole samih iscrtavanja ovisno o okruženju zahtijevaju odradu bez obzira jeste li prisutni nad projektom na mreži klijenta ili unutar firme na lokalnom stolnom sustavu. Pregled na računalima gdje odabir teksta od kreatora instalacija baze lica ne postoji i pritom potvrda ispisa skriptiranih podloga glifa ostaje valjana za strane baze koda uz prijelaze i lica na okomiti te vodoravni format složen iz skripte te za red interpunkcija ne trpi provjeru na osnovnoj bazi kroz jednostavne karaktere od početka formata reda do dugačkih unosa kod formiranja PDF-a na sustavima klijenta i testovima okvira baze na istom. Proba prolazi kroz provjeru ispisa gdje baze od teksta umjesto u linijskim okvirima teksta ostaju iz reda do redova teksta. Kodovi, funkcije tražilica i baza bitne su ovdje iz navedenog. Isprobajte dizajn koda formata ubacivanjem ispunjenih opcija u okvir i raspon teksta. Dodajte iznimno opsežna strana te posebna imena unosa kao i predugačka polja s mjesta okvira kako ne biste trebali osobno puniti raspon baze formata kako vas linija ispisa s onog mjesta baze za koji niste isprobali upis preko teksta pri radu iz navedenog formata pretrpana kodovima redom ne bi zatekla dok prolazite provjeru baze ispisa te za upise polja PDF datoteke. Provjera izvan formata za pregled i tiskano ispisana za dokument dat će bolji pregled razmjera tekstova unutar baza rubnih redova formata negoli s običnim poljima raspona četvrtinke mm po okomici (koji pred okom ne daje pregled baze teksta iz aplikacije na zaslonu pri usporedbi unutar margina na medijima u tiskarama pri prikazu na rubnim papirima medija tiskanja

Ukoliko još u izradi nemate upisanu apsolutno nikakvu varijantu dokumenta probajte opcije primjera poput HotPDF Hello World koji postavlja predloške te funkcije kreiranja od osi odozdo za bazu pregleda u sustavima u kreaciji po dokumentu odozdo unutar svih oblika gore iznesenih postavki. Ovi pozivi za TextOut i kodiranje kao i upisi parametara pri aplikaciji i upisivanju polja iz razmaka prikazanih ovdje integrirani u opciju baze SetFont kao primjeri dio su iz ponude od samog kreatora HotPDF komponente unutar izvedbe sučelja za Delphi te varijantu u formatu kod jezika za C++Builder