We will be migrating from Ask to Discourse on the first week of August, read the details here

Ask Your Question

how to programmatically determine the length (distance) of a formatted line of text (string) in pixels (cm, ...)?

asked 2020-07-20 12:05:22 +0200

Oleg.V.Melnichuk gravatar image

updated 2021-06-03 20:17:45 +0200

Alex Kemp gravatar image

I need to programmatically (basic, macro) determine the metric length of formatted text. Thanks for any thoughts.

edit retag flag offensive close merge delete


You tagged common. Do you want to do that in Writer, Calc, Draw and Impress? Or only one of them. Edit and retag your question to give additional info. Don't forget your (OS and) LO version since programming may differ between versions.

ajlittoz gravatar imageajlittoz ( 2020-07-20 15:53:08 +0200 )edit

This depends on the definition of "formatted". If you mean "a text with arbitrary formatted parts (different font/size/style/sub/superscript/kerning/...), like possible in Writer's paragraph", then @Lupp' solution is likely the only possible.

For simpler cases, however, where "formatted" means "this text string in this specific font (with constant size/style etc.)", there's an XTextLayout interface, providing queryTextBounds method. An instance of such interface may be obtained e.g. using XCanvasFont::createTextLayout; and you may obtain XCanvasFont if you have a canvas.

Mike Kaganski gravatar imageMike Kaganski ( 2020-07-20 23:50:57 +0200 )edit

Thank you all for your attention and I will try to make the issue clearer.

  • Firstly

Text with a formatted font, especially designer fonts, has both a width and a height different from monospaced. It is interesting to be able to programmatically determine the length of such text formatting.

  • Second

I did not find a solution on my own, so I put the tag common, not Writer, Calc, Draw or Impress. If this is possible for one of the lists, then I can use the solution for another.

Oleg.V.Melnichuk gravatar imageOleg.V.Melnichuk ( 2020-07-21 06:59:56 +0200 )edit

Thanks to @Mike Kaganski . I didn't know the XTextLayout interface yet when I answered.
Though I never used it, I knew the XFont interface (offering getStringWidth e..g ), but judged it to not be adequate in the case because it only accepts a string, and can therefore not regard any internal fprmatting. Even probably needed replacements for missing glyphs may cause problems.
Had I known XTextLayout with its poweful methods I surely would have pointed to it as a probably superior alternative.
I Would suggest @Mike Kaganski post the information he gave as an answer, and to include hints how to use that interface. This way it would be much more likely found by users looking for it.

Lupp gravatar imageLupp ( 2020-07-21 10:51:50 +0200 )edit

@Lupp: unfortunately I have no spare cycles to make that a proper answer - that's why it's a comment in the first place. I know of the interfaces; but I'd need much experimentation to make examples and explanations. That's up to an interested party.

Mike Kaganski gravatar imageMike Kaganski ( 2020-07-21 11:52:11 +0200 )edit

1 Answer

Sort by » oldest newest most voted

answered 2020-07-20 18:36:41 +0200

Lupp gravatar image

updated 2020-07-20 18:37:26 +0200

I don't know services or whatever giving direct access to such information.
The following is not a solution, but just a hint how I might start if i needed this.
Anyway it gave me the correct result for a printout in a test.

Sub printLengthOfSingleSelectedTextRangeIfInsideOneLine()
doc = ThisComponent
cCtrl = doc.CurrentController
rgs = doc.CurrentSelection
If NOT rgs.supportsService("com.sun.star.text.TextRanges") OR (rgs.Count<>1) Then Exit Sub
rg = rgs(0)
tx = rg.Text
tc = tx.createTextCursorByRange(rg.Start)
vc = cCtrl.ViewCursor
x1 = vc.Position.X : y1 = vc.Position.Y
tc.gotoRange(rg.End, False)
vc = cCtrl.ViewCursor
x2 = vc.Position.X : y2 = vc.Position.Y
If y2=y1 Then
  Print "x2-x1 = " & (x2-x1) & " * 0.01 mm supposedly in printer metric." 
  Print "Start and end of the text don't seem to be in the same line."
End If
End Sub
edit flag offensive delete link more


Thank you.

I will try to use this code to solve this problem.

Oleg.V.Melnichuk gravatar imageOleg.V.Melnichuk ( 2020-07-21 07:02:17 +0200 )edit

Thanks for the code, I think the issue is resolved - PrtSc.

Oleg.V.Melnichuk gravatar imageOleg.V.Melnichuk ( 2020-07-21 08:15:04 +0200 )edit
Login/Signup to Answer

Question Tools

1 follower


Asked: 2020-07-20 12:05:22 +0200

Seen: 99 times

Last updated: Jul 21 '20