Adjust a text frame to fit its content
Jump to navigation
Jump to search
adjust the size of existing text frames
#!/usr/bin/env python """ this script adjust the height of a text frame to exactly fit its content, but not be longer than the page margin @author: alessandro rimoldi @version: 1.0 / 20090131 @copyright (c) 2009 alessandro rimoldi under the mit license http://www.opensource.org/licenses/mit-license.html """ import sys try: import scribus except ImportError: print "This script only works from within Scribus" sys.exit(1) # check that the selection is one text frame and get that frame frame_n = scribus.selectionCount() if frame_n == 0 : scribus.messageBox('Error:', 'No frame selected'); sys.exit(1) elif frame_n > 1 : scribus.messageBox('Error:', 'You may select only one frame'); sys.exit(1) frame = scribus.getSelectedObject(0) try: char_n = scribus.getTextLength(frame) except scribus.WrongFrameTypeError: scribus.messageBox('Error:', 'You may only adjust text frames'); sys.exit(1) if char_n == 0 : scribus.messageBox('Error:', 'You can\'t adjust an empty frame'); sys.exit(1) # get some page and frame measure (x, ph) = scribus.getPageSize(); (x, x, x, pm) = scribus.getPageMargins(); # warning: gets the margins from document setup not for the current page (x, y) = scribus.getPosition(frame) bottom = (ph - pm) - y (w, h) = scribus.getSize(frame) # if the frame doesn't overflow, shorten it to make it overflow while (((scribus.textOverflows(frame) == 0) or (h > bottom)) and (h > 0)) : h -= 10 scribus.sizeObject(w, h, frame) # resize the frame in 10pt steps while ((scribus.textOverflows(frame) > 0) and (h < bottom)) : h += 10 scribus.sizeObject(w, h, frame) # undo the latest 10pt step and fine adjust in 1pt steps h -= 10 scribus.sizeObject(w, h, frame) while ((scribus.textOverflows(frame) > 0) and (h < bottom)) : h += 1 scribus.sizeObject(w, h, frame)
Comments
Adjusting the frame horizontally
It's easy to do for a one-line frame. But what use cases do *you* see for an horizontal automatic correction?
"ein Text hat, anders als ein Bild keine Dimensionen. Wenn man ihn automatisch anpassen will, muß man die Schrift, die Schriftgröße, ggf. andere Einstellungen wie Silbentrennung, Kerning, Randausgleich berücksichtigen. Das mindeste,was man tun muß, ist, dem Anwender die Wahl zu lassen, in welche Richtung der Textrahmen angepaßt werden soll"
import a text at the right size
- read a text file
- filter it line by line
- put it in a frame
- fit the height of the frame to the length of its content
#!/usr/bin/env python import sys try: import scribus except ImportError: print "This script only works from within Scribus" sys.exit(1) # read the content of the file line by line into the text frame file_name = 'mytext.txt' file_name = 'abc.txt' file = open(file_name, 'r') text = ""; for line in open(file_name, 'r') : if line != '\n': # put here some text handling/filtering text += unicode(line, 'iso-8859-2') # create a text frame and put the text into it x = 60 y = 100 w = 300 h = 10 frame = scribus.createText(x, y, w, h) scribus.setText(text, frame) # resize the frame in 10pt steps while (scribus.textOverflows(frame) > 0) : h += 10 scribus.sizeObject(w, h, frame) # undo the latest 10pt step and fine adjust in 1pt steps h -= 10 scribus.sizeObject(w, h, frame) while (scribus.textOverflows(frame) > 0) : h += 1 scribus.sizeObject(w, h, frame)
vertical align the content of a text frame
#!/usr/bin/python """ this script adjust the top and bottom distance of a text frame to exactly put its content in the middle of the frame @author: alessandro rimoldi @version: 1.0 / 20090209 @copyright (c) 2009 alessandro rimoldi under the mit license http://www.opensource.org/licenses/mit-license.html """ import sys try: import scribus except ImportError: print "This script only works from within Scribus" sys.exit(1) # check that the selection is one text frame and get that frame frame_n = scribus.selectionCount() if frame_n == 0 : scribus.messageBox('Error:', 'No frame selected'); sys.exit(1) elif frame_n > 1 : scribus.messageBox('Error:', 'You may select only one frame'); sys.exit(1) frame = scribus.getSelectedObject(0) try: char_n = scribus.getTextLength(frame) except scribus.WrongFrameTypeError: scribus.messageBox('Error:', 'You may only adjust text frames'); sys.exit(1) if char_n == 0 : scribus.messageBox('Error:', 'You can\'t adjust an empty frame'); sys.exit(1) if (scribus.textOverflows(frame) == 1) : scribus.messageBox('Error:', 'You can\' center a text which is overflowing'); sys.exit(1) # get some page and frame measure (x, y) = scribus.getPosition(frame) (w, h) = scribus.getSize(frame) original_height = h (dl, dr, dt, db) = scribus.getTextDistances(); scribus.setTextDistances(dl, dr, 0, 0); # if the frame doesn't overflow, shorten it to make it overflow while ((scribus.textOverflows(frame) == 0) and (h > 0)) : h -= 10 scribus.sizeObject(w, h, frame) # resize the frame in 10pt steps while (scribus.textOverflows(frame) > 0) : h += 10 scribus.sizeObject(w, h, frame) # undo the latest 10pt step and fine adjust in 1pt steps h -= 10 scribus.sizeObject(w, h, frame) while (scribus.textOverflows(frame) > 0) : h += 1 scribus.sizeObject(w, h, frame) scribus.sizeObject(w, original_height, frame) dt = (original_height - h) / 2 scribus.setTextDistances(dl, dr, dt, dt);