ÐенеÑиÑанеÑо на оÑÑÐµÑ Ñе Ñвежда до поÑÑавÑнеÑо на ÑÑи неÑа вÑÑÑ Ñ ÑÑÑаниÑаÑа и ÑеднаквÑванеÑо на ÑÑÑ Ð½Ð¾Ñо меÑÑоположение: ÑекÑÑ Ð½Ð° извеÑÑни кооÑдинаÑи, ÑÑиÑÑове, коиÑо Ñе визÑализиÑа по еднакÑв наÑин на ÑÑÑвÑÑа и на ваÑÐ¸Ñ ÐºÐ¾Ð¼Ð¿ÑÑÑÑ, и изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ ÑазмеÑ. ÐÑиÑко оÑÑанало, коеÑо пÑави една библиоÑека за оÑÑеÑи, е оÑганизиÑано около Ñези ÑÑи елеменÑа. HotPDF, библиоÑекаÑа на losLab за генеÑиÑане на PDF Ñайлове в Delphi и C++Builder, ви пÑедоÑÑÐ°Ð²Ñ Ð²ÑÑка Ð¾Ñ Ñези вÑзможноÑÑи ÑÑез диÑекÑно извикване на обекÑа на ÑÑÑаниÑаÑа. ÐдинÑÑвеноÑо Ñеално заÑÑÑднение е базоваÑа кооÑдинаÑна ÑиÑÑема, коÑÑо ÑабоÑи в поÑока, обÑаÑна на познаÑоÑо VCL плаÑно (VCL canvas). УÑоÑнеÑе Ñази оÑиенÑаÑÐ¸Ñ Ð² ÑамоÑо наÑало и оÑÑаналаÑа ÑаÑÑ Ð¾Ñ ÑабоÑаÑа по оÑоÑмлениеÑо Ñе ÑпÑе да ви заÑÑÑднÑва.
ÐозиÑиониÑане на ÑекÑÑ Ð¸ наÑало на кооÑдинаÑнаÑа ÑиÑÑема в Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл
ÐÑÑвиÑÑ Ð¾ÑÑÐµÑ Ð½Ð° поÑÑи вÑеки ÑазÑабоÑÑик Ñе оказва обÑÑÐ½Ð°Ñ Ð½Ð°Ð¾Ð¿Ð°ÐºÐ¸. ÐаглавиеÑо Ñе Ñазполага близо до Ð´Ð¾Ð»Ð½Ð¸Ñ ÐºÑай на ÑÑÑаниÑаÑа, а вÑеки ÑÐ»ÐµÐ´Ð²Ð°Ñ Ñед Ñе изкаÑва нагоÑе. СиÑÑемаÑа ÑабоÑи ноÑмално: поÑÑебиÑелÑкоÑо пÑоÑÑÑанÑÑво на PDF (PDF user space), деÑиниÑано в ÑÑандаÑÑа ISO 32000-1 §8.3, поÑÑÐ°Ð²Ñ Ð½Ð°ÑалоÑо на кооÑдинаÑнаÑа ÑиÑÑема в Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл, каÑо Y ÑаÑÑе нагоÑе. Това е огледален обÑаз на GDI плаÑноÑо, кÑдеÑо Y ÑаÑÑе Ð½Ð°Ð´Ð¾Ð»Ñ Ð¾Ñ Ð³Ð¾ÑÐ½Ð¸Ñ Ð»Ñв ÑгÑл. ÐÐµÑ Ð¼Ð¸Ð½ÑÑи, оÑделени за вÑзпÑиемане на Ñази Ñазлика, Ñе ви ÑпеÑÑÑÑ Ð¿ÑенапиÑване на оÑоÑмлениеÑо на по-кÑÑен еÑап, когаÑо ÑиÑлаÑа ÑпÑÐ°Ñ Ð´Ð° ÑÑвпадаÑ.
ÐÑновноÑо извикване за обекÑа на ÑÑÑаниÑаÑа е TextOut(X, Y, Angle, Text). X и Y опÑеделÑÑ Ð¼ÐµÑÑоположениеÑо на ÑекÑÑа в пÑнкÑове Ð¾Ñ Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл, а Angle го завÑÑÑа в гÑадÑÑи. Ðо Ñози наÑин Ñе изÑеÑÑава диагонален пеÑÐ°Ñ âDRAFTâ?или âCOPYâ?без нÑжда Ð¾Ñ ÑпеÑиална поддÑÑжка. ТÑикÑÑ, койÑо позволÑва на наÑÑÑпанаÑа VCL инÑÑиÑÐ¸Ñ Ð´Ð° пÑодÑлжи да ÑабоÑи, е да изÑазиÑе Y каÑо виÑоÑинаÑа на ÑÑÑаниÑаÑа минÑÑ ÑазÑÑоÑниеÑо, коеÑо иÑкаÑе да имаÑе Ð¾Ñ Ð³Ð¾ÑÐ½Ð¸Ñ ÐºÑай:
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'invoice-0001.pdf';
Pdf.BeginDoc;
Pdf.CurrentPage.SetFont('Arial', [fsBold], 16);
Pdf.CurrentPage.TextOut(50, 792 - 50, 0, 'INVOICE'); // 50pt from top of Letter
Pdf.CurrentPage.SetFont('Arial', [], 10);
Pdf.CurrentPage.TextOut(50, 792 - 70, 0, 'Date: 2026-06-11');
Pdf.CurrentPage.TextOut(300, 400, 45, 'COPY'); // rotated stamp
Pdf.AddPage; // CurrentPage now points here
Pdf.CurrentPage.SetFont('Arial', [], 10); // font state does not carry over
Pdf.CurrentPage.TextOut(50, 742, 0, 'Page 2 detail rows');
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
ÐвеÑе пÑомени в ÑÑÑÑоÑниеÑо в Ñози пÑÐ¸Ð¼ÐµÑ Ñа оÑговоÑни за повеÑеÑо гÑеÑки, коиÑо Ñе поÑвÑÐ²Ð°Ñ ÐµÐ´Ð²Ð° на вÑоÑаÑа ÑÑÑаниÑа. AddPage наÑоÑва CurrentPage кÑм ÑокÑ-Ñо ÑÑздаденаÑа ÑÑÑаниÑа, Ñака Ñе ÑеÑеÑенÑÐ¸Ñ ÐºÑм ÑÑÑаниÑа, коÑÑо ÑÑе кеÑиÑали по-Ñано, веÑе нÑма да изÑеÑÑава Ñам, кÑдеÑо оÑакваÑе. ÐзбоÑÑÑ Ð½Ð° ÑÑиÑÑ ÑÑÑо Ñе пÑави за вÑÑка ÑÑÑаниÑа пооÑделно, а не за ÑÐµÐ»Ð¸Ñ Ð´Ð¾ÐºÑменÑ. Ðко пÑопÑÑнеÑе извикванеÑо на SetFont Ñлед AddPage, пÑÑвоÑо извикване на TextOut на новаÑа ÑÑÑаниÑа Ñе Ñе вÑÑне кÑм паÑамеÑÑиÑе по подÑазбиÑане, а не кÑм полÑÑеÑÐ½Ð¸Ñ ÑÑиÑÑ Ð·Ð° заглавиÑ, койÑо ÑÑе задали пÑеди ÑÑи ÑÑÑаниÑи. СигÑÑниÑÑ Ð½Ð°Ð²Ð¸Ðº е да ÑÑеÑиÑаÑе âÑÑздаванÐ?на нова ÑÑÑаниÑаâ?и âвÑзÑÑановÑванÐ?на наÑÑÑойкиÑе на ÑекÑÑаâ?каÑо една неделима ÑÑÑпка в ÑикÑла за оÑÑеÑи.
ШÑиÑÑове, коиÑо ÑÑÑеÑÑвÑÐ²Ð°Ñ Ð½Ð° ÑÑÑвÑÑа, а не Ñамо на ваÑÐ¸Ñ ÐºÐ¾Ð¼Ð¿ÑÑÑÑ
ÐовеÑеÑо пÑоблеми Ñ ÑÑиÑÑовеÑе вÑÑÑноÑÑ Ñа пÑоблеми Ñ Ð²Ð½ÐµÐ´ÑÑванеÑо (deployment). ÐаÑиÑÑ ÐºÐ¾Ð¼Ð¿ÑÑÑÑ Ð·Ð° ÑазÑабоÑка има инÑÑалиÑан коÑпоÑаÑÐ¸Ð²Ð½Ð¸Ñ ÑÑиÑÑ, Ñака Ñе оÑÑеÑÑÑ Ð¸Ð·Ð³Ð»ÐµÐ¶Ð´Ð° пÑавилно на екÑана ви. ÐÑоизводÑÑвениÑÑ ÑÑÑвÑÑ Ð¾Ð±Ð°Ñе изпÑлнÑва задаÑаÑа под ÑеÑвизен акаÑнÑ, на койÑо Ñози ÑÑиÑÑ Ð½Ð¸ÐºÐ¾Ð³Ð° не е инÑÑалиÑан. ЧеÑеÑÑÑ ÑÐ¸Ñ Ð¾Ð¼Ñлком го замеÑÑва Ñ Ð½ÐµÑо дÑÑго, коеÑо ÑÑпее да намеÑи, а пÑÑвоÑо извеÑÑие за пÑоблема пÑиÑÑига Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñ, койÑо пиÑа заÑо ÑиÑменаÑа бланка Ñе е пÑоменила. РеÑениеÑо е да ÑпÑеÑе да ÑазÑиÑаÑе на диÑекÑоÑиÑÑа Ñ ÑÑиÑÑове на опеÑаÑионнаÑа ÑиÑÑема и да заÑедиÑе ÑÑиÑÑа Ð¾Ñ Ñайл, койÑо инÑÑалаÑоÑÑÑ Ð²Ð¸ поÑÑÐ°Ð²Ñ Ð½Ð° диÑка. ÐеÑодÑÑ Ð·Ð° ÑегиÑÑÑаÑÐ¸Ñ Ð½Ð° Unicode в HotPDF пÑиема пÑÑ Ð´Ð¾ Ñайл и пÑави ÑоÑно Ñова:
Pdf.RegisterUnicodeTTF('C:\ProgramData\MyApp\Fonts\NotoSans.ttf');
Pdf.CurrentPage.SetFont('NotoSans', [], 12);
Pdf.CurrentPage.TextOut(50, 700, 0, WideString('Åódź - Ãnïcode test â?));
TextOut пÑиема диÑекÑно WideString, коеÑо е по-важно, оÑколкоÑо изглежда на пÑÑв поглед. Ðме на ÐºÐ»Ð¸ÐµÐ½Ñ Ñ Ð°ÐºÑенÑ, немÑка ÑлиÑа, полÑки гÑад: Ñова не Ñа изклÑÑениÑ, а ÑÑандаÑÑно ÑÑдÑÑжание на клиенÑÑка ÑаблиÑа. Те пÑÐµÐ¼Ð¸Ð½Ð°Ð²Ð°Ñ Ð¿Ñез ÑÑÑоÑо извикване, коеÑо използваÑе за ÑекÑÑовиÑе еÑикеÑи (ASCII labels), ÑÑига ÑегиÑÑÑиÑаниÑÑ ÑÑиÑÑ Ð´ÐµÐ¹ÑÑвиÑелно да ÑÑдÑÑжа ÑÑоÑвеÑниÑе Ñимволи (glyphs). Ðдно огÑаниÑение за веÑÑииÑе ÑÑпÑÑÑÑва вгÑадениÑе ÑÑиÑÑове: докÑменÑÑÑ ÑÑÑбва да бÑде веÑÑÐ¸Ñ PDF 1.5 или по-нова. Ðко дÑÑго изиÑкване ви пÑинÑждава да използваÑе по-ÑÑаÑа веÑÑиÑ, Ñази ÑÑнкÑÐ¸Ñ Ð¿ÑоÑÑо нÑма да ÑабоÑи. ÐиÑменоÑÑиÑе, коиÑо Ñе ÑеÑÐ°Ñ Ð¾Ñ Ð´ÑÑно на лÑво (каÑо аÑабÑки и ивÑиÑ), Ñе нÑждаÑÑ Ð¾Ñ Ñеално оÑоÑмÑне (shaping), а не пÑоÑÑо Ð¾Ñ ÑÑÑÑене на Ñимволи, и Ð¸Ð¼Ð°Ñ Ñвой ÑобÑÑвен пÑоÑÐµÑ Ð½Ð° обÑабоÑка. ÐижÑе ÑÑаÑиÑÑа за оÑоÑмÑне на Ñложен ÑекÑÑ Ð² HotPDF.
ÐогаÑо никой инÑÑалиÑан ÑÑиÑÑ Ð½Ðµ може да изÑази Ñова, коеÑо ви ÑÑÑбва (напÑÐ¸Ð¼ÐµÑ MICR Ñимволи вÑÑÑ
Ñ Ð±Ð°Ð½ÐºÐ¾Ð²Ð¸ Ñекове или паÑенÑован Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ Ñимволи), ÑÑиÑÑовеÑе Ð¾Ñ Type 3 попÑÐ»Ð²Ð°Ñ Ð¿ÑазнинаÑа. Ðие деÑиниÑаÑе вÑеки Ñимвол каÑо малÑк поÑок Ð¾Ñ ÑÑдÑÑжание (content stream) ÑÑез RegisterType3Font и AddType3Glyph. Това е ÑпеÑиализиÑана ÑаÑÑ Ð¾Ñ API и ÑÑдко Ñе Ñе налага да Ñ Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñе, но е много по-ÑиÑÑ Ð¿Ð¾Ð´Ñ
од Ð¾Ñ ÑазпÑÑÑкванеÑо на ÑÑоÑиÑи малки ÑаÑÑеÑни изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° Ñимволи из ÑÑÑаниÑаÑа.
ÐзобÑажениÑ: ÑÑедниÑе аÑгÑменÑи Ñа ÑиÑина и виÑоÑина, а не ÑгÑл
ÐбÑабоÑкаÑа на изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñе ÑÐ°Ð·Ð´ÐµÐ»Ñ Ð½Ð° две ÑÑÑпки и поддÑÑжанеÑо им Ñазделени е оÑновнаÑа Ñел. ÐеÑодÑÑ AddImage пÑиема TBitmap или TJPEGImage, вгÑажда го веднÑж и вÑÑÑа Ð½ÐµÐ³Ð¾Ð²Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑ. ÐзобÑажениÑÑа вÑв ÑоÑÐ¼Ð°Ñ PNG ÑÑÑбва да бÑÐ´Ð°Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñани до bitmap, пÑеди да доÑÑÐ¸Ð³Ð½Ð°Ñ Ð´Ð¾ него. ÐеÑодÑÑ ShowImage изÑеÑÑава Ñози Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð°Ð²ÑÑкÑде и Ñолкова ÑеÑÑо, колкоÑо иÑкаÑе. ÐодÑедбаÑа на аÑгÑменÑиÑе в ShowImage е едно Ð¾Ñ Ð½ÐµÑаÑа, на коиÑо Ñи ÑÑÑÑва да обÑÑнеÑе внимание:
var
Png: TPngImage;
Logo: TBitmap;
LogoIdx: Integer;
begin
Png := TPngImage.Create;
Logo := TBitmap.Create;
try
Png.LoadFromFile('brand-logo.png');
Logo.Assign(Png); // decode PNG to a bitmap
LogoIdx := Pdf.AddImage(Logo, icFlate); // lossless for flat-color art
finally
Logo.Free;
Png.Free;
end;
// (Index, X, Y, Width, Height, Angle): not (X1, Y1, X2, Y2)
Pdf.CurrentPage.ShowImage(LogoIdx, 50, 700, 120, 40, 0);
end;
ÐвеÑе ÑиÑла Ñлед позиÑиÑÑа Ñа ÑиÑина и виÑоÑина. Те не Ñа кооÑдинаÑиÑе на ÑÑеÑÑÐ¿Ð¾Ð»Ð¾Ð¶Ð½Ð¸Ñ ÑгÑл, а поÑледниÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ðµ ÑгÑл на завÑÑÑане в гÑадÑÑи. Ðко пÑоÑеÑеÑе ÑигнаÑÑÑаÑа на меÑода каÑо кÑÑÐ¸Ñ Ñ ÐºÐ¾Ð¾ÑдинаÑи X1/Y1/X2/Y2 box и логоÑо Ñ ÑазмеÑи 120 на 40, поÑÑавено на (50, 700), Ñе Ñе ÑазпÑне оÑÑам до (120, 40), ÑазпÑоÑÑиÑайки Ñе вÑÑÑ
Ñ Ð¿Ð¾-голÑмаÑа ÑаÑÑ Ð¾Ñ ÑÑÑаниÑаÑа. РезÑлÑаÑÑÑ Ð¿Ñави гÑеÑкаÑа оÑевидна, докаÑо изÑ
одниÑÑ ÐºÐ¾Ð´ изглежда ÑÑвÑем ÑазÑмен, коеÑо е пÑиÑинаÑа за загÑба на вÑеме. СвойÑÑвоÑо KeepImageAspectRatio е зададено на True по подÑазбиÑане, Ñака Ñе Ñамка Ñ Ð³ÑеÑни пÑопоÑÑии пÑоÑÑо Ñе добави пÑазни полеÑа около изобÑажениеÑо, вмеÑÑо да го деÑоÑмиÑа. ÐÑоменеÑе го на False Ñамо когаÑо наиÑÑина иÑкаÑе да ÑазÑеглиÑе изобÑажениеÑо.
РазделÑнеÑо Ð¼ÐµÐ¶Ð´Ñ ÑегиÑÑÑиÑане и позиÑиониÑане ноÑи ползи пÑи големи обеми Ð¾Ñ ÑабоÑа. ТÑй каÑо AddImage вгÑажда пикÑелиÑе веднÑж и вÑÑко извикване на ShowImage Ñ Ñози Ð¸Ð½Ð´ÐµÐºÑ Ð¿ÑепÑаÑа кÑм ÑÑÑÐ¸Ñ Ð²Ð³Ñаден обекÑ, мÑÑÑоÑо, кÑдеÑо извикваÑе AddImage, опÑÐµÐ´ÐµÐ»Ñ ÑазмеÑа на Ñайла. ÐзвикайÑе го вÑÑÑе в ÑикÑла за ÑÑÑаниÑи на оÑÑÐµÑ Ð¾Ñ 500 ÑÑÑаниÑи и едно и ÑÑÑо лого Ñе бÑде вгÑадено 500 пÑÑи. ÐзвикайÑе го веднÑж пÑеди ÑикÑла, запазеÑе индекÑа и логоÑо Ñе бÑде ÑÑÑ
Ñанено Ñамо веднÑж. ÐалÑк ÑеÑник (dictionary), индекÑиÑан по пÑÑÑ Ð½Ð° ÑеÑÑÑÑа, е доÑÑаÑÑÑен, за да гаÑанÑиÑа, Ñе вÑÑко оÑделно изобÑажение Ñе ÑегиÑÑÑиÑа ÑоÑно веднÑж.
ÐзбоÑÑÑ Ð½Ð° кодек е дÑÑгиÑÑ ÑакÑоÑ, влиÑÐµÑ Ð½Ð° ÑазмеÑа. ФоÑогÑаÑÑкоÑо ÑÑдÑÑжание, ÑканиÑаниÑе пÑикаÑени Ñайлове и подобни маÑеÑиали Ñа подÑ
одÑÑи за JPEG: пÑедайÑе icJpeg на AddImage и намалеÑе JpegQuality до около 85, ÑÑй каÑо ÑвойÑÑвоÑо запоÑва Ð¾Ñ 100 по подÑазбиÑане, а ÑазликаÑа пÑи 85 е незабележима на оÑпеÑаÑана ÑÑÑаниÑа. ÐзобÑажениÑÑа Ñ Ð¿Ð»ÑÑни ÑвеÑове (каÑо лога, гÑаÑики и ÑеÑÑежи) Ñа подÑ
одÑÑи за icFlate, кÑдеÑо компÑеÑиÑанеÑо без загÑби (lossless compression) веÑе е компакÑно, докаÑо JPEG би добавил ÑÑм (ringing) около оÑÑÑиÑе ÑÑбове. ÐÑоÑÐµÑ Ð½Ð° обÑабоÑка, койÑо Ð´Ð¾Ð±Ð°Ð²Ñ Ñнимка Ñ Ð¼Ð°ÐºÑимално каÑеÑÑво на вÑÑка ÑÑÑаниÑа, може да ÑвелиÑи ÑазмеÑа на ÑайловеÑе до гигабайÑи. СÑÑоÑо ÑÑдÑÑжание пÑи каÑеÑÑво JPEG 85 заема около една деÑеÑа Ð¾Ñ Ñози ÑазмеÑ, без ÑиÑаÑелÑÑ Ð´Ð° забележи Ñазлика.
Ðинии, пÑавоÑгÑлниÑи и ÑÑÐ¸Ñ Ð¾Ð²Ð°Ð½Ðµ Ñ Ð²ÐµÐºÑоÑни елеменÑи
ХоÑизонÑалнаÑа Ð»Ð¸Ð½Ð¸Ñ Ð¿Ð¾Ð´ заглавиеÑо на ÑаблиÑа и ÑиваÑа Ñамка зад кÑайнаÑа ÑÑма не ÑÑÑбва да бÑÐ´Ð°Ñ ÑаÑÑеÑни изобÑажениÑ. ÐаÑеÑÑайÑе ги каÑо векÑоÑни елеменÑи и Ñе Ñе оÑÑÐ°Ð½Ð°Ñ ÑÑни пÑи вÑÑкакÑв маÑаб, Ñе Ñе оÑпеÑаÑÐ²Ð°Ñ Ð¾ÑÑеÑливо и нÑма да добавÑÑ Ð¿Ð¾ÑÑи ниÑо кÑм ÑазмеÑа на Ñайла. HotPDF Ñледва модела на ÑÑандаÑÑниÑе PDF поÑоÑи Ð¾Ñ ÑÑдÑÑжание (content streams): изгÑажда Ñе пÑÑ (path), Ñлед коеÑо Ñе извиква опеÑаÑÐ¾Ñ Ð·Ð° оÑвеÑÑванеÑо мÑ.
// Horizontal rule under the table header
Pdf.CurrentPage.SetLineWidth(0.75);
Pdf.CurrentPage.MoveTo(50, 660);
Pdf.CurrentPage.LineTo(545, 660);
Pdf.CurrentPage.Stroke;
// Shaded totals box: X, Y, width, height
Pdf.CurrentPage.SetRGBFillColor(RGB(235, 235, 235));
Pdf.CurrentPage.Rectangle(395, 120, 150, 40);
Pdf.CurrentPage.Fill;
РедÑÑ Ð½Ð° опеÑаÑииÑе е задÑлжиÑелен: задайÑе ÑÑÑÑоÑниеÑо за оÑвеÑÑване, изгÑадеÑе пÑÑÑ Ð¸ Ñлед Ñова извикайÑе Stroke или Fill. ÐÑÑ, койÑо ÑÑе изгÑадили, но никога не ÑÑе оÑвеÑили, не Ð´Ð¾Ð±Ð°Ð²Ñ Ð½Ð¸Ñо кÑм ÑÑÑаниÑаÑа â?Ñова е оÑговоÑÑÑ Ð² повеÑеÑо ÑлÑÑаи, когаÑо нÑÐºÐ¾Ñ Ð»Ð¸Ð½Ð¸Ñ Ð½Ðµ Ñе показва. SetRGBFillColor пÑиема една ÑÑойноÑÑ TColor, Ñака Ñе познаÑиÑе VCL конÑÑанÑи каÑо clNavy и clBlack Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° Ñе Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ Ð´Ð¸ÑекÑно, а Rectangle използва ÑÑÑиÑе аÑгÑменÑи за ÑиÑина и виÑоÑина, какÑо пÑи позиÑиониÑанеÑо на изобÑажениÑ, а не два ÑÑеÑÑположни ÑгÑла. Ðдно пÑедÑпÑеждение за ÑÑнкиÑе линии: вÑиÑко под около половин пÑÐ½ÐºÑ Ð¼Ð¾Ð¶Ðµ да изглежда добÑе на мониÑоÑ, но да изÑезне пÑи пеÑÐ°Ñ Ð½Ð° оÑÐ¸Ñ Ð¿ÑинÑÐµÑ Ñ 600 dpi. ÐÑо заÑо 0.75 пÑнкÑа е ÑазÑмен минимÑм за вÑÑка линиÑ, коÑÑо ÑÑÑбва да Ñе вижда пÑи пеÑаÑ.
СÑÑаниÑиÑане ÑпÑÑмо Ñеални данни, а не пÑимеÑни данни
Ðдна подÑобноÑÑ, коÑÑо ÑÑÑбва да ÑÑоÑниÑе пÑеди оÑоÑмÑнеÑо на докÑменÑа: ÑиÑловиÑе колони ÑÑÑбва да бÑÐ´Ð°Ñ Ð¿Ð¾Ð´Ñавнени оÑдÑÑно. ÐаÑинÑÑ Ð´Ð° напÑавиÑе Ñова е да измеÑиÑе ÑиÑинаÑа на визÑализиÑанаÑа ÑÑойноÑÑ Ð¸ да Ñ Ð¿Ð¾Ð·Ð¸ÑиониÑаÑе обÑаÑно Ð¾Ñ Ð³ÑаниÑаÑа на колонаÑа, а не да запÑлваÑе низа Ñ Ð¸Ð½ÑеÑвали оÑпÑед. ÐапÑлванеÑо Ñ Ð¸Ð½ÑеÑвали ÑабоÑи Ñамо пÑи ÑÑиÑÑове Ñ ÑикÑиÑана ÑиÑина (monospaced fonts), а никой не оÑоÑÐ¼Ñ ÑинанÑов оÑÑÐµÑ Ñ ÑакÑв ÑÑиÑÑ. ÐÑекаÑайÑе ÑÑойноÑÑиÑе пÑÑво пÑез ÑпеÑиÑиÑниÑе за локала ÑÑнкÑии на Delphi (каÑо напÑÐ¸Ð¼ÐµÑ FormatFloat), Ñака Ñе ÑазделиÑелÑÑ Ð½Ð° Ñ
илÑдиÑе, ÑиÑÑо ÑиÑина измеÑваÑе, да бÑде ÑÑÑиÑÑ, койÑо дейÑÑвиÑелно Ñе Ñе покаже ÑпоÑед локала на клиенÑа.
ÐпаÑноÑÑÑа пÑи ÑÑÑаниÑиÑанеÑо е, Ñе го пиÑеÑе за демо Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ Ð´Ð°Ð½Ð½Ð¸, кÑдеÑо деÑÐµÑ ÐºÑаÑки Ñеда Ñе ÑÑбиÑÐ°Ñ Ð½Ð° една ÑÑÑаниÑа и ÑикÑлÑÑ Ð½Ð¸ÐºÐ¾Ð³Ð° не ÑÑÑбва да Ñе пÑекÑÑва. Ð Ñеална ÑÑеда обаÑе можеÑе да полÑÑиÑе клиенÑ, ÑиеÑо име на ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ Ðµ Ñ Ð´Ñлжина 140 Ñимвола, и оÑÑÐµÑ Ñ 4000 позиÑии, пÑи коеÑо ÑикÑлÑÑ ÑÑÑбва да Ñе пÑекÑÑва пÑавилно вÑеки пÑÑ. ÐоделÑÑ, койÑо ÑабоÑи ÑÑпеÑно, използва един-единÑÑвен Y кÑÑÑоÑ, койÑо Ñе движи надолÑ, докаÑо изваждаÑе виÑоÑинаÑа на вÑеки Ñед, и пÑовеÑка, коÑÑо ÑÑаÑÑиÑа нова ÑÑÑаниÑа в моменÑа, в койÑо кÑÑÑоÑÑÑ Ð¿Ñемине долноÑо поле. ÐвижениеÑо Ð½Ð°Ð´Ð¾Ð»Ñ ÑÑк ознаÑава намалÑване на ÑÑойноÑÑÑа на Y, коеÑо е единÑÑвеноÑо мÑÑÑо, кÑдеÑо наÑалоÑо на кооÑдинаÑнаÑа ÑиÑÑема в Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл оÑÑава неинÑÑиÑивно. ÐÑÑжÑе ÑÐµÐ»Ð¸Ñ Ñози пÑоÑÐµÑ Ð² една подпÑогÑама, коÑÑо ÑÑÑо Ñака пÑеиздава SetFont и изÑеÑÑава оÑново заглавнаÑа ÑаÑÑ (running header) на новаÑа ÑÑÑаниÑа, за да пÑедоÑвÑаÑиÑе гÑеÑки Ñ Ð¸Ð·ÑÑзване на ÑÑÑаниÑи. ÐогаÑо ÑÑÑиÑе оÑÑеÑи ÑÑÑбва да оÑговаÑÑÑ Ð¸ на пÑавилаÑа за аÑÑ
ивиÑане или доÑÑÑпноÑÑ, избоÑиÑе, коиÑо пÑавиÑе ÑÑк (кои ÑÑиÑÑове да вгÑадиÑе, дали ÑезÑлÑаÑÑÑ Ðµ Ñ Ñагове, кои ÑвеÑови пÑоÑÑÑанÑÑва да използваÑе), Ñа именно Ñези, коиÑо Ñе конÑÑолиÑÐ°Ñ Ð¾Ñ ÑÑоÑвеÑниÑе ÑÑандаÑÑи; ÑÑководÑÑвоÑо за PDF/A, PDF/X и PDF/UA в HotPDF Ñи ÑÑÑÑва да бÑде пÑоÑеÑено пÑеди оÑоÑмÑнеÑо на ÑÐ¸Ð½Ð°Ð»Ð½Ð¸Ñ Ñаблон.
ÐÑÑко пÑедÑÑавено ÑÑк извикване â?позиÑиониÑанеÑо на ÑекÑÑ, ÑегиÑÑÑаÑиÑÑа на ÑÑиÑÑове, вгÑажданеÑо на изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ изÑеÑÑаванеÑо на пÑÑиÑа â?Ñе доÑÑÐ°Ð²Ñ Ð² компоненÑа HotPDF за Delphi и C++Builder, ÑийÑо ÑпÑавоÑник опиÑва пÑÐ»Ð½Ð¸Ñ Ð¿Ñиложен пÑогÑамен инÑеÑÑÐµÐ¹Ñ (API) заедно Ñ ÑÑнкÑииÑе за ÑоÑмÑлÑÑи, ÑиÑÑиÑане и подпиÑване.