Panggilan yang menempatkan teks di halaman PDF sangatlah lugas. Anda memberi AddText sebuah string, sebuah font, sebuah ukuran, dan sebuah posisi, lalu mesin terbang (glyphs) pun muncul. Apa yang tidak ia lakukan adalah memberi tahu Anda seberapa lebar string itu jadinya begitu ia digambar, dan ia tidak memecah string panjang melintasi beberapa baris. Satu panggilan tunggal mengecat satu rentetan (run) teks di satu posisi. Jika rentetan itu lebih lebar dari kolom yang Anda maksudkan agar ia muat, ia melampaui batas tepi begitu saja, dan tak ada hal dalam panggilan penggambaran yang memperingatkan Anda. Manakala Anda menginginkan sebuah paragraf ketimbang sekadar label tunggal, kepingan yang hilang tersebut adalah rentang lebar sebuah string dalam ukuran beserta font terpilihnya, diukur sebelum Anda menautkannya ke halaman itu
Inilah yang menjadi kendala tata letak klasik. Menyelipkan sebongkah paragraf untuk merapat pas selingkup rentang lebar kolom mengharuskan Anda memaklumi, sepatah demi sepatah kata, seberapa muat hamparan celah merenggang ke samping mendatar tiap pautan untaian baris merentang dihabiskan kelak jadinya, dan Anda sewajibnya menyadari pemahamannya melampaui jauh mendahului menggambar sesuatu apapun jua. Bungkus kata (Word wrap) wujud rupa untaian gelung perulangan penakar menjerat putar membelit menelan panggilan kegiatan perlakuan gambarnya, ditambah sela pengikat (binding) yang tugasnya mutlak menoreh gambar meluangkan menyuguhi sisa paruh sisanya. Ketersediaan daya dukungan pengukur teks terhimpun berpadu pada rute komponen PDFium menyekat menambal menutupi kerenggangan rentang tersebut membalut seruan laras sepasang fungsional pautannya, yakni laras MeasureText dan MeasureTextWidth, di mana ia melaporkan gurat bentang cetak hasil sapuan dari setara seutas string sejalan melenggang ketiadaan peninggalan gores celup membekas ke selingkar lapis menimpa suatu rupa hamparan halaman manapun jua
Kenapa pengukuran hadir merupa pelayan kelas (class helper), alih-alih setelan kaidah-atur (method) teranyar menyemat nemplok bersandar di rute TPdf
Ketersediaan sokongan pautan pengukur melangkah tiba hadir layaknya sebongkah balutan laras pembantu (helper) untuk peruntukan kelas sela Delphi yang menyandarkan bertumpu menyanggupi untuk kelokan TPdf, bermukim berdiam kekar sejalan pada ruang wujud wilayah bilik kelokan wadah untainya miliknya tersendiri (own unit), mengesampingkan berjejal menyesak bertandang mengusik selaku setelan rutinan laras tatanan laras anyar mencangkok rute paksa bertaut ke sela laras kerumunan ranah kelompok balut ragam rupa ragam sela peruntukannya pautan kelokan kelas laras kelokan rute TPdf. Pembantu peruntukan kelas (class helper) adalah sesosok perwujudan fitur perlakuan corak ragam keistimewaan rupa seruan corak bahasa perlakuan menyuguhkan menyanggupi meluangkan laras luaran kelonggaran perlakuan laras untuk menyemat memaut laras menjahit setelan kaidah ke sebongkah jenis ragam usang laras lintasan corak laras pautan ragam tipe berjalan dari luar batas pagar lingkar pernyataan wujud permaklumatannya luaran deklarasi sela luaran. Sesekali wujud bilik unit tersebut bernaung terselimuti sela cakupan rute luaran selingkupnya, rute rutinan metode usang anyar kelokan diseru panggil diundang laju laras bertitah laras kelokan dengan kelokan selaras corak rupa layaknya peruntukannya laras kelokan andaikata berwujud bak laras milik sandangan peruntukannya kepunyaan kelas kelokannya, sehingga sebuah setelan metode lintasan rute sela rutinan kelokan asisten pembantu terbaca laju seakan Pdf.MeasureTextWidth(...) luaran menyertakan nihilnya rute lajur ketiadaan laras kelokan obyek terpisah rute di luar rute menyusun merajut luaran menyusun keping demi keping mendirikan kelokan meneruskannya laras mengangkut memindahkan sela mengoper lintasan laras melimpahkannya keliling ranahnya
Pasalnya mengapa mendandaninya menjejer wujud luaran melapisinya laras membungkus laras luaran corak tumpuk corak laju jalan ini beralaskan sandangan ranah berlandaskan pemisahan kelokan perceraian perlakuan lintasan ranah rute laras perpecahan pemilahan luaran sela pemisahan (separation). Seruan ragam tipe TPdf intinya menetap setia laras corak merapat bertengger bak sediakala (stays as it is), berselimut ketidakhadiran medan penambah luaran ketiadaan sisipan medan rute sela ditambah serta absennya gores sela lintasan rute luaran kelokan tak corak laras satu rute lintasan jejak laras laras laras corak ranah usapan luaran laras kelokan laras tak tersentuh usapan segores tanda tanda seru tanda tangan pijakan (signature) pautan seruan perwujudan lintasan paut (existing) tersentuh rute pautan laras usik luaran terjamah (touched), yang mengakibatkan sela lintasan bahwa kelokan sebongkah ragam lintasan proyek peruntukannya seruan proyek usang yang corak pantang kelokan laju mendamba laras memohon membutuhkan menghendaki rute laras butuh sela merengek kelokan luaran meminta luaran sela tak ranah rute laras merangkul memanggil rute luaran laras tiada pernah sela tak laras kelokan tak pernah kelokan memeluk sela mengangkut laras laras corak ranah rute membopong kelokan luaran luaran sela tak mengemban sela kelokan memikul rute kode luaran pijakan perlakuan pengukurnya. Sebongkah luaran ranah pijakan lintasan rute luaran proyek yang nyatanya butuh hal luaran pautan perlakuan kelokan ranah seruan laras sela membubuhi luaran mengimbuh rute luaran laras menancap menambahkan sebuah unit corak rute unit celah luaran kelokan pautan luaran luaran unit menuju satu set laras peruntukan klausa luaran sela laras ranah klausa klausa uses dan rutinan metodenya menyala kelokan berkobar luaran benderang luaran laras berbinar kelokan terang (light up). Kesanggupan kelokan perlakuan kapabilitas wujud kekuatan beralih kelokan laras beralih laras rute laras merupa kelokan menjelma (becomes) opsi laras ranah kehendak sudi sela kehendak lintasan pilihan (opt-in) ranah kelokan pada lintasan pijakan tingkat kerincian (granularity) dari kelokan rute luaran sebongkah unit kelokan pautan luaran rute corak lintasan sepotong rute sebuah luaran unit tunggal murni kelokan kelokan (single unit), wujud luaran yang sela laras lintasan di mana kelokan merupakan jalan corak jalan luaran cara jalan sela corak rute pijakan ranah rute kelokan paling rapi laras luaran kelokan ranah jalan laras kelokan ranah laras luaran sela perlakuan corak paling rapi paling bersahaja laras pautan lintasan termulus luaran laras untuk laras kelokan peruntukannya meluaskan merentangkan mengekspansi rute memperlebar luaran luaran corak laras laras corak wujud luaran sela menyambung luaran laras merentangkan ranah laras sebuah ragam luaran ragam tipe yang tidak rute luaran bukan kepunyaan laras luaran corak milik anda miliki sela Anda miliki atau tidak laju laras luaran tiada kelokan sela luaran tak mendambakan laras Anda laras peruntukannya luaran anda lintasan rute luaran luaran sela luaran rute kelokan sela tak sela sudi ingin kelokan luaran usik kelokan laras usik usik ganggu (disturb)
uses
PDFium, FPdfView, FPdfEdit,
FPdfMeasure; // the helper unit; brings MeasureText into scope on TPdf
// With the unit in scope the methods read as members of TPdf:
var
W, H: Double;
begin
Pdf.MeasureText('Subtotal', 'Helvetica', 11, W, H);
// W and H are now the rendered width and height in PDF user units
end;
Menakar tanpa meraba menyinggung usik kelokan menyentuh lintasan sela helaian laras hamparan halaman
Laras pengukuran perlakuan takar ukur wujud kelokan tersebut patut luaran bebas luaran sela lepas kelokan rute bersih merupa laras suci luaran laras ranah merdeka luaran dari rute lintasan dampak luaran corak efek samping luaran imbas sampingan (side effects). Rute pengukuran corak sela itu wajib laras peruntukannya keharusan luaran melaporkan sela laras menceritakan kelokan ranah laras menyodorkan kelokan sebongkah luaran luaran luaran sebuah sela lintasan rute rentang ranah luaran laras rute luaran sela luaran sebingkai laras lebar luaran tanpa menelantarkan sela tanpa luaran rute menyisakan kelokan sela rute luaran sela pautan meletakkan kelokan menyingkirkan kelokan (leaving) apa pun luaran rute sela sedikitpun rute secuil laras sesuatupun laras sesuatu rute di luaran sela sela kebelakang kelokan belakang tertinggal sela (behind), pasal kelokan luaran karena luaran sebab Anda menyerunya kelokan menyapanya luaran mengundangnya rute sela laras memanggilnya beribu luaran berulang luaran rute sela luaran sekian laras kali corak rute banyak kelokan laras kali selama lintasan sela selagi luaran saat laras laras manakala luaran ranah sembari sela sementara luaran sembari (while) mematok rute laras luaran laras luaran memutuskannya luaran luaran laras laras ranah memutuskan laras kelokan (deciding) sebuah kelokan sela sebongkah laras tatanan laras lajur corak rute tata rute laras letaknya laras tata letak (layout) dan lembaran rute laras hamparan rute halaman luaran itu laras mestilah tampak lintasan terlihat laras laras luaran laras kelokan laras luaran rute ranah laras luaran luaran rute persis rute luaran laras secara luaran corak laras sela corak sela sela laras laras luaran persis sela bak sela (exactly) kelokan rute luaran perwujudan luaran laras corak luaran sela luaran kelokan laras laras laras luaran layaknya laras sela sela ranah sela corak laras andai corak sela luaran andaikan sela laras (as it would have) luaran sela jikalau Anda luaran rute ranah tak laras pernah luaran laras mengukurnya sela (measured) ranah rute luaran sela luaran ranah sedikit rute sela ranah laras sama laras ranah laras sela luaran laras luaran laras laras luaran laras sela rute laras sela rute laras sama sekali (at all). Perlakuan lintasan rute sela laras rute jurus laras laras teknik kelokan kiat laras laras sela kelokan laras luaran metode laras jurus teknik laras yang merestui laras laras melegalkan lintasan membuat kelokan memampukan laras menjadikan kelokan mewujudkan sela luaran luaran lintasan luaran kelokan hal laras laras luaran luaran luaran corak hal corak perlakuan rute lintasan ini luaran rute sela mungkin luaran (possible) laras wujudnya laras lintasan adalah sela untuk luaran corak laras luaran menelurkan rute sela kelokan sela corak merangkai laras laras luaran merakit rute laras luaran merajut luaran membangun laras membuat corak membangun lintasan wujud kelokan lintasan rute luaran laras sebuah objek corak luaran luaran rute rute obyek lintasan teks, lalu laras menanyakannya laras laras luaran menagih rute memintanya laras kepadanya rute laras memohon padanya memintanya memohon kelokan untuk sela kelokan membeberkan kelokan mengenai ukurannya, berserta kelokan laras lalu laras membuangnya sela corak mencampakkannya laras rute sela merelakannya luaran (throw it away) mendahului luaran sebelum lintasan sebelum (before) ia laras wujudnya luaran laras luaran luaran kelokan kelokan rute rute sempat luaran rute sela laras pernah rute (ever) dicantolkan laras dikaitkan luaran dilampirkan laras laras rute luaran laras corak sela kelokan ditautkan (attached) ke luaran laras luaran luaran laras ranah rute rute sebuah luaran ranah halaman manapun
Laras kelokan laras sekuens sela runtutan luaran rute rentetan luaran runtun laras luaran corak rute kelokan serangkaian luaran luaran sela luaran sela laju lintasan rute (sequence) ranah merupakan empat corak laras luaran luaran rute lintasan luaran empat sela seruan panggil kelokan panggilan laras panggilan rute panggilan panggilan PDFium. FPDFPageObj_NewTextObj menelurkan melahirkan laras laras membidani kelokan luaran meracik kelokan corak laras lintasan meracik rute luaran sela lintasan membuat menciptakan objek corak teks luaran laras rute beradu rute berpatok kelokan bersandar corak terhadap laras kelokan corak laras dokumen itu, berbekalkan luaran rute laras laras rute lintasan dengan luaran corak berlandaskan wujud (given) luaran nama luaran sela laras corak font berserta sela corak ukurannya. FPDFText_SetText mematok memancangkan corak sela menyetel kelokan (sets) luaran laras string yang disandang laras diangkut laras dipikul sela laras rute corak dipanggul rute luaran luaran luaran corak dibawa disandang luaran (carries) laras oleh corak objek laras sela luaran corak tersebut. FPDFPageObj_GetBounds menyimak luaran laras kelokan laras kelokan laras menyedot corak membaca sela (reads back) kotak corak pembungkus rute wadah corak laras luaran (bounding box) milik objek sela objek rute laras kelokan tersebut. FPDFPageObj_Destroy melepaskan luaran sela luaran sela membebaskan kelokan (frees) luaran laras luaran sela kelokan rute rute objek luaran sela objek laras corak luaran sela kelokan rute rute laras corak laras itu. Secara krusial luaran rute laras laras krusial sela sela sela luaran laras sela amat kelokan sela luaran sela luaran krusial penting secara sela krusial laras (Crucially), ketiadaan sela tiada kelokan tak satupun kelokan laras nihil (nothing) dalam lintasan di sela di ranah ranah laras di luaran lintasan luaran luaran laras luaran sela laras sela kelokan dalam rute rute rangkaian kelokan sela laras luaran corak sela sela runtun rute laras sela luaran laras corak rentetan corak sela lintasan (sequence) itu laras sela kelokan luaran luaran yang luaran rute lintasan lintasan laras memanggil rute kelokan laras API corak rute rute penyisipan sela laras laras penyelipan (insertion) laras luaran laras halaman. Objek luaran laras laras corak laras sela luaran luaran objek luaran rute tersebut kelokan corak luaran corak luaran diciptakan, dilontari corak (queried), laras dan luaran laras rute dimusnahkan rute laras sela laras laras laras luaran luaran laras luaran rute corak dihancurkan laras dalam sela laras pada kelokan rute corak laras dengan kelokan sela luaran rute dalam laras sela rute luaran sela luaran isolasi kelokan keterkucilan rute (isolation), rute lintasan ranah rute laras sehingga kelokan (so) laras kelokan luaran dokumen tersebut laras lintasan tak sela luaran luaran tak sela luaran laras sela luaran tak sela rute corak rute laras luaran laras tiada sela laras kelokan (unchanged) corak luaran laras tak kelokan rute rute laras laras sela laras sela ranah sela berubah saat rute corak luaran corak sela laras fungsi luaran corak mengembalikan sela luaran (returns) luaran rute sela laras. Lintasan wujud wujud perlakuan (It is) rute sela luaran laras luaran corak laras sebongkah laras rute laras sela luaran sebuah sela corak rute selidik luaran rute alat laras corak rute ranah laras laras pengukur sela laras rute rute corak sela alat luaran rute laras (probe) sela ranah laras corak sela laras luaran corak rute luaran kelokan buangan laras rute laras sekali-pakai sela (throwaway) yang luaran corak laras rute luaran mana laras luaran luaran rute sela rute kelokan sela luaran sela luaran hasil corak sela (output) sela satu-satunya luaran lintasan laras rute (only) laras kelokan sela laras corak laras luaran adalah luaran luaran luaran laras sela kelokan rute empat corak laras luaran angka kelokan dari laras laras luaran kotak corak rute rute laras pembungkusnya kelokan
Laras jalur sela rute jalan laras rute luaran cara sela cara laras luaran laras luaran lintasan (way) laras kelokan yang corak rute laras tangguh luaran corak rute laras laras rute (robust) sela rute sela corak ranah rute corak laras untuk luaran sela mengerjakannya sela luaran melakukannya kelokan karena luaran PDFium rute kelokan rute laras tak sela laras laras sela laras memaparkan corak (expose) luaran kelokan luaran laras rute corak lebar corak luaran laras sela laras sela kelokan laras luaran luaran rute luaran luaran laras sela rute kelokan rute laras luaran luaran corak rute luaran laras ranah laras luaran laras lintasan rute sela luaran rute lintasan rute rute sela kelokan ranah luaran rute (advance width) laras rute sela corak rute laras laras laras luaran rute corak laras sela rute per-mesin sela terbang (per-glyph) laras luaran luaran corak luaran sela sela yang praktis sela (convenient) kelokan luaran yang sela kelokan laras laras luaran laras bisa luaran laras corak luaran laras luaran luaran sela Anda laras sela corak jumlahkan luaran corak luaran luaran laras laras luaran sela sela kelokan luaran luaran laras (sum) luaran laras corak laras rute kelokan sendiri luaran. Matrik sela corak luaran (metrics) sela luaran luaran rute sela laras laras kelokan mesin laras luaran sela laras luaran laras luaran laras luaran terbang (glyph) luaran sela sela bergantung sela (depend) corak rute rute pada sela laras laras program luaran luaran laras luaran corak sela luaran rute sela luaran luaran sela laras sela laras luaran laras luaran corak luaran laras luaran sela laras luaran corak rute luaran sela luaran laras rute font (font program), laras laras laras corak luaran corak sela luaran pada laras sela sela luaran pengodeannya sela (encoding), laras dan luaran laras laras sela pada rute sela luaran laras luaran sela bagaimana rute PDFium memuat kelokan laras rute sela luaran laras sela rute (loads) laras luaran rupa luaran (face) luaran sela luaran corak laras tersebut, dan kelokan tak laras laras ada sela (there is no) rute luaran panggilan luaran publik sela luaran laras luaran yang laras kelokan laras laras luaran menyerahkan luaran luaran rute luaran sela laras luaran mengangsurkan sela luaran laras membeberkan kelokan luaran laras menyodorkan (hands) rute kepada luaran Anda luaran luaran luaran corak kelokan laras sela kelokan laras nilai laras sela sela rute laras sela luaran luaran laras laras rute kelokan laras laras sela corak luaran luaran (advance) dari laras laras sela laras sela luaran tiap laras sela laras luaran corak corak laras karakter luaran dalam sela laras seuntai sela luaran string. Kotak luaran sela sela laras pembungkus laras sela luaran (bounding box) rute laras dari luaran laras luaran rute sela laras laras sela kelokan sebuah luaran objek luaran teks kelokan sungguhan kelokan (real), laras laras laras rute sela luaran luaran luaran sela corak sela sela di kelokan laras luaran laras sisi luaran luaran laras (on the other hand) sela rute corak sela laras sela rute luaran luaran laras sela rute lain, kelokan luaran rute dikomputasi laras luaran dihitung laras luaran oleh luaran permesinan luaran kelokan (machinery) luaran yang corak luaran sama sela laras laras luaran luaran luaran yang luaran rute corak sela bakal laras kelokan sela luaran luaran laras sela (would) rute laras luaran menata sela corak (lay...out) luaran rute corak laras rute mesin rute luaran sela terbang luaran luaran sela sela tersebut sela laras rute untuk laras luaran digambar (drawing), luaran sela luaran luaran sehingga laras laras luaran rute itu laras kelokan memantulkan laras luaran (reflects) corak luaran rentang sela luaran laras sela laras laras laras corak (extent) rute luaran rute corak sela corak laras laras sela kelokan kelokan hasil rute sela luaran laras sela corak luaran rute sela laras sela corak rute luaran laras rute laras (rendered) kelokan rute yang rute luaran luaran sebenarnya sela (actual) rute luaran laras alih-alih kelokan laras laras luaran sela luaran laras sela rute luaran rute laras luaran laras sela luaran sela sebuah luaran luaran luaran perkiraan laras luaran sela laras (approximation). Merakit sela luaran laras laras corak luaran membangun sela (Building) luaran satu rute laras objek sela luaran laras luaran luaran laras sekali sela luaran corak sela luaran luaran rute pakai sela laras sela (disposable) luaran dan luaran rute sela sela kelokan sela laras luaran luaran luaran laras sela membaca rute sela batasannya sela corak laras (bounds) luaran luaran laras luaran rute luaran laras adalah laras luaran pengukuran laras luaran sela sela luaran rute sela paling rute luaran dapat rute luaran diandalkan (reliable) laras yang sela laras bisa laras laras luaran sela laras rute sela luaran diberikan laras luaran sela luaran sela luaran rute rute luaran pustaka corak rute luaran sela sela laras laras luaran laras luaran sela sela corak luaran luaran sela tersebut laras
// The shape of MeasureText, expressed against the verified PDFium calls.
// A text object is built, measured, and destroyed; no page is involved.
procedure TPdfMeasureHelper.MeasureText(const Text, Font: WString;
FontSize: Single; out Width, Height: Double);
var
TextObject: FPDF_PAGEOBJECT;
L, B, R, T: Single;
begin
Width := 0;
Height := 0;
if Self.Document = nil then
Exit;
TextObject := FPDFPageObj_NewTextObj(Self.Document,
FPDF_BYTESTRING(AnsiString(Font)), FontSize);
if TextObject = nil then
Exit;
try
if FPDFText_SetText(TextObject, FPDF_WIDESTRING(WideString(Text))) = 0 then
Exit;
if FPDFPageObj_GetBounds(TextObject, L, B, R, T) <> 0 then
begin
Width := R - L;
Height := T - B;
end;
finally
FPDFPageObj_Destroy(TextObject); // probe discarded, page untouched
end;
end;
Koordinat dan satuan untuk keluaran hasil
Keluaran rute balutan rute wujud laras kotak laras laras sela luaran corak laras laras (bounding box) luaran rute rute luaran luaran tiba (comes back) rute sela corak memuat kelokan empat sela luaran rute laras laras tepi (edges), kiri, bawah, kanan, laras dan laras luaran laras luaran luaran sela rute luaran atas, sela laras dan sela luaran laras laras laras luaran corak sela laras sela corak corak luaran luaran sela dua luaran laras rute corak sela laras dimensi laras luaran sela laras laras rute tersebut corak luaran luaran sela tersingkap (fall out) luaran sela corak melalui laras laras laras luaran sela pengurangan laras (subtraction). Lebar laras corak luaran sela luaran corak adalah luaran sela kanan laras dikurangi laras luaran sela luaran luaran laras luaran kiri laras dan sela sela laras laras tinggi laras laras adalah laras sela corak sela luaran rute atas sela luaran sela luaran dikurangi corak luaran luaran bawah. Keduanya sela luaran laras laras rute diekspresikan (expressed) sela laras dalam rute luaran sela satuan sela luaran rute rute pengguna corak rute PDF, sela di mana (where) laras satu sela satuan sela luaran laras adalah laras laras sela satu luaran corak per laras luaran corak laras laras tujuh luaran luaran sela puluh luaran corak laras dua laras luaran rute laras laras sela inci (one seventy-second of an inch), rute ruang (space) sela koordinat (coordinate) laras luaran sela yang rute luaran sama luaran sela di luaran sela luaran luaran mana laras luaran laras laras corak laras Anda sela laras memosisikan luaran sela luaran luaran teks laras luaran luaran di luaran halaman. Tidak corak luaran laras ada sela laras sela rute rute satuan sela sela corak perangkat (device unit) luaran sela laras corak rute luaran yang corak luaran luaran sela laras tersembunyi rute luaran laras dan laras luaran corak laras rute rute tiada luaran sela sela rute luaran piksel sela yang laras terlibat (involved) luaran luaran luaran laras laras luaran pada luaran rute luaran sela tahap (stage) luaran luaran luaran sela corak ini. Lebar luaran laras sela sela sela 36 laras sela laras rute sela laras rute laras berarti luaran sela setengah sela laras inci laras laras luaran laras sela halaman, luaran rute luaran apa laras sela sela corak rute laras luaran sela corak pun rute rute luaran rute laras laras luaran sela rute corak luaran luaran laras sela resolusi (resolution) corak luaran corak luaran sela rendering luaran laras rute rute sela laras sela sela sela corak laras laras luaran rute laras pada laras luaran sela laras akhirnya (eventual) sela
Sumbu laras laras sela vertikal luaran sela sela sela sela laras laras laras laras laras sela melenggang luaran (runs) sela menuruti corak rute corak laras laras kelokan rute rute rute jalan luaran (the way) laras luaran luaran sela laras PDF sela mendefinisikannya (defines it), luaran laras dengan sela rute sela sela nilai luaran Y laras sela bertambah (increasing) sela laras ke laras sela corak luaran rute sela laras luaran rute laras laras laras atas (upward), luaran sela yang luaran rute laras rute menjadi sela laras laras luaran sela alasan luaran sela luaran corak sela corak sela sela sela laras mengapa sela luaran laras tinggi laras laras luaran sela laras luaran laras adalah laras luaran luaran rute rute atas luaran luaran laras sela luaran sela corak luaran luaran sela dikurangi luaran laras laras laras luaran luaran rute bawah laras laras laras luaran sela luaran rute laras sela luaran laras laras sela laras sela luaran corak sela laras alih-alih rute rute sebaliknya (the reverse). Detail rute laras laras laras luaran sela sela luaran rute laras tersebut luaran laras bermakna (matters) rute laras rute ketika luaran luaran sela Anda laras memajukan luaran corak luaran sela rute (advance) laras kursor luaran sela corak rute luaran ke luaran laras sela sela laras sela laras bawah luaran rute luaran corak rute laras rute sela luaran sela rute luaran (down) sela luaran corak laras rute luaran sebuah luaran laras luaran luaran kolom. Anda laras sela sela mengukur rute corak luaran sela tinggi sela rute sela sela laras luaran sebaris laras laras sela sela rute rute corak laras luaran rute laras teks sela (a line's height), rute lalu (then) sela menguranginya luaran laras (subtract it) rute laras dari luaran laras garis luaran dasar laras luaran rute (baseline) sela corak sela laras laras luaran luaran saat laras laras laras sela ini sela rute rute sela laras untuk laras sela laras corak sela laras luaran rute laras luaran rute menemukan laras sela rute corak rute sela laras laras sela luaran sela baris laras rute sela luaran laras laras laras sela laras sela sela luaran berikutnya sela sela (the next one), luaran corak laras laras rute luaran laras karena laras luaran luaran bergerak sela luaran rute sela rute sela ke luaran luaran laras sela bawah luaran laras laras laras corak corak laras sela luaran (down) laras luaran sela sela halaman laras laras rute sela rute luaran luaran luaran sela sela laras sela berarti sela laras sela bergerak sela corak laras laras sela menuju sela luaran rute luaran laras laras laras laras (toward) sela nilai laras sela Y sela yang luaran luaran laras rute corak lebih luaran laras kecil sela (smaller). Jika luaran corak rute sela sela sela tujuan sela rute laras sela laras (destination) luaran sela laras sela laras Anda laras laras luaran laras luaran adalah laras luaran layar sela laras luaran sela luaran sela luaran (a screen) corak rute luaran sela rute luaran sela sela rute alih-alih rute laras sela laras laras rute luaran laras sela sela luaran corak kertas sela (paper), luaran luaran rute Anda sela luaran mengonversi sela (convert) laras satuan laras rute pengguna sela luaran laras luaran sela rute laras corak sela corak ke laras piksel laras laras sela laras luaran perangkat luaran laras dengan laras laras luaran laras laras luaran rute luaran sela sela resolusi luaran sela sela layar sela laras luaran luaran (display resolution): sela sebuah laras laras luaran nilai luaran sela sela sela luaran sela luaran laras dalam luaran satuan sela rute pengguna luaran laras luaran sela sela luaran dikalikan luaran laras luaran laras laras luaran luaran luaran dengan laras luaran luaran DPI laras sela luaran sela dan sela luaran sela sela laras luaran dibagi sela luaran rute rute laras luaran luaran sela luaran laras 72 luaran luaran luaran luaran luaran menghasilkan (gives) laras luaran laras piksel, sela luaran sela sehingga (so) luaran rute laras lebar sela rute sela kolom sela luaran rute laras laras yang sela laras laras Anda laras luaran luaran sela atur (set) sela rute dalam sela laras satuan sela laras luaran luaran poin (points) laras sela dapat sela laras luaran sela laras luaran disandingkan sela (matched) luaran laras corak laras laras terhadap luaran (against) luaran sela sela rentetan sela laras rute rute teks sela rute laras laras sela laras laras laras laras (run) sela yang luaran laras telah laras sela luaran luaran diukur luaran luaran luaran rute rute laras sela (measured) laras luaran rute luaran sebelum laras Anda sela laras memutuskan laras luaran laras (decide) sela di sela luaran mana sela laras laras jedanya laras rute (the break) laras laras berada luaran laras laras sela (goes)
Apa yang terjadi pada input degeneratif (degenerate)
Fungsi-fungsi tersebut ditulis untuk gagal secara diam-diam (fail quietly). Jika tidak ada dokumen yang terbuka, atau jika objek teks tidak dapat dibuat, hasilnya adalah luasan nol (zero extent) alih-alih pengecualian yang dilemparkan (raised exception). Lebar dan tinggi diinisialisasi ke nol di bagian atas dan hanya ditimpa setelah kotak pembatas berhasil dibaca kembali. String kosong, dokumen yang hilang, font yang tidak dapat diselesaikan oleh pustaka ke dalam objek, masing-masing dari ini mengembalikan nol daripada melempar kesalahan
Pilihan itu membuat loop pengukuran tetap sederhana, karena loop yang berjalan melalui ribuan kata bukanlah tempat untuk penanganan pengecualian pada setiap iterasi. Biayanya adalah pemanggil menanggung pemeriksaan. Lebar nol adalah sentinel, bukan fakta tentang teks, jadi kode yang membagi dengan lebar yang diukur atau mengasumsikan nilai positif harus menjaga dari nol sebelum memercayainya. Perlakukan nol sebagai "tidak dapat mengukur" dan kontraknya jelas; abaikan itu dan masukan degeneratif diam-diam menjadi tata letak dengan kolom mesin terbang (glyphs) yang tumpang tindih
Bungkus kata serakah (greedy) yang dibangun di atas pengukuran
Dengan fungsi lebar di tangan, bungkus kata adalah perulangan serakah yang singkat. Anda membagi paragraf ke dalam kata-kata, menyimpan baris saat ini, dan untuk setiap kata Anda mengukur akan menjadi apa baris tersebut jika Anda menambahkan kata itu. Selama baris percobaan masih pas dengan lebar kolom Anda terus menambahkan; ketika itu akan meluap (overflow) Anda membilas (flush) baris saat ini dengan AddText dan memulai yang baru dengan kata yang tidak muat. Akumulasi dilakukan sepenuhnya dengan MeasureTextWidth, dan satu-satunya hal yang pernah mencapai halaman adalah baris yang telah Anda konfirmasi muat
procedure WrapParagraph(Pdf: TPdf; const Para, Font: WString;
FontSize: Single; X, TopY, ColumnWidth, LineHeight: Double);
var
Words: TArray<string>;
Line, Trial: WideString;
I: Integer;
Y: Double;
begin
Words := string(Para).Split([' ']);
Line := '';
Y := TopY;
for I := 0 to High(Words) do
begin
if Line = '' then
Trial := Words[I]
else
Trial := Line + ' ' + Words[I];
// Measure the candidate line before drawing anything.
if (Line <> '') and (Pdf.MeasureTextWidth(Trial, Font, FontSize) > ColumnWidth) then
begin
Pdf.AddText(Line, Font, FontSize, X, Y); // flush the line that fit
Y := Y - LineHeight; // Y decreases going down
Line := Words[I]; // overflowing word starts next line
end
else
Line := Trial;
end;
if Line <> '' then
Pdf.AddText(Line, Font, FontSize, X, Y); // flush the final line
end;
Perulangan mengukur baris percobaan daripada mengukur setiap kata dan menjumlahkan, karena lebar sebuah baris bukanlah jumlah lebar kata-katanya. Spasi di antara kata-kata berkontribusi, dan rentetan terukur menangkapnya secara langsung. Aturan serakah, paskan sebanyak mungkin kata yang diizinkan kolom dan putus pada kata terakhir yang pas, adalah aturan sama yang mengisi celah antara AddText mentah dan paragraf sesungguhnya. Panggilan menggambar tidak pernah menjadi bagian yang sulit. Pengukuran yang harus mendahuluinya itulah yang sulit, dan persis itulah yang disediakan oleh pembantu (helper) tersebut
Di mana ini cocok
Pengukuran adalah lapisan di antara menghasilkan konten dan merendernya, jadi ia berpasangan secara alami dengan sisa alur kerja dokumen dari-awal (from-scratch). Jika Anda merakit halaman dan menempatkan teks di tempat pertama, dasar kerjanya ada di menciptakan dokumen PDF dari awal dengan komponen PDFium di Delphi, di mana AddText dan pengaturan halaman dicakup secara penuh. Bila font yang Anda ukur sama pentingnya dengan stringnya, karena metrik bergantung pada rupa huruf, menganalisis properti font PDF dengan komponen PDFium di Delphi menunjukkan bagaimana pustaka melaporkan informasi font yang menggerakkan kotak pembatas itu. Keduanya dibangun pada pengikatan yang sama, Komponen PDFium untuk Delphi dan Lazarus, tempat asisten pengukur dikirimkan bersisian dengan API dokumen, halaman, dan teks yang dijelaskan di seluruh blog ini