Этот учебник посвящен демонстрации Multi-Page Viewer, которая расширяет базовый просмотр PDF-файлов, добавляя возможность непрерывной прокрутки. Этот режим просмотра аналогичен тому, как современные программы для чтения PDF-файлов, такие как Adobe Acrobat, отображают документы, позволяя пользователям плавно прокручивать все страницы.
Обзор
Демонстрация Multi-Page Viewer демонстрирует расширенные режимы просмотра в PDFium VCL, включая одностраничный непрерывный просмотр и двухстраничный непрерывный просмотр (режим книги). Эти функции необходимы для создания профессионального опыта чтения PDF-файлов.
Режимы отображения
PDFium VCL поддерживает несколько режимов отображения с помощью свойства: DisplayMode Непрерывная прокрутка
|
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; |
Основные функции
- Continuous Scrolling Прокрутка всех страниц без навигации по страницам.
- Режим двойной страницы. Просмотр двух страниц одновременно, как в физической книге.
- Выделение текста на нескольких страницах. Выбор и копирование текста, охватывающего несколько страниц.
- Навигация по закладкам. Мгновенный переход к закладенным разделам.
- Поиск с подсветкой. – Найдите и выделите текст во всем документе.
- Навигация с клавиатуры – Поддержка клавиш-стрелок, Page Up/Down, Home/End.
- Оптимизированная производительность. – Отображает только видимые страницы для плавной прокрутки.
Требования к библиотеке PDFium DLL
Перед запуском любого приложения PDFium VCL необходимо установить файлы PDFium DLL. Эти файлы находятся в директории: DLLs папка:
pdfium32.dll/pdfium64.dll– Стандартные версии для большинства приложений.pdfium32v8.dll/pdfium64v8.dllРасширенные версии с движком JavaScript V8.
Установка: Запуск PDFiumVCL\DLLs\CopyDlls.bat Запустите программу от имени администратора, чтобы скопировать DLL-файлы в системные каталоги Windows. В 64-битной версии Windows 32-битные DLL-файлы должны быть помещены в, а 64-битные DLL-файлы - в. SysWOW64 (пусто, так как отсутствует информация о конкретных путях) System32.
Настройка компонента.
Демонстрация реализует сложную систему выбора текста:
|
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; |
Обнаружение индекса символов.
Для точного выбора текста демонстрация использует адаптивную к масштабу толерантность для обнаружения символов:
|
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; |
Подсветка выбранного текста.
В демонстрации выделенные элементы выбираются следующим образом: OnPaint Событие:
|
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; |
Копировать выбранный текст в буфер обмена
|
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; |
Функциональность поиска
Реализовать поиск текста с подсветкой:
|
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; |
Событие смены страницы
Обрабатывать смену страниц для обновления элементов пользовательского интерфейса:
|
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; |
Навигация с клавиатуры
Демонстрация обрабатывает сочетания клавиш для навигации:
|
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; |
Навигация по двум страницам
В режиме навигации по двум страницам, перемещайтесь по две страницы за раз:
|
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; |
Заключение.
Демонстрация "Многостраничного просмотрщика" показывает, как создать полнофункциональный PDF-ридер с непрерывной прокруткой, выделением текста и поиском. Это функции, которые пользователи ожидают от современных приложений для просмотра PDF-файлов.
PDFium VCL обрабатывает сложную отрисовку и извлечение текста, а вы сосредотачиваетесь на пользовательском интерфейсе и специфических для приложения функциях. В результате получается плавный и отзывчивый просмотр PDF-файлов, который не уступает коммерческим PDF-ридерам.
Получить Компонент PDFium VCL на loslab.com и начните создавать профессиональные приложения для работы с PDF в Delphi уже сегодня.