Deze tutorial onderzoekt de Viewer voor meerdere pagina's demo, die de basis PDF-viewer uitbreidt met continue scrollmogelijkheden. Deze weergavemodus is vergelijkbaar met de manier waarop moderne PDF-lezers zoals Adobe Acrobat documenten weergeven, waardoor gebruikers naadloos door alle pagina's kunnen scrollen.
Overzicht
De Multi-Page Viewer-demo toont geavanceerde weergavemodi in de PDFium VCL, inclusief continu scrollen op één pagina en continu scrollen op twee pagina's (boekmodus). Deze functies zijn essentieel voor het creëren van een professionele PDF-leeservaring.
Weergavemodi
PDFium VCL ondersteunt meerdere weergavemodi via de DisplayMode eigendom:
|
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; |
Belangrijkste kenmerken
- Continu scrollen – Blader door alle pagina's zonder pagina-voor-pagina-navigatie
- Dubbele paginamodus – Bekijk twee pagina's naast elkaar als een fysiek boek
- Tekstselectie over pagina's – Selecteer en kopieer tekst die meerdere pagina's beslaat
- Bookmark navigatie – Ga direct naar secties met bladwijzers
- Zoeken met markering – Zoek en markeer tekst in het hele document
- Toetsenbordnavigatie – Pijltoetsen, Pagina omhoog/omlaag, Home/Einde-ondersteuning
- Geoptimaliseerde prestaties – Geeft alleen zichtbare pagina's weer voor soepel scrollen
PDFium DLL-vereisten
Voordat u een PDFium VCL-toepassing uitvoert, moet u de PDFium DLL-bestanden installeren. De DLL's bevinden zich in de DLLs map:
pdfium32.dll/pdfium64.dll– Standaardversies voor de meeste toepassingenpdfium32v8.dll/pdfium64v8.dll– Uitgebreide versies met V8 JavaScript-engine
Installatie: Loop PDFiumVCL\DLLs\CopyDlls.bat als beheerder om DLL's naar Windows-systeemmappen te kopiëren. Op 64-bits Windows gaan 32-bits DLL's naar SysWOW64 en 64-bits DLL's gaan naar System32.
Het onderdeel instellen
De demo implementeert een geavanceerd tekstselectiesysteem:
Urvanov Syntaxis Markeerstift 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; |
Tekenindexdetectie
Voor nauwkeurige tekstselectie gebruikt de demo zoombewuste tolerantie voor tekendetectie:
Urvanov Syntaxis Markeerstift 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; |
Geselecteerde tekst markeren
De demo toont selectiehoogtepunten in de OnPaint evenement:
|
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; |
Kopieer geselecteerde tekst naar klembord
Urvanov Syntaxis Markeerstift 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; |
Zoekfunctionaliteit
Implementeer tekstzoeken met markering:
Urvanov Syntaxis Markeerstift 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; |
Gebeurtenis voor paginawijziging
Paginawijzigingen verwerken om UI-elementen bij te werken:
Urvanov Syntaxis Markeerstift 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; |
Toetsenbordnavigatie
De demo verwerkt sneltoetsen voor navigatie:
Urvanov Syntaxis Markeerstift 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; |
Navigatie op twee pagina's
In de modus voor twee pagina's navigeert u per twee pagina's:
Urvanov Syntaxis Markeerstift 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; |
Conclusie
De Multi-Page Viewer-demo laat zien hoe u een complete PDF-lezer kunt bouwen met continu scrollen, tekstselectie en zoekfunctionaliteit. Dit zijn de functies die gebruikers verwachten van moderne PDF-kijkapplicaties.
PDFium VCL verzorgt de complexe weergave en tekstextractie, terwijl u zich concentreert op de gebruikersinterface en applicatiespecifieke functies. Het resultaat is een soepele, responsieve PDF-kijkervaring die kan wedijveren met commerciële PDF-lezers.
Krijgen PDFium VCL-onderdeel op loslab.com en begin vandaag nog met het bouwen van professionele PDF-applicaties in Delphi.