Bu eğitimde Çok Sayfalı Görüntüleyici Temel PDF görüntüleyiciyi sürekli kaydırma özellikleriyle genişleten demo. Bu görüntüleme modu, Adobe Acrobat gibi modern PDF okuyucularının belgeleri görüntüleme biçimine benzer ve kullanıcıların tüm sayfaları sorunsuz bir şekilde kaydırmasına olanak tanır.
Genel Bakış
Çok Sayfalı Görüntüleyici demosu, tek sayfa sürekli kaydırma ve çift sayfa sürekli kaydırma (kitap modu) dahil olmak üzere PDFium VCL'deki gelişmiş görüntüleme modlarını sergiliyor. Bu özellikler profesyonel bir PDF okuma deneyimi oluşturmak için gereklidir.
Ekran Modları
PDFium VCL, birden fazla ekran modunu destekler. DisplayMode özelliği:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
type TPdfDisplayMode = ( dmSingleContinuous, // Single page with continuous vertical scrolling dmDoubleContinuous // Two pages side-by-side (book layout) ); // Switch between display modes procedure TFormMain.ComboBoxDisplayModeChange(Sender: TObject); begin case ComboBoxDisplayMode.ItemIndex of 0: PdfView.DisplayMode := dmSingleContinuous; 1: PdfView.DisplayMode := dmDoubleContinuous; end; end; |
Temel Özellikler
- Sürekli Kaydırma – Sayfa sayfa gezinmeden tüm sayfalarda gezinin
- Çift Sayfa Modu – İki sayfayı fiziksel bir kitap gibi yan yana görüntüleyin
- Sayfalar Arasında Metin Seçimi – Birden fazla sayfaya yayılan metni seçin ve kopyalayın
- Yer İşaretinde Gezinme – Yer imlerine eklenen bölümlere anında atlayın
- Vurgulayarak Arama – Belgedeki metni bulun ve vurgulayın
- Klavye Gezinmesi – Ok tuşları, Sayfa Yukarı/Aşağı, Ana Sayfa/Son desteği
- Optimize Edilmiş Performans – Düzgün kaydırma için yalnızca görünür sayfaları oluşturur
PDFium DLL Gereksinimleri
Herhangi bir PDFium VCL uygulamasını çalıştırmadan önce PDFium DLL dosyalarını yüklemelisiniz. DLL'ler şurada bulunur:
PDFium VCL paketinin DLLs klasörü:
pdfium32.dll/pdfium64.dll– Çoğu uygulama için standart versiyonlarpdfium32v8.dll/pdfium64v8.dll– V8 JavaScript motorlu genişletilmiş sürümler DLL'leri Windows sistem dizinlerine kopyalamak için Yönetici olarak
Kurulum: Çalıştır
DLL'leri otomatik olarak Windows sistem dizinlerine kopyalamak için Yönetici olarak PDFiumVCL\DLLs\CopyDlls.bat . 64 bit Windows'ta 32 bit DLL'ler SysWOW64 ve 64 bit DLL'ler şuraya gider: System32.
Bileşenin Kurulumu
Demo, gelişmiş bir metin seçim sistemi uygular:
Urvanov Sözdizimi Vurgulayıcı v2.9.1|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
procedure TFormMain.PdfViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var CharIndex: Integer; begin if Button = mbLeft then begin // Get character index at click position CharIndex := GetPreciseCharacterIndex(X, Y); if CharIndex >= 0 then begin SelectionMode := True; Selecting := True; SelectionStart := CharIndex; SelectionEnd := CharIndex; end; end; end; procedure TFormMain.PdfViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var CharIndex: Integer; begin if Selecting then begin CharIndex := GetPreciseCharacterIndex(X, Y); if CharIndex >= 0 then begin SelectionEnd := CharIndex; PdfView.Invalidate; // Redraw to show selection end; end; end; |
Karakter Dizini Algılama
Demo, hassas metin seçimi için karakter algılama amacıyla yakınlaştırmaya duyarlı toleransı kullanır:
Urvanov Sözdizimi Vurgulayıcı v2.9.1|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
function TFormMain.GetPreciseCharacterIndex(X, Y: Integer): Integer; var BaseTolerance: Single; ZoomFactor: Single; AdjustedTolerance: Single; CharIndex: Integer; begin Result := -1; if not PdfView.Active then Exit; // Calculate dynamic tolerance based on zoom level ZoomFactor := PdfView.Zoom; BaseTolerance := 5.0; // Adjust tolerance inversely to zoom AdjustedTolerance := BaseTolerance / ZoomFactor; // Get character at position with tolerance CharIndex := PdfView.CharacterIndexAtPos(X, Y, AdjustedTolerance, AdjustedTolerance); Result := CharIndex; end; |
Seçilen Metni Vurgulama
Demo, seçimin önemli noktalarını çiziyor OnPaint olayı:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
procedure TFormMain.PdfViewPaint(Sender: TObject); var I, StartIdx, EndIdx: Integer; Rect: TPdfRectangle; R: TRect; begin if (SelectionStart >= 0) and (SelectionEnd >= 0) then begin StartIdx := Min(SelectionStart, SelectionEnd); EndIdx := Max(SelectionStart, SelectionEnd); // Draw highlight for each character in selection for I := StartIdx to EndIdx do begin Rect := PdfView.CharacterRectangle[I]; // Convert PDF coordinates to screen coordinates if PdfView.PageToDevice( Rect.Left, Rect.Top, PdfView.Left, PdfView.Top, PdfView.Width, PdfView.Height, PdfView.Rotation, R.Left, R.Top) then begin // Draw highlight rectangle PdfView.Canvas.Brush.Color := clHighlight; PdfView.Canvas.Brush.Style := bsSolid; PdfView.Canvas.FillRect(R); end; end; end; end; |
Seçilen Metni Panoya Kopyala
Urvanov Sözdizimi Vurgulayıcı v2.9.1|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
procedure TFormMain.MenuItemCopyClick(Sender: TObject); var StartIdx, EndIdx: Integer; SelectedText: string; begin if (SelectionStart >= 0) and (SelectionEnd >= 0) then begin StartIdx := Min(SelectionStart, SelectionEnd); EndIdx := Max(SelectionStart, SelectionEnd); // Set page number for text extraction Pdf.PageNumber := PdfView.PageNumber; // Extract text from selection range SelectedText := Pdf.Text(StartIdx, EndIdx - StartIdx + 1); // Copy to clipboard Clipboard.AsText := SelectedText; end; end; |
Arama İşlevselliği
Aşağıdakileri vurgulayarak metin aramayı uygulayın:
Urvanov Sözdizimi Vurgulayıcı v2.9.1|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
procedure TFormMain.SpeedButtonSearchClick(Sender: TObject); var SearchText: string; FoundIndex: Integer; begin SearchText := EditSearch.Text; if SearchText = '' then Exit; // Find first occurrence FoundIndex := Pdf.FindFirst(SearchText, [], 0, True); if FoundIndex >= 0 then begin SearchStart := FoundIndex; SearchEnd := FoundIndex + Length(SearchText) - 1; PdfView.Invalidate; // Redraw to show highlight end else ShowMessage('Text not found'); end; |
Sayfa Değişikliği Etkinliği
Kullanıcı arayüzü öğelerini güncellemek için sayfa değişikliklerini yönetin:
Urvanov Sözdizimi Vurgulayıcı v2.9.1|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
procedure TFormMain.PdfViewPageChanged(Sender: TObject); begin if PdfView.Active then begin // Update page indicator SpeedButtonPageNumber.Caption := IntToStr(PdfView.PageNumber) + ' of ' + IntToStr(PdfView.PageCount); // Update navigation button states SpeedButtonFirstPage.Enabled := PdfView.PageNumber > 1; SpeedButtonPreviousPage.Enabled := PdfView.PageNumber > 1; SpeedButtonNextPage.Enabled := PdfView.PageNumber < PdfView.PageCount; SpeedButtonLastPage.Enabled := PdfView.PageNumber < PdfView.PageCount; // Update bookmark tree selection if not DisableBookmarks then UpdateBookmarkSelection(PdfView.PageNumber); end; end; |
Klavye Gezinmesi
Demo, gezinme için klavye kısayollarını yönetir:
Urvanov Sözdizimi Vurgulayıcı v2.9.1|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
procedure TFormMain.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_ESCAPE: begin // Exit selection mode on Escape if SelectionMode then begin SelectionMode := False; SelectionStart := -1; SelectionEnd := -1; PdfView.Invalidate; end; Key := 0; end; VK_PRIOR, VK_UP, VK_LEFT: begin if SpeedButtonPreviousPage.Enabled then SpeedButtonPreviousPage.Click; Key := 0; end; VK_NEXT, VK_DOWN, VK_RIGHT: begin if SpeedButtonNextPage.Enabled then SpeedButtonNextPage.Click; Key := 0; end; VK_HOME: begin if SpeedButtonFirstPage.Enabled then SpeedButtonFirstPage.Click; Key := 0; end; VK_END: begin if SpeedButtonLastPage.Enabled then SpeedButtonLastPage.Click; Key := 0; end; end; end; |
Çift Sayfada Gezinme
Çift sayfa modundayken, aynı anda iki sayfada gezinin:
Urvanov Sözdizimi Vurgulayıcı v2.9.1|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
procedure TFormMain.SpeedButtonNextPageClick(Sender: TObject); begin if PdfView.DisplayMode = dmSingleContinuous then PdfView.PageNumber := PdfView.PageNumber + 1 else PdfView.PageNumber := PdfView.PageNumber + 2; end; procedure TFormMain.SpeedButtonPreviousPageClick(Sender: TObject); begin if PdfView.DisplayMode = dmSingleContinuous then PdfView.PageNumber := PdfView.PageNumber - 1 else PdfView.PageNumber := PdfView.PageNumber - 2; end; |
Sonuç
Çok Sayfalı Görüntüleyici demosu, sürekli kaydırma, metin seçimi ve arama işleviyle tam özellikli bir PDF okuyucunun nasıl oluşturulacağını gösterir. Bunlar, kullanıcıların modern PDF görüntüleme uygulamalarından beklediği özelliklerdir.
Siz kullanıcı arayüzüne ve uygulamaya özel özelliklere odaklanırken PDFium VCL, karmaşık oluşturma ve metin çıkarma işlemlerini gerçekleştirir. Sonuç, ticari PDF okuyuculara rakip olabilecek akıcı, hızlı yanıt veren bir PDF görüntüleme deneyimidir.
Al Loslab.com'da PDFium VCL Bileşeni ve Delphi'de profesyonel PDF uygulamaları oluşturmaya bugün başlayın.