Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Рендеринг PDF в Lazarus с использованием MuPDF: Проблемы и решения для 32-битной и 64-битной компиляции

Delphi , Синтаксис , Ошибки и Исключения

 

Введение

В мире программирования на Delphi и Lazarus работа с PDF-файлами является распространённой задачей. Одним из популярных решений для рендеринга PDF является библиотека MuPDF, которая предоставляет высокопроизводительные инструменты для работы с PDF-документами. В этой статье мы рассмотрим проблемы, с которыми столкнулись разработчики при использовании MuPDF в Lazarus, и предложим решения для 32-битной и 64-битной компиляции.

Обзор проблемы

Пользователь Boleeman на форуме Lazarus обнаружил исходный код для просмотра PDF-файлов с использованием Free Pascal-привязок к MuPDF (проект lazmupdf). Однако при компиляции возникли следующие проблемы:

  1. Устаревший компонент TBGRAView вместо ожидаемого TPaintBox
  2. Проблемы с рендерингом PDF (отражённое/перевёрнутое изображение)
  3. Ограничение работы только с 32-битной версией библиотеки libmupdf.dll
  4. Проблемы с интерфейсом (перекрытие элементов управления)

Решение проблемы с компонентом TBGRAView

Исходный код использует компонент TBGRAView из пакета BGRABitmap. В современных версиях Lazarus этот компонент был заменён или переименован. Вот как можно адаптировать код:

// Вместо:
uses BGRAView;
// Используйте:
uses BGRAPaintBox;

// И замените:
PaintBox1: TBGRAView;
// На:
PaintBox1: TBGRAPaintBox;

Настройка рендеринга PDF

Основная логика рендеринга находится в методе PaintBox1Redraw. Проблема с перевёрнутым изображением решается коррекцией матрицы преобразования:

procedure TPreviewForm.PaintBox1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
var
  w, h: integer;
  b: fz_bbox;
  ctm: fz_matrix;
  pix: fz_pixmap;
  dev: fz_device;
  oldc: TCursor;
begin
  if (FPNum < 0) or (FPNum >= FPCount) then exit;

  try
    oldc := Screen.Cursor;
    Screen.Cursor := crHourGlass;

    // Корректируем матрицу преобразования
    with ctm do
    begin
      a := 96/72;  // DPI: 96 - экран, 72 - PDF
      b := 0;
      c := 0;
      d := 96/72;
      e := 0;
      f := 0;
    end;

    with b do
    begin
      x0 := 0; 
      y0 := 0; 
      x1 := PaintBox1.Width; 
      y1 := PaintBox1.Height;
    end;

    pix := fz_new_pixmap_with_bbox_and_data(FCTX, 
           fz_find_device_colorspace(FCTX, 'DeviceBGR'), b, PaintBox1.Bitmap.Data);
    dev := fz_new_draw_device(FCTX, pix);
    fz_run_page(FDoc, FPage, dev, ctm, nil);

    // Убираем VerticalFlip, если он вызывает проблемы
    // PaintBox1.Bitmap.VerticalFlip;
  finally
    fz_free_device(dev);
    fz_drop_pixmap(FCTX, pix);
    Screen.Cursor := oldC;
  end;
end;

Поддержка 64-битной компиляции

Основная проблема с 64-битной компиляцией связана с несовместимостью старых версий libmupdf.dll. Решения:

  1. Использование актуальной версии MuPDF:
    Скачайте последнюю версию MuPDF с официального репозитория: https://github.com/ArtifexSoftware/mupdf
    Скомпилируйте библиотеку для 64-битных систем
  2. Обновление привязок для Free Pascal:
    Убедитесь, что заголовочные файлы Pascal соответствуют новой версии библиотеки
    Проверьте соглашения о вызовах (cdecl/stdcall)

Пример обновлённого объявления функций:

// Старое объявление (может не работать в 64-битном режиме)
function fz_new_context(alloc: Pointer; locks: Pointer; max_store: Integer): fz_context; cdecl; external 'libmupdf.dll';

// Новое объявление для 64-битной версии
function fz_new_context_64(alloc: Pointer; locks: Pointer; max_store: NativeUInt): fz_context; cdecl; external 'libmupdf64.dll' name 'fz_new_context';

Альтернативные решения для работы с PDF в Lazarus

Если у вас продолжаются проблемы с MuPDF, рассмотрите альтернативные библиотеки:

  1. Poppler:
    Используйте привязки к библиотеке Poppler
     
  2. PDFium:
    Библиотека от Google с открытым исходным кодом
    Требует создания Pascal-привязок

  3. Встроенные решения:
    Использование TPrinter для простого вывода PDF
    Генерация PDF с помощью кода (без рендеринга)

Оптимизация интерфейса

Для решения проблем с интерфейсом (перекрытие элементов управления) внесите следующие изменения:

procedure TPreviewForm.FormCreate(Sender: TObject);
begin
  // Настройка расположения элементов
  ToolBar1.Align := alTop;
  HRuler.Align := alTop;
  HRuler.Top := ToolBar1.Height;
  Panel1.Align := alBottom;
  VScrollBar.Align := alRight;
  HScrollBar.Align := alBottom;
  PaintBox1.Align := alClient;

  // Настройка якорей для адаптивного интерфейса
  HRuler.Anchors := [akLeft, akTop, akRight];
  VRuler.Anchors := [akLeft, akTop, akBottom];
  PaintBox1.Anchors := [akLeft, akTop, akRight, akBottom];
end;

Заключение

Работа с PDF в Lazarus с использованием MuPDF требует внимания к деталям, особенно при переходе между 32-битными и 64-битными системами. Основные решения включают:

  1. Обновление устаревших компонентов (замена TBGRAView на TBGRAPaintBox)
  2. Коррекцию матрицы преобразования для правильного рендеринга
  3. Использование актуальных версий библиотек для 64-битных систем
  4. Оптимизацию интерфейса для корректного отображения элементов управления

Для разработчиков, которые хотят избежать сложностей с MuPDF, существуют альтернативные библиотеки, такие как Poppler и PDFium, хотя они могут потребовать дополнительной работы по созданию Pascal-привязок.

Дополнительные ресурсы

  1. Официальный репозиторий MuPDF: https://github.com/ArtifexSoftware/mupdf
  2. Исходный код lazmupdf: https://github.com/blestan/lazmupdf
  3. Форум Lazarus: https://forum.lazarus.freepascal.org

Надеемся, что эта статья поможет вам успешно интегрировать MuPDF в ваши Lazarus-проекты и решить проблемы с 32-битной и 64-битной компиляцией.

Создано по материалам из источника по ссылке.

Статья посвящена решению проблем рендеринга PDF в Lazarus с использованием библиотеки MuPDF, включая адаптацию кода для 32-битной и 64-битной компиляции, исправление ошибок отображения и оптимизацию интерфейса.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки и Исключения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-04 06:23:44/0.0058629512786865/0