[reportlab-users] set canvas dimensions to match text object
Robin Becker
robin at reportlab.com
Fri Jun 23 10:11:30 EDT 2017
I assume you are worrying about the extra space at the bottom, I tried your code
and just removed the line_spacing in the calculation of the total height.
However, I am guessing that your code is using the total line height to position
the text.
Logically, the text should be positioned using the base line as the reference ie
the initial y is then text_height - ascent, with this model we fix the leading
at line_height as well. If you want to add some slack just adjust ascent and/or
descent.
My version with slight adjustments
############################################################
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfgen.canvas import Canvas
lines = [
"Lorem ipsum dolor sit amet",
"laboramus cu eos, sit intellegat sadipscing",
"Ut summo reprimique eum",
"propriae concludaturque",
]
ascent_slack = 1
descent_slack = 1
font_size = 16
font_name = 'Helvetica'
face = pdfmetrics.getFont(font_name).face
ascent = (face.ascent * font_size) / 1000.0 + ascent_slack
descent = (face.descent * font_size) / 1000.0 - descent_slack
line_height = ascent - descent
line_widths = []
for line in lines:
width = pdfmetrics.stringWidth(line, font_name, font_size)
line_widths.append(width)
text_width = max(line_widths)
text_height = line_height * len(lines)
canvas = Canvas("output.pdf", pagesize=(text_width, text_height))
print '|lines|=%d line_height=%d ascent=%d descent=%d text_height=%d' %
(len(lines), line_height, ascent, descent, text_height)
x = 0
y = text_height - ascent
text = canvas.beginText(x, y)
text.setFont(font_name, font_size)
text.setLeading(line_height)
for line in lines:
width_offset = (text_width - pdfmetrics.stringWidth(line, font_name,
font_size)) * 0.5
text.setTextOrigin(width_offset, text.getY())
text.textLine(line)
canvas.drawText(text)
canvas.showPage()
canvas.save()
############################################################
On 23/06/2017 14:46, gordon wrote:
> Good Afternoon,
>
> I am trying to create a pdf canvas that is the minimum dimensions to fully
> contain a text object containing arbitrary text of arbitrary lines.
>
> I have gotten close but I think I am missing something in my calculation
> for the height because my calculated heights are larger than the actual
> display result.
>
> Any tips on how to make my height calculation more accurate?
>
> Here is my render code:
--
Robin Becker
More information about the reportlab-users
mailing list