ÐзгÑажданеÑо на PDF ÑеÑÐµÑ Ð² Delphi Ñе Ñвежда до два компоненÑа и вÑÑзкаÑа Ð¿Ð¾Ð¼ÐµÐ¶Ð´Ñ Ð¸Ð¼. TPdf пÑиÑежава докÑменÑа: Ñой оÑваÑÑ Ñайла, декÑипÑиÑа го и оÑговаÑÑ Ð½Ð° вÑпÑоÑи за бÑой ÑÑÑаниÑи и меÑаданни. TPdfView е визÑалнаÑа конÑÑола, коÑÑо изобÑазÑва ÑÑÑаниÑиÑе на екÑана и ÑпÑавлÑва пÑевÑÑÑанеÑо, маÑабиÑанеÑо и конкÑеÑнаÑа ÑÑÑаниÑа, коÑÑо поÑÑебиÑелÑÑ Ð¿Ñеглежда в моменÑа. PDFium VCL обвива ÑÑÑÐ¸Ñ Ð´Ð²Ð¸Ð³Ð°Ñел за ÑендиÑане, койÑо Ñе доÑÑÐ°Ð²Ñ Ð² Chrome, Ñака Ñе глиÑовеÑе, заглажданеÑо на ÑÑиÑÑовеÑе (anti-aliasing) и ÑвеÑовеÑе вÑÑÑ
Ñ Ð¿Ð»Ð°ÑноÑо ÑÑÐ²Ð¿Ð°Ð´Ð°Ñ Ñ Ñова, коеÑо ваÑиÑе поÑÑебиÑели веÑе Ð²Ð¸Ð¶Ð´Ð°Ñ Ð² бÑаÑзÑÑа Ñи. РабоÑаÑа не е в ÑамоÑо изобÑазÑване. Ð¢Ñ Ðµ в ÑвÑÑзванеÑо на обекÑа на докÑменÑа Ñ Ð¸Ð·Ð³Ð»ÐµÐ´Ð°, заÑежданеÑо без ÑÑивове пÑи повÑеден или заÑиÑен Ñ Ð¿Ð°Ñола Ñайл, какÑо и в пÑедоÑÑавÑнеÑо на нÑколкоÑо конÑÑоли, коиÑо пÑавÑÑ ÑеÑеÑа завÑÑÑен: пÑелиÑÑване на ÑÑÑаниÑи, пÑомÑна на маÑаба, напаÑване на ÑÑÑаниÑаÑа кÑм пÑозоÑеÑа.
Това ÑÑководÑÑво Ñазглежда ÑглобÑванеÑо в Ñеда, в койÑо Ñеално го изгÑаждаÑе. ÐÑиÑко ÑÑк изобÑазÑва по една ÑÑÑаниÑа наведнÑж, коеÑо е пÑедпоÑиÑаниÑÑ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð·Ð° повеÑеÑо ÑабоÑни пÑоÑеÑи Ñ Ð´Ð¾ÐºÑменÑи. Ðко имаÑе нÑжда Ð¾Ñ ÑÑÑаниÑи, подÑедени в една непÑекÑÑнаÑо пÑевÑÑÑаÑа Ñе колона, Ñова е ÑазлиÑно ÑеÑение за оÑоÑмление, Ñазгледано в оÑделна ÑÑаÑиÑ, и не е Ð¾Ð±ÐµÐºÑ Ð½Ð° Ñази Ñема.
СвÑÑзване на TPdf кÑм TPdfView
ÐоÑÑавеÑе TPdf и TPdfView вÑÑÑ
Ñ ÑоÑмаÑа, Ñлед коеÑо кажеÑе на изгледа кой докÑÐ¼ÐµÐ½Ñ Ð´Ð° покаже. Това единиÑно пÑиÑвоÑване е ÑÑлаÑа вÑÑзка Ð¼ÐµÐ¶Ð´Ñ Ð½ÐµÐ²Ð¸Ð·ÑÐ°Ð»Ð½Ð¸Ñ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð¸ конÑÑолаÑа, коÑÑо го изÑеÑÑава.
procedure TFormMain.FormCreate(Sender: TObject);
begin
// Pdf and PdfView were dropped at design time.
PdfView.Pdf := Pdf; // the view paints whatever this document holds
PdfView.FitMode := pfmFitWidth; // start the user at a sensible zoom
end;
ÐÑеди неÑо Ð¾Ñ Ñова да заÑабоÑи, оÑигиналнаÑа PDFium библиоÑека ÑÑÑбва да бÑде налиÑна на компÑÑÑÑа. PDFium VCL Ñе обÑÑÑа кÑм pdfium32.dll или pdfium64.dll в завиÑимоÑÑ Ð¾Ñ Ð²Ð°ÑаÑа Ñелева плаÑÑоÑма, и докÑменÑÑÑ Ð¿ÑоÑÑо Ñе оÑкаже да Ñе оÑвоÑи, ако DLL ÑайлÑÑ Ð½Ðµ бÑде намеÑен. ÐоÑÑавеÑе ÑÑоÑвеÑÐ½Ð¸Ñ DLL до ваÑеÑо изпÑлнимо пÑиложение или го поÑÑавеÑе Ñам, кÑдеÑо ÑиÑÑемниÑÑ Ð·Ð°ÑÐµÐ¶Ð´Ð°Ñ Ð¼Ð¾Ð´Ñл Ñе го оÑкÑие. ÐеÑÑииÑе Ñ Ð¿Ð¾Ð´Ð´ÑÑжка на V8 ÑÑÑеÑÑвÑÐ²Ð°Ñ Ñамо за PDF Ñайлове Ñ JavaScript, койÑо иÑкаÑе да изпÑлниÑе (неÑо, коеÑо обикновениÑÑ ÑеÑÐµÑ Ð½Ðµ пÑави), Ñака Ñе използвайÑе ÑÑандаÑÑÐ½Ð¸Ñ DLL, оÑвен ако нÑмаÑе конкÑеÑна пÑиÑина за обÑаÑноÑо.
ÐаÑеждане на докÑÐ¼ÐµÐ½Ñ Ð±ÐµÐ· ÑлÑпо довеÑие кÑм Ð²Ñ Ð¾Ð´Ð½Ð¸Ñе данни
ÐÑÑвонаÑалниÑÑ Ð¸Ð½ÑÑÐ¸Ð½ÐºÑ Ðµ да обвиеÑе заÑежданеÑо в try/except блок и да ÑÑеÑиÑаÑе вÑÑко изклÑÑение каÑо неÑÑпеÑ
. Този инÑÑÐ¸Ð½ÐºÑ ÑÑк е гÑеÑен, и ако го поÑледваÑе, Ñе ÑÑздадеÑе ÑеÑеÑ, койÑо изглежда добÑе, докаÑо нÑкой не Ð¼Ñ Ð¿Ð¾Ð´Ð°Ð´Ðµ повÑеден Ñайл. ÐадаванеÑо на Active := True не пÑедизвиква изклÑÑение пÑи гÑеÑка в заÑежданеÑо. PDFium VCL ÑÐ»Ð°Ð²Ñ Ð²ÑÑÑеÑнаÑа гÑеÑка и оÑÑÐ°Ð²Ñ Active ÑÑÑ ÑÑойноÑÑ False, Ñака Ñе единÑÑвениÑÑ ÑигÑÑен наÑин да ÑазбеÑеÑе дали докÑменÑÑÑ Ðµ оÑвоÑен е да пÑоÑеÑеÑе обÑаÑно ÑÑойноÑÑÑа на ÑвойÑÑвоÑо, Ñлед каÑо ÑÑе го задали.
procedure TFormMain.OpenDocument(const FileName: string);
begin
Pdf.FileName := FileName;
Pdf.Active := True; // never raises; failure leaves Active = False
if not Pdf.Active then
begin
ShowMessage('Could not open ' + FileName);
Exit;
end;
PdfView.PageNumber := 1; // the view tracks its own current page
UpdatePageLabel;
end;
Ðве неÑа заÑлÑÐ¶Ð°Ð²Ð°Ñ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ. ÐÑÑвоÑо е, Ñе PageNumber ÑÑÑеÑÑвÑва и в дваÑа обекÑа и Ñе Ñа незавиÑими един Ð¾Ñ Ð´ÑÑг. Pdf.PageNumber е конÑепÑиÑÑа на докÑменÑа за ÑекÑÑа ÑÑÑаниÑа; PdfView.PageNumber е ÑÑÑаниÑаÑа, коÑÑо конÑÑолаÑа Ñеално показва, и Ñова е ÑÑойноÑÑÑа, коÑÑо пÑоменÑÑе, за да движиÑе поÑÑебиÑÐµÐ»Ñ Ð¸Ð· Ñайла. ÐаÑÑÑойванеÑо на едноÑо не пÑÐ¾Ð¼ÐµÐ½Ñ Ð°Ð²ÑомаÑиÑно дÑÑгоÑо, Ñака Ñе ÑеÑеÑÑÑ Ð²Ð¸Ð½Ð°Ð³Ð¸ ÑпÑавлÑва ÑвойÑÑвоÑо на изгледа. ÐÑоÑоÑо неÑо е индекÑиÑанеÑо Ð¾Ñ 1: ÑÑÑаниÑиÑе запоÑÐ²Ð°Ñ Ð¾Ñ 1 до Pdf.PageCount, а не Ð¾Ñ 0, коеÑо може да изненада вÑеки, Ñвикнал Ñ Ð¼Ð°Ñиви, запоÑваÑи Ð¾Ñ Ð½Ñла.
РабоÑа Ñ ÑиÑÑован Ñайл
ШиÑÑованиÑе докÑменÑи Ñе впиÑÐ²Ð°Ñ Ð² ÑÑÑÐ¸Ñ Ð¿ÑÑ Ð½Ð° заÑеждане. Ðко паÑолаÑа за оÑваÑÑне е зададена пÑеди акÑивиÑанеÑо, докÑменÑÑÑ Ñе декÑипÑиÑа пÑи оÑваÑÑнеÑо Ñи; ако ÑÑ Ðµ гÑеÑна или липÑва, Active оÑÑава False, ÑоÑно какÑо пÑи повÑеден Ñайл. Така Ñе вÑзÑÑановÑванеÑо Ñе ÑÑÑÑои в изиÑкване на паÑола Ð¾Ñ Ð¿Ð¾ÑÑебиÑÐµÐ»Ñ Ð¸ повÑоÑен Ð¾Ð¿Ð¸Ñ Ð·Ð° акÑивиÑане.
procedure TFormMain.OpenWithPassword(const FileName: string);
var
Password: string;
begin
Pdf.FileName := FileName;
Pdf.Active := True;
if not Pdf.Active then
begin
if InputQuery('Password required', 'Password:', Password) then
begin
Pdf.Password := Password; // must be set before Active := True
Pdf.Active := True;
end;
if not Pdf.Active then
begin
ShowMessage('Unable to open the document.');
Exit;
end;
end;
PdfView.PageNumber := 1;
end;
ТÑй каÑо неÑÑпеÑ
ÑÑ Ðµ ÑиÑ
какÑо пÑи гÑеÑна паÑола, Ñака и пÑи повÑеден Ñайл, не можеÑе да ги ÑазлиÑиÑе Ñамо по ÑÑойноÑÑÑа на Active. Ðа пÑакÑика Ñова е пÑиемливо за ÑеÑеÑ: поÑÑебиÑелÑÑ Ð¸Ð»Ð¸ пÑедоÑÑÐ°Ð²Ñ Ð¿ÑавилнаÑа паÑола, или ÑазбиÑа, Ñе ÑайлÑÑ Ð½Ñма да Ñе оÑвоÑи, каÑо ÑÑобÑениеÑо е едно и ÑÑÑо и в дваÑа ÑлÑÑаÑ.
ÐÑелиÑÑване на ÑÑÑаниÑи в докÑменÑа
ÐÑи оÑвоÑен докÑÐ¼ÐµÐ½Ñ Ð½Ð°Ð²Ð¸Ð³Ð°ÑиÑÑа е пÑоÑÑо аÑиÑмеÑика вÑÑÑ
Ñ PdfView.PageNumber, огÑаниÑена Ð¾Ñ Pdf.PageCount. ÐдинÑÑвенаÑа Ñеална ÑабоÑа е огÑаниÑаванеÑо на ÑÑойноÑÑиÑе (clamping), Ñака Ñе бÑÑониÑе никога да не изÑлаÑÐºÐ°Ñ ÑÑÑаниÑаÑа извÑн диапазона, а бÑÑониÑе за пÑÑва и поÑледна ÑÑÑаниÑа да оÑÑÐ°Ð²Ð°Ñ Ð½ÐµÐ°ÐºÑивни в дваÑа кÑÐ°Ñ Ð½Ð° Ñайла.
procedure TFormMain.GoToPage(NewPage: Integer);
begin
if not Pdf.Active then
Exit;
if NewPage < 1 then
NewPage := 1
else if NewPage > Pdf.PageCount then
NewPage := Pdf.PageCount;
PdfView.PageNumber := NewPage;
UpdatePageLabel;
end;
// the four navigation buttons reduce to one call each
procedure TFormMain.FirstClick(Sender: TObject); begin GoToPage(1); end;
procedure TFormMain.PrevClick(Sender: TObject); begin GoToPage(PdfView.PageNumber - 1); end;
procedure TFormMain.NextClick(Sender: TObject); begin GoToPage(PdfView.PageNumber + 1); end;
procedure TFormMain.LastClick(Sender: TObject); begin GoToPage(Pdf.PageCount); end;
ТекÑÑовоÑо поле âоÑидÐ?на ÑÑÑаниÑа Nâ?е ÑÑÑоÑо извикване на GoToPage, заÑ
Ñанвано Ñ Ð¿ÑеобÑазÑвано ÑÑло ÑиÑло, а огÑаниÑениеÑо покÑива ÑлÑÑаÑ, пÑи койÑо поÑÑебиÑелÑÑ Ð²Ñведе 9999 в докÑÐ¼ÐµÐ½Ñ Ð¾Ñ Ð´ÐµÑÐµÑ ÑÑÑаниÑи. ÐоддÑÑжайÑе UpdatePageLabel каÑо единÑÑвеноÑо мÑÑÑо, коеÑо изпиÑва âСÑÑаниÑа 3 Ð¾Ñ 12â? за да не Ñе Ñазминава показаниеÑо Ñ Ñова, коеÑо изгледÑÑ Ñеално показва.
ÐаÑабиÑане: ÑоÑни пÑоÑенÑи и Ñежими на напаÑване
ÐаÑабиÑанеÑо в TPdfView Ñе пÑедлага под две взаимодейÑÑваÑи ÑоÑми, и ÑазбиÑанеÑо на Ñова взаимодейÑÑвие е ÑазликаÑа Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð½ÑÑола за маÑаб, коÑÑо Ñе дÑÑжи пÑедвидимо, и Ñакава, коÑÑо Ñе боÑи Ñ Ð¿Ð¾ÑÑебиÑелÑ. ÐиÑекÑниÑÑ Ð½Ð°Ñин е ÑвойÑÑвоÑо Zoom â?пÑоÑенÑ, пÑи койÑо 100 ознаÑава Ñеален ÑазмеÑ. ÐÑÑгиÑÑ Ð½Ð°Ñин е FitMode, койÑо казва на изгледа Ñам да изÑиÑли маÑаба и да го пÑеизÑиÑлÑва динамиÑно пÑи оÑазмеÑÑване на пÑозоÑеÑа.
// fixed magnifications
PdfView.Zoom := 100; // actual size
PdfView.Zoom := 50; // half
PdfView.Zoom := 200; // double
// let the view size the page to the window, and keep it sized on resize
PdfView.FitMode := pfmFitWidth; // page width fills the control
PdfView.FitMode := pfmFitPage; // whole page visible
PdfView.FitMode := pfmActualSize; // 1:1 with the document's points
ÐÑо ÑаÑÑÑа, коÑÑо обÑÑква Ñ
оÑаÑа. ÐиÑекÑноÑо пÑиÑвоÑване на ÑÑойноÑÑ Ð½Ð° Zoom нÑлиÑа FitMode до pfmNone. Това е пÑавилно поведение, а не бÑг: в моменÑа, в койÑо поÑÑебиÑелÑÑ Ð¸Ð·Ð±ÐµÑе ÑоÑно 150%, изгледÑÑ Ð²ÐµÑе не може да Ñпазва Ñежима âнапаÑванÐ?по ÑиÑинаâ? ÑÑй каÑо двеÑе заÑвки Ñи пÑоÑивоÑеÑаÑ. ÐоÑледиÑаÑа за ваÑÐ¸Ñ Ð¿Ð¾ÑÑебиÑелÑки инÑеÑÑÐµÐ¹Ñ Ðµ, Ñе бÑÑонÑÑ Ð·Ð° пÑиближаване и бÑÑонÑÑ Ð·Ð° напаÑване на ÑÑÑаниÑаÑа Ñа взаимно изклÑÑваÑи Ñе ÑÑÑÑоÑниÑ, и ленÑаÑа Ñ Ð¸Ð½ÑÑÑÑменÑи ÑÑÑбва да показва акÑÐ¸Ð²Ð½Ð¸Ñ Ñежим. ÐогаÑо поÑÑебиÑелÑÑ ÐºÐ»Ð¸ÐºÐ½Ðµ вÑÑÑ
Ñ Ð½Ð°Ð¿Ð°Ñване на ÑÑÑаниÑаÑа, задайÑе FitMode; когаÑо избеÑе ÑиÑлен маÑаб, задайÑе Zoom и го оÑÑавеÑе да изÑиÑÑи Ñежима на напаÑване Ñам.
Ðко пÑедпоÑиÑаÑе Ñами да изÑиÑлÑваÑе ÑÑойноÑÑÑа за напаÑване (напÑÐ¸Ð¼ÐµÑ Ð·Ð° да заÑ
ÑаниÑе плÑÐ·Ð³Ð°Ñ Ð·Ð° маÑабиÑане Ñ ÑекÑÑÐ¸Ñ Ð¿ÑоÑенÑ), помоÑниÑе ÑвойÑÑва за вÑÑка ÑÑÑаниÑа ви Ð´Ð°Ð²Ð°Ñ Ñези ÑиÑла, без да пÑоменÑÑ Ñежима. PageWidthZoom[N], PageZoom[N], и ActualSizeZoom[N] вÑÑÑÐ°Ñ Ð¿ÑоÑенÑа, койÑо би напаÑнал ÑÑÑаниÑа N по ÑиÑина, изÑÑло или би Ñ Ð¸Ð·Ð¾Ð±Ñазил в Ñеален ÑазмеÑ.
// seed a zoom readout from the fit-to-width value of the current page
var
FitPercent: Double;
begin
FitPercent := PdfView.PageWidthZoom[PdfView.PageNumber];
ZoomEdit.Text := Format('%.0f%%', [FitPercent]);
end;
Ðакво Ñеално е Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ за завÑÑÑен ÑеÑеÑ
ÐÑÑвонаÑалноÑо заглавие може да пÑеÑвелиÑава обема на ÑабоÑаÑа. ÐпиÑаниÑÑ Ð¿Ð¾-гоÑе ÑеÑÐµÑ Ðµ Ñамо нÑколко деÑеÑки Ñеда и веÑе изпÑлнÑва задаÑиÑе, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¸ за ÑабоÑа Ñ Ð´Ð¾ÐºÑменÑи: оÑваÑÑне на Ñайл, ÑпÑавÑне Ñ Ð¿Ð¾Ð²Ñеден ÑакÑв, показване на ÑÑÑаниÑа, пÑелиÑÑване Ð¼ÐµÐ¶Ð´Ñ ÑÑÑаниÑиÑе и пÑомÑна на маÑаба ÑÑÑно или ÑÑез авÑомаÑиÑно напаÑване. PDFium вÑÑÑи ÑложнаÑа ÑабоÑа незабележимо. ÐгÑадениÑе ÑÑиÑÑове Ñе визÑализиÑÐ°Ñ Ð¿Ñавилно, аноÑаÑииÑе и полеÑаÑа на ÑоÑмÑлÑÑи Ñе изÑеÑÑÐ°Ð²Ð°Ñ Ñам, кÑдеÑо ги поÑÑÐ°Ð²Ñ Ð´Ð¾ÐºÑменÑÑÑ, а ÑÑÑаниÑаÑа, коÑÑо виждаÑе, ÑÑвпада Ñ Ñази, коÑÑо би видÑл поÑÑебиÑел на Chrome, ÑÑй каÑо Ñе използва един и ÑÑÑ Ð´Ð²Ð¸Ð³Ð°Ñел за изÑеÑÑаване.
Ðа Ñази база допÑлнениÑÑа Ñа по-ÑкоÑо козмеÑиÑни, оÑколкоÑо ÑÑÑÑкÑÑÑни. СелекÑиÑÑа на ÑекÑÑ Ð¸ ÑÑÑÑенеÑо ÑеÑÐ°Ñ Ð¾Ñ ÑÑÑÐ¸Ñ ÑекÑÑов Ñлой, койÑо PDFium веÑе изгÑажда; меÑаданни каÑо Pdf.Title и Pdf.Author Ñе доÑÑÑÐ¿Ð²Ð°Ñ Ñ ÐµÐ´Ð½Ð¾ ÑеÑене на ÑвойÑÑво; ÑоÑаÑиÑÑа и нÑанÑиÑе на ÑивоÑо Ñа опÑии за ÑендиÑане, коиÑо пÑедаваÑе пÑи изÑеÑÑаване на ÑÑÑаниÑаÑа вÑÑÑ
Ñ ÑаÑÑеÑно изобÑажение. ÐиÑо Ð¾Ñ Ñова не пÑÐ¾Ð¼ÐµÐ½Ñ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¸Ñ ÑкелеÑ, койÑо имаÑе ÑÑк: обекÑа на докÑменÑа, изгледа и поÑока заÑеждане-кÑм-навигаÑиÑ, койÑо ги ÑвÑÑзва. ÐзгÑадеÑе пÑавилно Ñози ÑкелеÑ, а оÑÑаналоÑо е вÑпÑÐ¾Ñ Ð½Ð° декоÑаÑиÑ.
ÐомпоненÑиÑе TPdf и TPdfView, използвани ÑÑк, Ñа ÑаÑÑ Ð¾Ñ PDFium VCL за Delphi и C++Builder, ÑиÑÑо пÑодÑкÑова ÑÑÑаниÑа ÑÑдÑÑжа пÑлнаÑа докÑменÑаÑÐ¸Ñ Ð½Ð° ÑеÑеÑа.