Ce tutoriel explore la démo du lecteur multi-pages qui étend le lecteur PDF de base avec des fonctionnalités de défilement continu. Ce mode d'affichage est similaire à la façon dont les lecteurs PDF modernes comme Adobe Acrobat affichent les documents, permettant aux utilisateurs de parcourir toutes les pages de manière transparente.
Aperçu
La démo du lecteur multi-pages présente des modes d'affichage avancés dans PDFium VCL, notamment le défilement continu d'une seule page et le défilement continu de deux pages (mode livre). Ces fonctionnalités sont essentielles pour créer une expérience de lecture PDF professionnelle.
Modes d'affichage
PDFium VCL prend en charge plusieurs modes d'affichage via la DisplayMode propriété :
|
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; |
Principales fonctionnalités
- Défilement continu – Parcourir toutes les pages sans navigation page par page.
- Mode double page. – Afficher deux pages côte à côte, comme dans un livre physique.
- Sélection de texte entre les pages. – Sélectionner et copier du texte qui s'étend sur plusieurs pages.
- Navigation par signet. – Accéder instantanément aux sections enregistrées.
- Recherche avec surlignement. – Recherchez et mettez en évidence du texte dans tout le document.
- Navigation au clavier. – Prise en charge des touches fléchées, Page Up/Down, Home/End.
- Performance optimisée. – Affiche uniquement les pages visibles pour une navigation fluide.
Exigences des DLL PDFium
Avant d'exécuter une application PDFium VCL, vous devez installer les fichiers DLL de PDFium. Les DLL se trouvent dans le répertoire : DLLs dossier:
pdfium32.dll/pdfium64.dll– Versions standard pour la plupart des applications.pdfium32v8.dll/pdfium64v8.dll– Versions étendues avec le moteur JavaScript V8.
Installation : Exécuter PDFiumVCL\DLLs\CopyDlls.bat En tant qu'administrateur, copiez les DLL dans les répertoires système de Windows. Sur Windows 64 bits, les DLL 32 bits doivent être placées dans SysWOW64 et les DLL 64 bits dans System32.
Configuration du composant.
La démo implémente un système de sélection de texte sophistiqué :
|
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; |
Détection de l'index des caractères.
Pour une sélection de texte précise, la démo utilise une tolérance sensible au zoom pour la détection des caractères :
|
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; |
Mise en évidence du texte sélectionné.
La démo met en évidence les éléments sélectionnés dans l'événement. OnPaint événement:
|
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; |
Copier le texte sélectionné dans le presse-papiers.
|
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; |
Fonctionnalité de recherche.
Implémenter la recherche de texte avec surlignage:
|
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; |
Événement de changement de page.
Gérer les changements de page pour mettre à jour les éléments de l'interface utilisateur.
|
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; |
Navigation au clavier.
La démo gère les raccourcis clavier pour la navigation :
|
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; |
Navigation à double page
En mode à double page, naviguez par deux pages à la fois :
|
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; |
Conclusion.
La démo Multi-Page Viewer montre comment créer un lecteur PDF complet avec défilement continu, sélection de texte et fonctionnalités de recherche. Ce sont les fonctionnalités que les utilisateurs attendent des applications de lecture PDF modernes.
PDFium VCL gère le rendu complexe et l'extraction de texte, tandis que vous vous concentrez sur l'interface utilisateur et les fonctionnalités spécifiques à l'application. Le résultat est une expérience de lecture PDF fluide et réactive qui rivalise avec les lecteurs PDF commerciaux.
Obtenez Composant PDFium VCL sur loslab.com et commencez dès aujourd'hui à créer des applications PDF professionnelles en Delphi.