LazReport TlrPdfExportFilter принцип работы со шрифтами?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

LazReport TlrPdfExportFilter принцип работы со шрифтами?

Сообщение jsa »

Здравствуйте какой в TlrPdfExportFilter принцип работы со шрифтами?
Столкнулся с тем, что документ сохраненный в PDF из fastreport 5.* который встроен в один проект и документ сделанный с помощью LazReport TlrPdfExportFilter в разных просмотрщиках открывается по разному.
файлы PDF из LazReport открывается во всех просмотрщиках (по умолчанию) на смартфонах разных производителей (Asus, Samsung, Xiaomi, iPhone)
а вот такой же отчет сохраненный в PDF из FastReport открывается нормально только в iPhone , на Андроидах букв нет, есть только символы (точки , слэши, двоеточия и т.д.)
А Asus даже ругнулся на отсутсвие шрифтов Arial

Я так понимаю LazReport использует какие-то очень распространенные шрифты, поэтому с файлом нет проблем. Или вообще шрифты в файл встраиваются?
Как вообще это работает? Есть опыт?
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

В формате PDF есть два варианта - текст вставлен как изображение, созданное экспортером, и текст представлен символами определенного в документе шрифта. Просмотрщик пытается использовать или указанный шрифт, или подставить на его место "похожий". Если это "похожий" не имеет нужной кодовой страницы, выходит абракадабра.
Варианты борьбы - 1) использовать только самые стандартные юникодовские шрифты 2) печатать в картинку, а картинку уже конвертировать в PDF.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Снег Север
Добавлю свои 5 копеек. В PDF можно встраивать либо весь шрифт, либо только используемые глифы.
jsa
Когда делал TlrPdfExportFilter столкнулся с тем, что если не вставлять веcь шрифт, а только используемые глифы - как раз и проявляется описанный вами эффект. Потому там встраивается весь шрифт.
В FR по умолчанию, кажется, используется встраиваение только используемых глифов.
Размер кончено меньше - но проблема есть.
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

alexs писал(а):Когда делал TlrPdfExportFilter столкнулся с тем, что если не вставлять веcь шрифт, а только используемые глифы - как раз и проявляется описанный вами эффект. Потому там встраивается весь шрифт.

Я правильно понимаю, что TlrPdfExportFilter это твоя разработка?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

jsa писал(а):Я правильно понимаю, что TlrPdfExportFilter это твоя разработка?

Ну, надеюсь, помидорами кидать не будешь :-)
Там в качестве генератора pdf использую штатный fpc-pdf.
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

Да нет, хочу выразить благодарность. Твоя работа когда-то, очень помогла мне сейчас, облегчить работу сотрудников. Спасибо.
Tolik
незнакомец
Сообщения: 3
Зарегистрирован: 01.04.2019 15:56:49

Сообщение Tolik »

Доброго дня, может ни совсем в тему но по выгрузке в pdf. Возникает проблема с QR при экспорте в pdf он игнорирует его. Возможно решен данный момент? Или может я что то ни учел при построение отчета?
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

День добрый.
Поднимаю тему.
Почему-то в экспортированном в PDF отчете не срабатывает установка на жирные шрифты.
в Дизайнере макета на предпросмотре шрифты отображаются жирными
LazReport_Preview.png

а в файле уже нет.
LazReport_pdf.png


пробовал Arial и Time New Roman
Экспорт делаю так

Код: Выделить всё

FormMain.frReport_restests.ExportTo(TlrPDFExportFilter, fname); 

Может нужна какая-то настройка компонент?

Добавлено спустя 24 минуты 14 секунд:
Еще странности и интересности.
Все Memo лежат на бендах в данном макете.
А в одном тестовом макете бендов нет, и все шрифты в Memo выгружаются корректно, там где Bold там жирые , там где нет то нет.
Решил проверить в целевом макете, бросил Memo на Page (не на бенд) сделал шрифт жирным
И в выгруженном pdf вообще весь текст стал жирным.

потом положил еще один Memo рядом и попробовал различные комбинации.
Т.е. получается, что при выгрузке Bold на шрифтах считывается только для объектов вне бендов.
И первая установка Bold становится установкой по умолчанию для всех объектов и на бендах и вне бендов.

Т.е. видимо это ошибка в компоненте.

Т.е. при наличии бендов на странице, всегда есть проблема со шрифтами, когда бендов нет, то и проблемы нет
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Проверь с другими шрифтами.
Просто укажи для мемо другой шрифт.
Я проверил сейчас с Liberation Sans - всё норм.
Там есть одна тонкость что старые виндовые шрифты могут не верно обрабатываться.
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

попробовал, ситуация не изменилась. Да и сам шрифт в винде выглядит не очень.
слова "Область исследования", "Номер карты"
предпросмотр в дизайнере
LazReport_preview_02.png

выгрузка в файл
LazReport_pdf_02.png


Добавлено спустя 33 минуты 15 секунд:
В общем диагноз такой.
Не передается весь Style в PDF и именно при наличии на Page бендов
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Тогда нужен пример.
У меня были проблемы со стандартными Arial и Time New Roman - fcl-pdf не хочет их пережевывать хорошо.
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

пример это файл lrf ?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

ну да
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

Кажется я ошибся с оценкой происходящего.
Без бендов тоже проблема со шрифтами.
в архиве два макета (без бендов) со шрифтами Liberation Sans и Times_New_Roman
Там только тексты, поля выборки из базы убрал.
результирующий пример только для Liberation Sans потому что для Таймс файл получился более 600Кб и тут не прикрепляется. Но и в нем Bold не отрабатывается
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Проблема именено в виндовой версии.
В лине поведение нормально - а вот под виндой - не находится информация о шрифте. Сейчас смотрю под win10x64.

Добавлено спустя 43 минуты 26 секунд:
Понятно
Ручная установка шрифтов в винде стала выглядеть по другому - не так как раньше
шрифты стали в папке C:\Documents and Settings\alexs\Local Settings\Microsoft\Windows\Fonts
Надо читать документацию - какая константа отвечает за эту папку в винде.
Пока чтобы быстро проблему решить - всего лишь надо добавить эту папку в список обрабатываемых каталогов для объекта gTTFontCache

После добавления кода:

Код: Выделить всё

procedure TForm1.FormCreate(Sender: TObject);
  procedure InitFonts;
  procedure CreateFontDirList;
  var
    s: String;
  begin
    s := SHGetFolderPathUTF8(20); // CSIDL_FONTS = 20
    if s <> '' then
      gTTFontCache.SearchPath.Add(s);
    gTTFontCache.SearchPath.Add('C:\Documents and Settings\alexs\Local Settings\Microsoft\Windows\Fonts');
  end;
  var
    C: Integer;
  begin
    if gTTFontCache.Count = 0 then
    begin
      gTTFontCache.BuildFontCacheIgnoresErrors:=true;
      CreateFontDirList;
      gTTFontCache.BuildFontCache;
    end;
  end;
begin
  InitFonts;
end;


всё стало нормально.
Но это конечно костыль. Надо решать более правильно.
Ответить