[scribus] Get the width of a piece of text in a Scribus script?

Gregory Pittman gpittman at iglou.com
Sat Aug 10 00:58:20 UTC 2013

On 08/09/2013 06:43 PM, Adam wrote:
> Good day,
> I'm working on a script for laying out a song book that includes 
> lyrics and chords. Chord names need to be placed above each line of 
> lyrics, at the appropriate spot in the lyrics. I've explored a variety 
> of approaches to this using typographic options to try to get the 
> chord letters bumped up above the lyrics line using baseline shift and 
> kerning adjustments, but so far these have not proved effective.
> My present approach is to put each chord in a small text box above the 
> lyrics line. In order to do this, I need to be able to determine the 
> horizontal position of that point in the lyrics, as rendered in the 
> relevant font and type size. Does anyone know of a way to do this?
> Apparently the ImageFont python module (which is a subset of PIL, or 
> the Python Imaging Library), can return the width of a text line as 
> rendered, but I so far have not been able to get this module working 
> properly (there's a C library involved, which is malfunctioning in my 
> installation).
> Does anyone know of any other way to programatically measure the 
> rendered width of a line of text?

Here is a fragment from an old script* I wrote for importing pictures 
from a directory, then creating text frames which contained the file 

                     Lpiclen = int(5.3 * lenfilename)
# Lpic is the label for each picture, with position and length adjusted
# according to the text length, so if you change the font or its size,
# you may need to adjust this only approximate calculation.
                     Lpic = scribus.createText(x, y + 193, Lpiclen, 15)

After some experimenting, I came up with this simple formula of 5.3 
times the number of characters to approximate the length in points 
needed for the text frame -- here my constraint was that it had to be 
long enough (too short was unacceptable, a little bit too long was Ok), 
so I needed to err a bit on the long side. I considered something more 
elegant, like considering each letter and allowing for relative sizes of 
letters, but for this purpose it wasn't worth the work.

I think you're looking for something that works pretty well most of the 
time, and then being left with a few scattered instances where you tweak 
the results. You might even be surprised at how simple a method you can 
come up with. Python of course has a number of commands for analyzing 
and manipulating strings, and presumably you're dealing with what 
amounts to lines of text.



More information about the scribus mailing list