В мире программирования на Delphi и Lazarus работа с PDF-файлами является распространённой задачей. Одним из популярных решений для рендеринга PDF является библиотека MuPDF, которая предоставляет высокопроизводительные инструменты для работы с PDF-документами. В этой статье мы рассмотрим проблемы, с которыми столкнулись разработчики при использовании MuPDF в Lazarus, и предложим решения для 32-битной и 64-битной компиляции.
Обзор проблемы
Пользователь Boleeman на форуме Lazarus обнаружил исходный код для просмотра PDF-файлов с использованием Free Pascal-привязок к MuPDF (проект lazmupdf). Однако при компиляции возникли следующие проблемы:
Устаревший компонент TBGRAView вместо ожидаемого TPaintBox
Проблемы с рендерингом PDF (отражённое/перевёрнутое изображение)
Ограничение работы только с 32-битной версией библиотеки libmupdf.dll
Проблемы с интерфейсом (перекрытие элементов управления)
Решение проблемы с компонентом TBGRAView
Исходный код использует компонент TBGRAView из пакета BGRABitmap. В современных версиях Lazarus этот компонент был заменён или переименован. Вот как можно адаптировать код:
Основная логика рендеринга находится в методе 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. Решения:
Использование актуальной версии MuPDF:
Скачайте последнюю версию MuPDF с официального репозитория: https://github.com/ArtifexSoftware/mupdf
Скомпилируйте библиотеку для 64-битных систем
Обновление привязок для 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, рассмотрите альтернативные библиотеки:
Poppler:
Используйте привязки к библиотеке Poppler
PDFium:
Библиотека от Google с открытым исходным кодом
Требует создания Pascal-привязок
Встроенные решения:
Использование TPrinter для простого вывода PDF
Генерация PDF с помощью кода (без рендеринга)
Оптимизация интерфейса
Для решения проблем с интерфейсом (перекрытие элементов управления) внесите следующие изменения:
Работа с PDF в Lazarus с использованием MuPDF требует внимания к деталям, особенно при переходе между 32-битными и 64-битными системами. Основные решения включают:
Обновление устаревших компонентов (замена TBGRAView на TBGRAPaintBox)
Коррекцию матрицы преобразования для правильного рендеринга
Использование актуальных версий библиотек для 64-битных систем
Оптимизацию интерфейса для корректного отображения элементов управления
Для разработчиков, которые хотят избежать сложностей с MuPDF, существуют альтернативные библиотеки, такие как Poppler и PDFium, хотя они могут потребовать дополнительной работы по созданию Pascal-привязок.
Статья посвящена решению проблем рендеринга PDF в Lazarus с использованием библиотеки MuPDF, включая адаптацию кода для 32-битной и 64-битной компиляции, исправление ошибок отображения и оптимизацию интерфейса.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.