Technisch artikel

Een PDF-viewer met meerdere pagina's maken met continu scrollen in Delphi

· PDF-programmeren

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:

Urvanov Syntaxis Markeerstift v2.9.1
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;
[Formaattijd: 0,0008 seconden]

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 toepassingen
  • pdfium32v8.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;
[Formaattijd: 0,0004 seconden]

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;
[Formaattijd: 0,0005 seconden]

Geselecteerde tekst markeren

De demo toont selectiehoogtepunten in de OnPaint evenement:

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
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;
[Formaattijd: 0,0005 seconden]

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;
[Formaattijd: 0,0003 seconden]

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;
[Formaattijd: 0,0003 seconden]

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;
[Formaattijd: 0,0003 seconden]

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;
[Formaattijd: 0,0005 seconden]

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;
[Formaattijd: 0,0002 seconden]

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.