2016-04-20 2 views
1

Я работаю над некоторой разработкой проекта, связанной с созданием PDF с использованием LibHaru. Я планирую разместить текст в определенном регионе. Для этого я использовал TextRect(), но у меня есть некоторые проблемы с переносом текста.Обтекание текстом в LibHaru

  1. Если ширина текста больше, чем ширина прямоугольника, прямоугольник становится пустым. Как я могу избавиться от этого?
  2. Я попытался написать свою собственную текстовую оболочку или функцию разделения строк, которая добавляет пространство после определенного количества символов, но даже это кажется неудачным после определенного предела. Любая помощь в отношении функции обертывания текста.
  3. Как я могу вычислить ширину текста, который будет вписываться в определенную ширину прямоугольника?

Вот фрагмент кода для расщепленной функции строки:

void SplitString(int iLength, string strInput, string& strOutput) 
{ 

    int iSubstringsCnt; 
    int iAddedCnt; 


    iSubstringsCnt = strInput.length()/iLength; 
    iAddedCnt = iSubstringsCnt/iLength; 
    cout<<iSubstringsCnt<<endl; 
    cout<<iAddedCnt<<endl; 

    cout<<strInput.length()<<endl; 
    for (int iCnt = 0; iCnt <= iSubstringsCnt+ iAddedCnt; iCnt++) 
    { 
      if (0 == iCnt) 
        continue; 
       strInput.insert((iCnt * iLength)+(iCnt-1) , " "); 
    } 

    strOutput= strInput; 

} 
  • iLength: Длина, после чего я хочу разделить.
  • iAddedCnt: Счет строки после того, как я добавил пространство после нескольких символов.

ответ

1

Libharu - довольно низкоуровневая библиотека PDF. Поэтому в нем нет слишком большого количества параметров форматирования текста, таких как расширенная перенос текста. Однако, она предлагает вам некоторую помощь:

  • Функция HPDF_Page_TextRect записывает количество печатаемых символов, так что вы можете проверить, если печать была успешной без проверки файла PDF;
  • HPDF_Font_TextWidth возвращает ширину текста, который должен быть напечатан (в точках); и
  • Функция HPDF_Font_MeasureText дает вам количество байтов, которые могут быть напечатаны до заданной ширины (ответы).

С помощью этих функций вы можете разделить текст на несколько строк. Пример (для):

  • Использование HPDF_Font_MeasureText установить iLength
  • Найти возможную LineBreak позицию (например, дефис, точка, толстой кишки или пространства) с использованием strInput.rfind("-",iLength)
  • Если возможно LINEBREAK позиция была найдена , вставьте \n в это положение; else: вставьте строку на iLength.

Другой проблемой, с которой вы можете столкнуться, является высота коробки. Если у вас слишком много строк, они не будут напечатаны. Разделяя текст на несколько строк, вы можете отслеживать необходимое количество строк, а возможное количество строк в поле получается по высоте окна и межстрочному интервалу (устанавливается HPDF_Page_SetTextLeading).

Если у вас слишком много текста для размера коробки, libharu ничего не может сделать.Единственный способ увеличить размер коробки и уменьшить размер шрифта (ответы).