Re: set canvas dimensions to match text object

Robin Becker <[email protected]>
Newsgroups gmane.comp.python.reportlab.user
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.