2014-02-13 3 views
1

Hy,ReportLab - перекрывающиеся слова

Я использую отчетную лабораторию для создания pdf. Я хочу нарисовать текст, который представляет собой Paragraph, представляющий заголовок, поэтому, если заголовок длиннее, чем доступный абзац, он будет разбит на следующей строке, и если заголовок будет длинным, чтобы соответствовать доступной ширине и высоте абзаца чем текст будет изменен.

Он работает нормально с amaller шрифт 10, но, если я выбираю стиль с большим шрифтом, например:

title_style = ParagraphStyle("title", fontName='Helvetica', fontSize=50, alignment=TA_CENTER, backColor=None) 

чем текст рисуется, как на изображении ниже, слова перекрывание: sample image

вот мой код:

def draw_on(canvas, x, y, paragraph, style, text, available_width, available_height, min_font_size=8): 
    w, h = paragraph.wrap(available_width, available_height) 
    temp_font_size = paragraph.style.fontSize 

    while temp_font_size > min_font_size: 

     if w <= available_width and h <= available_height: 
      paragraph.drawOn(canvas, x, y) 
      break 
     else: 

      temp_font_size -= 1 
      style.fontSize = temp_font_size 
      paragraph = Paragraph(text, style) 
      w, h = paragraph.wrap(available_width, available_height) 



def generate_pdf(): 

    c = canvas.Canvas("FirstPage.pdf") 

    title_style = ParagraphStyle("title", fontName='Helvetica', fontSize=10, alignment=TA_CENTER, backColor=None) 

    title_text = 'If title has a small font, everything s ok.' 
    title_paragraph = Paragraph(title_text, title_style) 
    title_paragraph_available_width = 2*inch 
    title_paragraph_available_height = 1*inch 
    title_min_font_size = 8 

    draw_on(c, 2*inch, 5*inch, title_paragraph, title_style, title_text, title_paragraph_available_width, 
      title_paragraph_available_height, title_min_font_size) 


    c.showPage() 
    c.save() 

Любой имеет ideea, почему это происходит и как исправить это?

ответ

1

Это описано на странице 67 UserGuide:

FONTSIZE и Fontname теги очевидны, но важно установить ведущий. Это расстояние между смежными строками текста; a Хорошее эмпирическое правило состоит в том, чтобы сделать это на 20% больше, чем размер точки.

Так что в вашем случае вам нужно иметь, чтобы добавить leading = 50 * 1.2 к вашему ParagraphStyle

Кроме того, как примечание стороны, я бы посоветовал вам использовать либо полный потенциал reportlabs Platypus (Paragraph «с, и т.д.) или просто придерживаться reportlabs pdfgen, который является более простым и простым в использовании. Platypus хорош для более длинных текстов и относительного позиционирования (думаю, латекс), а pdfgen - больше для абсолютного позиционирования (слова). Но это всего лишь мой оппонент ...