PDFium е извеÑÑен най-веÑе каÑо двигаÑел за Ñазглеждане на докÑменÑи â?ÑендеÑиÑаÑоÑо ÑдÑо зад PDF Ñаздела в Chrome. ÐаÑова пÑÑвоÑо неÑо, коеÑо ÑÑÑбва да ÑÑоÑним, е Ñе PDFium VCL може ÑÑÑо Ñака да изгÑажда ÑÑвÑем нови докÑменÑи Ð¾Ñ Ð½ÑлаÑа. СÑÑанаÑа на пиÑане и ÑедакÑиÑане обвива API за обекÑи на ÑÑÑаниÑи на PDFium: ÑÑздаваÑе пÑазен докÑменÑ, добавÑÑе ÑÑÑаниÑи Ñ ÑоÑни ÑазмеÑи и поÑÑавÑÑе ÑекÑÑ, векÑоÑни пÑÑиÑа и изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° вÑÑка ÑÑÑаниÑа по избÑани Ð¾Ñ Ð²Ð°Ñ ÐºÐ¾Ð¾ÑдинаÑи. ÐÑма език за опиÑание на ÑÑÑаниÑи, койÑо да ÑÑиÑе, ниÑо пеÑаÑÐ°Ñ Ð´ÑÐ°Ð¹Ð²ÐµÑ Ð¿Ð¾ веÑигаÑа. Ðие пÑоÑÑо извикваÑе меÑоди, библиоÑекаÑа ÑгловÑва PDF обекÑиÑе, а меÑодÑÑ SaveAs ÑеÑиализиÑа ÑезÑлÑаÑа.
Това, коеÑо нÑма да полÑÑиÑе обаÑе, е двигаÑел за авÑомаÑиÑно оÑоÑмление (layout engine). Това е важно да Ñе каже пÑедваÑиÑелно, ÑÑй каÑо опÑÐµÐ´ÐµÐ»Ñ Ð½Ð°Ñина на ÑабоÑа вÑв вÑеки пÑÐ¸Ð¼ÐµÑ Ð¿Ð¾-долÑ. PDFium VCL поÑÑÐ°Ð²Ñ ÑÑдÑÑжаниеÑо ÑоÑно Ñам, кÑдеÑо Ð¼Ñ ÑкажеÑе â?в абÑолÑÑни кооÑдинаÑи и никÑде дÑÑгаде. Той нÑма да пÑенеÑе авÑомаÑиÑно Ð°Ð±Ð·Ð°Ñ Ð½Ð° нов Ñед, нÑма да пÑÐµÑ Ð²ÑÑли ÑекÑÑ Ð¿Ñи пÑекÑÑване на ÑÑÑаниÑаÑа и нÑма да изÑиÑли ÑаблиÑа вÑз оÑнова на Ñедове и колони. Тези задаÑи Ñа ваÑа оÑговоÑноÑÑ. Ðко оÑакваÑе неÑо, коеÑо пÑенаÑежда ÑекÑÑа по наÑина, по койÑо го пÑави ÑекÑÑообÑабоÑваÑа пÑогÑама, е важно да коÑигиÑаÑе оÑакваниÑÑа Ñи: Ñова е пÑеÑизен API за ниÑко ниво на позиÑиониÑане, по-близÑк до изÑеÑÑаване вÑÑÑ Ñ Ð¿Ð»Ð°Ñно (canvas), оÑколкоÑо до ÑекÑÑÐ¾Ð½Ð°Ð±Ð¾Ñ Ð½Ð° докÑменÑ. Ðа генеÑиÑане на ÑакÑÑÑи, ÑеÑÑиÑикаÑи, еÑикеÑи и ÑÑÑаниÑи Ñ Ð¾ÑÑеÑи, кÑдеÑо пÑедваÑиÑелно знаеÑе ÑоÑноÑо меÑÑоположение на вÑеки елеменÑ, Ñази пÑеÑизноÑÑ Ðµ ÑоÑно Ñова, коеÑо ÑÑÑÑиÑе.
ÐинимÑмÑÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ за ÑÑздаване на Ñайл
Само ÑÑи Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ ÑÑоÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑÐ°Ð·Ð½Ð¸Ñ Ð¾Ð±ÐµÐºÑ TPdf и запиÑÐ°Ð½Ð¸Ñ PDF: ÑÑздаване на докÑменÑа, добавÑне на ÑÑÑаниÑа и запиÑване. ÐÑиÑко оÑÑанало е ÑÑдÑÑжание, коеÑо добавÑÑе на Ñлоеве Ð¿Ð¾Ð¼ÐµÐ¶Ð´Ñ Ð¸Ð¼.
uses
Vcl.Graphics, // for clBlack and TColor
PDFium; // TPdf lives here
procedure CreateBlankPdf(const FileName: string);
var
Pdf: TPdf;
begin
Pdf := TPdf.Create(nil);
try
Pdf.CreateDocument; // empty in-memory document
Pdf.AddPage(0, 595, 842); // A4 portrait, in points
Pdf.AddText('First page', 'Arial', 18, 50, 780);
Pdf.SaveAs(FileName); // serialize to disk
finally
Pdf.Active := False;
Pdf.Free;
end;
end;
Ðдин деÑайл обÑÑква Ñ
оÑаÑа, коиÑо Ñа Ñели по-ÑÑаÑи пÑимеÑи: не ÑÑÑбва да пÑиÑвоÑваÑе Pdf.Active := True Ñлед CreateDocument. СвойÑÑвоÑо Active показва дали ÑÑÑеÑÑвÑва деÑкÑипÑÐ¾Ñ Ð½Ð° докÑÐ¼ÐµÐ½Ñ (document handle), а CreateDocument веÑе е ÑÑздал ÑакÑв, Ñака Ñе ÑвойÑÑвоÑо е True в моменÑа, в койÑо Ñова извикване пÑиклÑÑи. ÐовÑоÑноÑо Ð¼Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ð½Ðµ в най-добÑÐ¸Ñ ÑлÑÑай не пÑави ниÑо, а в най-лоÑÐ¸Ñ Ð¿Ð¾Ð´Ð²ÐµÐ¶Ð´Ð° ÑледваÑÐ¸Ñ ÑазÑабоÑÑик, койÑо ÑеÑе кода. СвойÑÑвоÑо Active е полезно пÑи оÑвобождаване на ÑеÑÑÑÑиÑе: пÑиÑвоÑванеÑо на False оÑвобождава докÑменÑа пÑеди извикванеÑо на Free, коеÑо е пÑавилнаÑа поÑледоваÑелноÑÑ Ð½Ð° демонÑиÑане. ТÑеÑиÑайÑе CreateDocument и оÑваÑÑнеÑо за заÑеждане на Ñайл каÑо взаимно изклÑÑваÑи Ñе опеÑаÑии. ÐиблиоÑекаÑа оÑказва да ÑÑздаде нов докÑÐ¼ÐµÐ½Ñ Ð²ÑÑÑ
Ñ Ð¾Ð±ÐµÐºÑ TPdf, койÑо веÑе има оÑвоÑен ÑакÑв, Ñака Ñе повÑоÑнаÑа ÑпоÑÑеба изиÑква пÑÑво да заÑвоÑиÑе ÑекÑÑÐ¸Ñ Ð´Ð¾ÐºÑменÑ.
ÐооÑдинаÑиÑе запоÑÐ²Ð°Ñ Ð¾Ñ Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл
ÐÑоÑаÑа двойка аÑгÑменÑи на AddText, какÑо и пÑи вÑÑко извикване за позиÑиониÑане, пÑедÑÑавлÑва ÑоÑка в поÑÑебиÑелÑкоÑо пÑоÑÑÑанÑÑво на PDF. ÐооÑдинаÑноÑо наÑало е в Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл на ÑÑÑаниÑаÑа, X наÑаÑÑва надÑÑно, а Y наÑаÑÑва нагоÑе. Ðдна меÑна единиÑа е една ÑоÑка (point) â?1/72 Ð¾Ñ Ð¸Ð½Ñа, Ñака Ñе ÑÑÑаниÑа Ñ ÑоÑÐ¼Ð°Ñ A4 е 595 на 842 единиÑи, а US Letter е 612 на 792. Това наÑаÑÑване на Y нагоÑе е най-ÑеÑÑаÑа пÑиÑина за недоÑазÑÐ¼ÐµÐ½Ð¸Ñ Ð¾Ñ Ñипа âÑекÑÑÑÑ?ми е извÑн ÑÑÑаниÑаÑаâ? ÑÑй каÑо екÑанниÑе кооÑдинаÑи и Ñези пÑи ÑаÑÑеÑниÑе изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑавÑÑ Ð½Ð°ÑалоÑо в гоÑÐ½Ð¸Ñ ÐºÑай Ñ Y, наÑаÑÑÐ²Ð°Ñ Ð½Ð°Ð´Ð¾Ð»Ñ. Ðа ÑÑÑаниÑа Ñ Ð²Ð¸ÑоÑина 842 ÑоÑки заглавие близо до гоÑÐ½Ð¸Ñ ÑÑб Ñе намиÑа на Y 780, а не на Y 60. ÐогаÑо даден ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ñе озове на неоÑаквано мÑÑÑо, виÑоÑинаÑа на ÑÑÑаниÑаÑа минÑÑ ÑÑойноÑÑÑа на Y поÑÑи винаги е ÑиÑлоÑо, коеÑо вÑÑÑноÑÑ ÑÑе иÑкали да зададеÑе.
ÐеÑодÑÑ AddPage пÑиема позиÑÐ¸Ñ Ð·Ð° вмÑкване каÑо пÑÑви аÑгÑменÑ, запоÑваÑа Ð¾Ñ 1, каÑо 0 е Ñдобно ÑÑкÑаÑение за âнаÑалÐ?на докÑменÑаâ? ÐÑедайÑе 0 или 1 за пÑÑваÑа ÑÑÑаниÑа и ÑÑ Ñе бÑде вмÑкнаÑа най-оÑпÑед; пÑедайÑе ÑÑойноÑÑ, ÑÑоÑвеÑÑÑваÑа на бÑÐ¾Ñ ÑÑÑаниÑи, за да Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñе в кÑаÑ. ÐовоÑÑздаденаÑа ÑÑÑаниÑа ÑÑава и ÑекÑÑа ÑÑÑаниÑа â?Ñази, кÑм коÑÑо Ñа наÑоÑени ÑледваÑиÑе Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð·Ð° изÑеÑÑаване, Ñака Ñе нÑма оÑделна ÑÑÑпка за âÐ¸Ð·Ð±Ð¾Ñ Ð½Ð° Ñази ÑÑÑаниÑаâ?Ñлед добавÑнеÑо й. Ðко добавÑÑе нÑколко ÑÑÑаниÑи и по-кÑÑно Ñе наложи да ÑиÑÑваÑе вÑÑÑ
Ñ Ð½ÑÐºÐ¾Ñ Ð¾Ñ Ð¿Ð¾-ÑанниÑе, задайÑе ÑÑойноÑÑ Ð½Ð° PageNumber, за да пÑемеÑÑиÑе кÑÑÑоÑа; докаÑо попÑлваÑе ÑÑÑаниÑиÑе поÑледоваÑелно пÑи ÑÑздаванеÑо им, можеÑе да не пÑоменÑÑе Ñова ÑвойÑÑво.
ÐиÑане на ÑекÑÑ Ð¸ пÑавилоÑо за ÑÑиÑÑовеÑе, коеÑо може да ви подведе
СигнаÑÑÑаÑа на AddText ÑÑдÑÑжа вÑиÑко необÑ
одимо за един паÑаж Ð¾Ñ ÑекÑÑ: низ, име на ÑÑиÑÑ, ÑÐ°Ð·Ð¼ÐµÑ Ð² ÑоÑки, кооÑдинаÑиÑе X и Y за закоÑвÑне, поÑледвани Ð¾Ñ Ð½ÐµÐ·Ð°Ð´ÑлжиÑелен ÑвÑÑ, алÑа Ð±Ð°Ð¹Ñ Ð·Ð° пÑозÑаÑноÑÑ Ð¸ ÑгÑл на ÑоÑаÑÐ¸Ñ Ð² гÑадÑÑи.
procedure WriteHeader(Pdf: TPdf; const Title, Author: string);
begin
// Title in black, default opacity, no rotation
Pdf.AddText(Title, 'Arial', 20, 50, 780);
// A lighter byline 24 points below it
Pdf.AddText('By ' + Author, 'Arial', 11, 50, 756, clGray);
// A faint diagonal draft stamp across the page
Pdf.AddText('DRAFT', 'Arial', 64, 180, 380, clGray, $30, 45.0);
end;
ÐлÑа байÑÑÑ Ð²Ð°ÑиÑа Ð¾Ñ $00 (невидим) до $FF (непÑозÑаÑен), коеÑо пÑави надпиÑа за ÑеÑнова воден знак, а не плÑÑен блок: ÑÑойноÑÑÑа $30 оÑигÑÑÑва около девеÑнадеÑÐµÑ Ð¿ÑоÑенÑа непÑозÑаÑноÑÑ, коеÑо е доÑÑаÑÑÑно, за да Ñе вижда ÑекÑÑÑÑ Ð¾ÑдолÑ. ЪгÑлÑÑ Ð·Ð°Ð²ÑÑÑа ÑекÑÑа обÑаÑно на ÑаÑовниковаÑа ÑÑÑелка около ÑоÑкаÑа на закоÑвÑне, Ñака Ñе 45 гÑадÑÑа Ð´Ð°Ð²Ð°Ñ ÐºÐ»Ð°ÑиÑеÑÐºÐ¸Ñ Ð´Ð¸Ð°Ð³Ð¾Ð½Ð°Ð»ÐµÐ½ надпиÑ. ÐиÑо Ð¾Ñ Ñова не изиÑква ÑпеÑиална ÑÑнкÑÐ¸Ñ Ð·Ð° воден знак. ÐодниÑÑ Ð·Ð½Ð°Ðº е пÑоÑÑо голÑмо, полÑпÑозÑаÑно и завÑÑÑÑно извикване на AddText, а изÑеÑÑаванеÑо Ð¼Ñ Ð¿Ñеди или Ñлед оÑновноÑо ÑÑло опÑÐµÐ´ÐµÐ»Ñ Ð´Ð°Ð»Ð¸ Ñой Ñе ÑÑои зад или пÑед ÑÑдÑÑжаниеÑо.
ШÑиÑÑовеÑе заÑлÑÐ¶Ð°Ð²Ð°Ñ ÑпеÑиално внимание, ÑÑй каÑо гÑеÑкиÑе пÑи ÑÑÑ Ñа ÑÐ¸Ñ Ð¸. ÐогаÑо подадеÑе име на ÑÑиÑÑ, PDFium VCL изиÑква TrueType данниÑе за Ñози ÑÑиÑÑ Ð¾Ñ Ð¾Ð¿ÐµÑаÑионнаÑа ÑиÑÑема и ги вгÑажда в докÑменÑа. ÐÑо заÑо Ñайл, ÑÑздаден на ваÑÐ¸Ñ ÐºÐ¾Ð¼Ð¿ÑÑÑÑ, Ñе визÑализиÑа по абÑолÑÑно ÑÑÑÐ¸Ñ Ð½Ð°Ñин на ÑиÑÑема, на коÑÑо ÑÑиÑÑÑÑ Ð½Ð¸ÐºÐ¾Ð³Ð° не е бил инÑÑалиÑан. ÐÑоблемÑÑ Ð²Ñзниква, когаÑо имеÑо не може да бÑде ÑазпознаÑо: поÑади пеÑаÑна гÑеÑка или ако ÑÑиÑÑÑÑ Ð¿ÑоÑÑо липÑва на маÑинаÑа, на коÑÑо Ñе компилиÑа пÑоекÑÑÑ. ÐÑи Ñова не вÑзниква изклÑÑение. ÐиблиоÑекаÑа Ñе вÑÑÑа кÑм ÑÑздаване на ÑекÑÑов обекÑ, койÑо ноÑи имеÑо Ñамо каÑо еÑÐ¸ÐºÐµÑ Ð±ÐµÐ· вгÑаждане на данни, оÑÑавÑйки ÑеÑеÑа да напÑави замÑна Ñ ÑÑиÑÑ, койÑо ÑмÑÑа за най-близÑк. ТекÑÑÑÑ Ñе поÑвÑва пÑи ваÑиÑе ÑеÑÑове, изглежда ноÑмално, но пÑÐ¾Ð¼ÐµÐ½Ñ Ð¼ÐµÑÑикиÑе или глиÑовеÑе в моменÑа, в койÑо ÑайлÑÑ Ñе оÑвоÑи на ÑиÑÑема Ñ Ð´ÑÑги инÑÑалиÑани ÑÑиÑÑове. ÐзползвайÑе имена, за коиÑо ÑÑе ÑигÑÑни, Ñе пÑиÑÑÑÑÐ²Ð°Ñ Ð½Ð° генеÑиÑаÑаÑа маÑина, ÑÑеÑиÑайÑе ÑпиÑÑка Ñ ÑÑиÑÑове каÑо завиÑимоÑÑ Ð¿Ñи внедÑÑване и винаги оÑваÑÑйÑе пÑимеÑен Ñайл в ÑеÑÐµÑ Ð½Ð° ÑиÑÑа ÑиÑÑема, пÑеди да Ñе довеÑиÑе на ÑезÑлÑаÑа.
ÐекÑоÑни ÑоÑми: ÑÑздаване на пÑÑ Ð¸ поÑвÑÑждаванеÑо мÑ
ÐинииÑе, пÑавоÑгÑлниÑиÑе и запÑлнениÑе облаÑÑи Ñе ÑÑÐ·Ð´Ð°Ð²Ð°Ñ ÑÑез пÑÑ (path). ÐапоÑваÑе пÑÑ Ñ CreatePath, койÑо задава наÑалнаÑа ÑоÑка и вÑиÑки ÑÑилове наведнÑж â?Ñежим на запÑлване, ÑвеÑове на запÑлване и конÑÑÑ ÑÑÑ ÑÑоÑвеÑниÑе им алÑа байÑове, ÑиÑина на конÑÑÑа, завÑÑÑÐ²Ð°Ð½Ð¸Ñ Ð½Ð° линииÑе (line caps) и ÑÑединÑÐ²Ð°Ð½Ð¸Ñ (joins). След Ñова го ÑазÑиÑÑваÑе Ñ LineTo, BezierTo и ClosePath, и накÑÐ°Ñ AddPath запиÑва завÑÑÑÐµÐ½Ð¸Ñ Ð¿ÑÑ Ð²ÑÑÑ
Ñ ÑÑÑаниÑаÑа. Тази ÑÑÑпка на запиÑване леÑно Ñе забÑавÑ, а без Ð½ÐµÑ Ð½Ð° екÑана нÑма да Ñе изобÑази ниÑо.
procedure DrawDivider(Pdf: TPdf; X, Y, Width: Single);
begin
// A thin horizontal rule. The rectangle overload sets a box directly:
// X, Y, Width, Height, then fill mode and colors.
Pdf.CreatePath(X, Y, Width, 0.5, fmNone, clBlack, $FF,
True, clBlack, $FF, 1.0);
Pdf.AddPath;
end;
procedure DrawTriangle(Pdf: TPdf);
begin
// Point overload: start at the first vertex, line to the rest, close.
Pdf.CreatePath(200, 300, fmWinding, clBlue, $80, True, clNavy, $FF, 2.0);
Pdf.LineTo(300, 300);
Pdf.LineTo(250, 400);
Pdf.ClosePath;
Pdf.AddPath; // nothing is drawn until this runs
end;
Ðве пÑедеÑиниÑани веÑÑии на меÑода (overloads) покÑÐ¸Ð²Ð°Ñ Ð½Ð°Ð¹-ÑеÑÑиÑе ÑлÑÑаи. ÐеÑÑиÑÑа Ñ ÑеÑиÑи кооÑдинаÑи пÑиема X, Y, ÑиÑина и виÑоÑина и ви дава подÑавнен пÑавоÑгÑлник Ñ ÐµÐ´Ð½Ð¾ извикване â?Ñова, коеÑо ви е необÑ
одимо за изÑеÑÑаване на линиÑ, Ñамка на клеÑка или запÑлнен Ñонов панел. ÐеÑÑиÑÑа Ñ Ð´Ð²Ðµ кооÑдинаÑи задава Ñамо наÑална ÑоÑка, а оÑÑаналаÑа ÑаÑÑ Ð¾Ñ ÐºÐ¾Ð½ÑÑÑа оÑеÑÑаваÑе Ñами Ñ LineTo и BezierTo. РежимÑÑ Ð½Ð° запÑлване (fill mode) опÑÐµÐ´ÐµÐ»Ñ ÐºÐ°Ðº Ñе оÑвеÑÑÐ²Ð°Ñ Ð·Ð°ÑÑÑпваÑиÑе Ñе облаÑÑи: fmWinding (nonzero winding) е подÑ
одÑÑ Ð·Ð° повеÑеÑо плÑÑни ÑоÑми, fmAlternate (even-odd) ÑпÑавлÑва изÑÑзваниÑÑа и ÑамопÑеÑиÑаÑиÑе Ñе конÑÑÑи, а fmNone оÑÑÐ°Ð²Ñ Ñамо оÑеÑÑан пÑÑ Ð±ÐµÐ· запÑлване, коеÑо Ñе използва за ÑазделиÑелнаÑа Ð»Ð¸Ð½Ð¸Ñ Ð¿Ð¾-гоÑе.
ТаблиÑиÑе Ñе ÑÑÑÑоÑÑ Ð¾Ñ Ð¿ÑÑиÑа и ÑекÑÑ, Ñглобени ÑÑÑно
ТÑй каÑо нÑма гоÑов ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð·Ð° ÑаблиÑа, ÑаблиÑаÑа Ñе изгÑажда ÑÑез ÑикÑл. Ðие опÑеделÑÑе оÑмеÑÑваниÑÑа по кооÑдинаÑаÑа X за колониÑе и виÑоÑинаÑа на Ñеда, изпиÑваÑе вÑÑка клеÑка Ñ AddText и изÑеÑÑаваÑе линииÑе Ñ Ð¿ÑавоÑгÑлни пÑÑиÑа. ÐÑиÑмеÑикаÑа е ваÑа задаÑа, но е леÑна и веднÑж напиÑана, може да Ñе пÑиложи за вÑÑка мÑежа (grid), Ð¾Ñ ÐºÐ¾ÑÑо Ñе нÑждаеÑе.
procedure DrawTable(Pdf: TPdf; Left, Top: Double);
const
ColX: array[0..2] of Double = (0, 110, 210); // column offsets
RowH = 20;
var
Y: Double;
Row: Integer;
begin
// Header row
Pdf.AddText('Item', 'Arial', 10, Left + ColX[0], Top);
Pdf.AddText('Qty', 'Arial', 10, Left + ColX[1], Top);
Pdf.AddText('Price', 'Arial', 10, Left + ColX[2], Top);
// Rule under the header
Pdf.CreatePath(Left, Top - 5, 260, 0.5, fmNone, clBlack, $FF);
Pdf.AddPath;
// Data rows, stepping Y downward each iteration
Y := Top;
for Row := 1 to 3 do
begin
Y := Y - RowH;
Pdf.AddText('Item ' + IntToStr(Row), 'Arial', 9, Left + ColX[0], Y);
Pdf.AddText(IntToStr(Row * 2), 'Arial', 9, Left + ColX[1], Y);
Pdf.AddText('$' + IntToStr(Row * 10) + '.00', 'Arial', 9, Left + ColX[2], Y);
end;
end;
ÐбÑÑнеÑе внимание, Ñе Y Ñе движи Ð½Ð°Ð´Ð¾Ð»Ñ Ñ Ð²Ð¸ÑоÑинаÑа на Ñеда пÑи вÑÑка ÑÑÑпка, ÑÑй каÑо поÑокаÑа нагоÑе е положиÑелна. ТÑк липÑаÑа на измеÑване на дÑлжинаÑа на ÑекÑÑа ÑÑава видима: ниÑо не пÑеÑи на дÑлго име на аÑÑикÑл да навлезе в ÑÑÑеднаÑа колона, ÑÑй каÑо библиоÑекаÑа не знае колко ÑиÑок е ÑендиÑаниÑÑ Ð½Ð¸Ð·. Ðа докÑменÑи Ñ ÑикÑиÑан ÑоÑмаÑ, пÑи коиÑо конÑÑолиÑаÑе данниÑе, можеÑе пÑоÑÑо да зададеÑе доÑÑаÑÑÑно ÑиÑоки колони. Ðа наиÑÑина динамиÑно ÑÑдÑÑжание ÑÑÑбва или да огÑаниÑиÑе Ð²Ñ Ð¾Ð´Ð½Ð¸Ñе данни, или Ñами да измеÑиÑе ÑиÑинаÑа на глиÑовеÑе, пÑеди да ги ÑазположиÑе â?моменÑ, пÑи койÑо ÑпеÑиализиÑана библиоÑека за оÑоÑмление запоÑва да Ñи вÑзвÑÑÑа инвеÑÑиÑиÑÑа.
ÐзобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ множеÑÑво ÑÑÑаниÑи
РаÑÑеÑноÑо ÑÑдÑÑжание Ñе вÑвежда ÑÑез помоÑни меÑоди за изобÑажениÑ. AddPicture пÑиема заÑеден Ð¾Ð±ÐµÐºÑ TPicture и го Ñазполага в дадена ÑоÑка Ñ Ð½ÐµÐ·Ð°Ð´ÑлжиÑелни ÑазмеÑи за маÑабиÑане; AddImage пÑиема диÑекÑно пÑÑ ÐºÑм Ñайл или Ð¾Ð±ÐµÐºÑ TBitmap, а AddJpegImage пÑедава компÑеÑиÑаниÑе JPEG байÑове, без да пÑеминава пÑез bitmap. ÐакÑо пÑи вÑиÑко оÑÑанало, кооÑдинаÑиÑе за позиÑиониÑане Ñа долниÑÑ Ð»Ñв ÑгÑл на изобÑажениеÑо в поÑÑебиÑелÑкоÑо пÑоÑÑÑанÑÑво, а ÑиÑинаÑа и виÑоÑинаÑа Ñа ÑазмеÑиÑе вÑÑÑ
Ñ ÑÑÑаниÑаÑа в ÑоÑки, а не ÑазмеÑиÑе в пикÑели на изÑ
Ð¾Ð´Ð½Ð¸Ñ Ñайл.
procedure CreateMultiPageReport(const FileName: string; PageCount: Integer);
var
Pdf: TPdf;
P: Integer;
begin
Pdf := TPdf.Create(nil);
try
Pdf.CreateDocument;
for P := 1 to PageCount do
begin
Pdf.AddPage(P, 595, 842); // append; the new page becomes current
Pdf.AddText('Page ' + IntToStr(P) + ' of ' + IntToStr(PageCount),
'Arial', 10, 50, 30); // footer near the bottom edge
// ... draw this page's body here ...
end;
Pdf.SaveAs(FileName);
finally
Pdf.Active := False;
Pdf.Free;
end;
end;
ÐногоÑÑÑаниÑниÑÑ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð¿Ð¾Ð²ÑаÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð° за единиÑна ÑÑÑаниÑа в ÑикÑл. ÐÑеки меÑод AddPage Ð´Ð¾Ð±Ð°Ð²Ñ ÑÑÑаниÑа и Ñ Ð¿Ñави ÑекÑÑа, Ñака Ñе оÑновноÑо ÑÑло и долниÑÑ ÐºÐ¾Ð»Ð¾Ð½ÑиÑÑл (footer), коиÑо изÑеÑÑаваÑе Ñлед Ñова, Ñе позиÑиониÑÐ°Ñ Ð²ÑÑÑ
Ñ ÑÑÑаниÑаÑа, коÑÑо ÑокÑ-Ñо ÑÑе добавили. Ðе е необÑ
одимо да пÑоменÑÑе PageNumber в Ñози ÑикÑл, ÑÑй каÑо добавÑнеÑо на ÑÑÑаниÑа авÑомаÑиÑно пÑемеÑÑва кÑÑÑоÑа Ñам; ÑвойÑÑвоÑо PageNumber ви ÑÑÑбва Ñамо ако Ñе вÑÑÑаÑе кÑм ÑÑÑаниÑа извÑн Ñеда на нейноÑо ÑÑздаване. ÐзвикайÑе SaveAs веднÑж накÑаÑ, Ñлед каÑо поÑледнаÑа ÑÑÑаниÑа е попÑлнена. Ðко имаÑе нÑжда Ð¾Ñ Ð°ÑÑ
ивен пÑоÑил (PDF/A), а не Ð¾Ñ Ð¾Ð±Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½ Ñайл, ÑÑÑиÑÑ Ð¾Ð±ÐµÐºÑ Ð½Ð° докÑменÑа пÑедлага меÑода SaveAsPdfA и дÑÑги ÑÑвмеÑÑими ваÑианÑи, Ñака Ñе избоÑÑÑ Ð½Ð° изÑ
оден ÑÑандаÑÑ Ðµ пÑоÑÑо ÑазлиÑно извикване на меÑод за запиÑ, а не пÑомÑна в логикаÑа на изгÑаждане.
ÐÑде е пÑиложениеÑо на Ñози Ð¿Ð¾Ð´Ñ Ð¾Ð´
Ðко ÑÑÑбва да Ñме напÑлно коÑекÑни, пÑиложниÑÑ Ð¿ÑогÑамен инÑеÑÑÐµÐ¹Ñ (API) за ÑÑздаване на докÑменÑи в PDFium VCL е ÑÑнÑк и надежден Ñлой над модела Ð¾Ñ Ð¾Ð±ÐµÐºÑи на ÑÑÑаниÑи на PDFium: Ñеално ÑÑздаване на докÑменÑи, вгÑадени ÑÑиÑÑове, векÑоÑно и ÑаÑÑеÑно ÑÑдÑÑжание, запиÑани в ÑÑоÑвеÑÑÑвие ÑÑÑ ÑÑандаÑÑиÑе. Той не е и не пÑеÑендиÑа да бÑде двигаÑел за авÑомаÑиÑно пÑеÑÑÑÑкÑÑÑиÑане на докÑменÑи. РазделиÑелнаÑа Ð»Ð¸Ð½Ð¸Ñ Ðµ ÑазположениеÑо на ÑекÑÑа. Ðко ваÑиÑÑ ÑезÑлÑÐ°Ñ Ðµ базиÑан на Ñаблони (ÑакÑÑÑи, ÑеÑÑиÑикаÑи, еÑикеÑи, Ñабла Ñ Ð´Ð°Ð½Ð½Ð¸, Ñазположени вÑв ÑикÑиÑана мÑежа), моделÑÑ Ñ Ð°Ð±ÑолÑÑни кооÑдинаÑи е диÑекÑен, бÑÑз и кодÑÑ Ð¾ÑÑава леÑен за ÑеÑене. Ðко ÑезÑлÑаÑÑÑ Ð²Ð¸ е дÑлÑг ÑекÑÑ, койÑо ÑÑÑбва да Ñе пÑенаÑÑ Ð¸ ÑазпÑÐµÐ´ÐµÐ»Ñ Ð½Ð° ÑÑÑаниÑи авÑомаÑиÑно, Ñе Ñе наложи да изгÑадиÑе Ñвой двигаÑел за оÑоÑмление над Ñези извикваниÑ, коеÑо пÑави инÑÑÑÑменÑа Ð½ÐµÐ¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ Ð·Ð° ÑелÑа. РазбиÑанеÑо Ð¾Ñ ÐºÐ¾Ñ ÑÑÑана на Ñази Ð»Ð¸Ð½Ð¸Ñ Ñе намиÑаÑе е най-важнаÑа ÑаÑÑ Ð¾Ñ ÑеÑениеÑо.
ÐеÑодиÑе за ÑÑздаване на докÑменÑи, опиÑани ÑÑк, Ñа ÑаÑÑ Ð¾Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа PDFium VCL Component за Delphi, койÑо ÑÑÑеÑава вÑзможноÑÑиÑе за генеÑиÑане на докÑменÑи Ñ ÑÑнкÑииÑе за визÑализаÑÐ¸Ñ Ð¸ извлиÑане на ÑекÑÑ, Ñ ÐºÐ¾Ð¸Ñо PDFium е по-извеÑÑен.