Category:Scripts: Difference between revisions

From Scribus Wiki
Jump to navigation Jump to search
(→‎Full functional scripts: Added link to planner script)
 
(25 intermediate revisions by 3 users not shown)
Line 2: Line 2:
'''Other languages:''' [[:Category:Skrypty_i_wtyczki|Polski (pl)]] [[:Category:Scripts_e_Plugins|Portuguese (pt_BR)]]
'''Other languages:''' [[:Category:Skrypty_i_wtyczki|Polski (pl)]] [[:Category:Scripts_e_Plugins|Portuguese (pt_BR)]]
{{TOC right}}
{{TOC right}}
= Intro - a simple example =
Since version 1.6.0 Python 3 is supported by Scribus. Scribus commands may be executed by a script.
As a simple example  open from the script menu 'Show console', paste the following code and run the script.
<syntaxhighlight lang='python'>
import scribus
origX = 15
origY = 25
i = 0
boxHeight = 20
boxWidth = 50
endValueY = origY + 10 * boxHeight
for y in range(origY,endValueY,boxHeight):
    i = i + 1
    myFrame = "box"+str(i)
    scribus.createText(origX,y,boxWidth,boxHeight,myFrame)
    scribus.setLineColor("Black",myFrame)
    scribus.setText(str(i),myFrame)
    scribus.setFontSize(24,myFrame)
</syntaxhighlight>
Note that the first line of the code needs to be blank. The units given are in millimeters. This example uses four Scribus commands.
= Scripter =
= Scripter =


Line 13: Line 38:
* See example and other possible tags : [[Raw_Code_Download| Wikitext for Raw Code Download]]
* See example and other possible tags : [[Raw_Code_Download| Wikitext for Raw Code Download]]


Note : A new script engine is currently being integrated into Scribus. The next steps will be to get the script engine to work (should already be ok), get the editor to work, revise the structure of the API, add new functions to the API and mostly : port scripts to the new scripter. See [[Scripter Architecture|Scripter NG non-complete documentation about architecture]]
== Pure Python Functions ==


== Pure Python Functions ==


The open() function is a pure python function and does not involve any
The open() function is a pure python function and does not involve any
Line 21: Line 45:
names in python:
names in python:


- http://docs.python.org/tutorial/inputoutput.html
* http://docs.python.org/tutorial/inputoutput.html
- http://www.evanjones.ca/python-utf8.html
* http://www.evanjones.ca/python-utf8.html
- http://boodebr.org/main/python/all-about-python-and-unicode
* http://boodebr.org/main/python/all-about-python-and-unicode


The string returned by the Scribus fileDialog() function is always Unicode UTF-8 encoded.
The string returned by the Scribus fileDialog() function is always Unicode UTF-8 encoded.
Line 30: Line 54:
This is up to you to handle python exceptions, Scribus cannot do that in your place
This is up to you to handle python exceptions, Scribus cannot do that in your place


== Script snippets ==


<div style="border:2px solid lightgrey;padding:2px">Needs some snippets</div>


==Script Template==
Here is a '''script template''' with all setups. Use it as a ''starting point'' for writing your own script, fill in your application specific code.
[[Scripter/Snippet/Main| script template main()]]. There is also a template called [[boilerplate.py]] within Scribus Script directory.
You might also check out [[scriptmaker.py]], a Python script to run outside of Scribus to make the beginnings of a script that only runs inside of Scribus!
==[[Troubleshooting Scripts]]==
The content is on another page, since this one has gotten a bit out of control in terms of its size.
== Building blocks / snippets==
This section contains snippets you can use to create your own scripts.
This section contains snippets you can use to create your own scripts.


It features:
<div style="border:2px solid lightgrey;padding:2px">ToDo: Add some more snippets</div>
 
* reading a file
* reading a file
* updating a status bar
* updating a status bar
Line 43: Line 74:
* pausing the screen update
* pausing the screen update


===Script Template===
Here is a '''script template''' with all setups. Use it as a ''starting point'' for writing your own script, fill in your application specific code.
[[Scripter/Snippet/Main| script template main()]]. There is also a template called [[boilerplate.py]] within Scribus Script directory.


You might also check out [[scriptmaker.py]], a Python script to run outside of Scribus to make the beginnings of a script that only runs inside of Scribus!
===Get page parameters===
<syntaxhighlight lang='python'>
pageHeight = getPageSize()[0]
pageWidth = getPageSize()[1]
 
pageMargins = getPageMargins()
marginTop = pageMargins[0]
marginLeft = pageMargins[1]
marginRight = pageMargins[2]
marginBottom = pageMargins[3]
 
printableAreaHeight = pageHeight - marginTop - marginBottom
printableAreaWidth = pageWidth - marginLeft - marginRight
 
print("pageHeight=",pageHeight)
print("pageWidth=",pageWidth)
print("marginTop=",marginTop)
print("marginLeft=",marginLeft)
print("marginRight=",marginRight)
print("printableAreaHeight=",printableAreaHeight)
print("printableAreaWidth=",printableAreaWidth)
</syntaxhighlight>


==[[Troubleshooting Scripts]]==
The content is on another page, since this one has gotten a bit out of control in terms of its size.
===Iterate over all elements on a page===
===Iterate over all elements on a page===
<syntaxhighlight lang='python'>
<syntaxhighlight lang='python'>
Line 91: Line 138:




== Get some text frame page number===
=== Get some text frame page number===


Q : I know the object name of the frame, and from Python I want to find its page number.
Parsing the document's .sla file (which is just XML), here's the baseic gist to get the page number for a frame named "foo":
 
A : Parse the document's .sla file (which is just XML). Here's the basic gist to get the page number for a frame named "foo":


<syntaxhighlight lang='python'>
<syntaxhighlight lang='python'>
Line 113: Line 158:


From Scribus User http://meiradarocha.jor.br  Mailinglist Feb. 2012
From Scribus User http://meiradarocha.jor.br  Mailinglist Feb. 2012
 
This script needs to be updated for 1.6.n.
The output for this script is collected in [[Automatic Scripter Commands list]].
The output for this script is collected in [[Automatic Scripter Commands list]].


Line 144: Line 189:


==[[Beginners Scripts]]==
==[[Beginners Scripts]]==
This content has been moved to a separate page to reduce the enormity of this one.
More than 30 scripts  have been moved to a separate page to reduce the size of this one: [[Beginners Scripts]]


==Basic scripts==
==Basic scripts==
Line 174: Line 219:
* [[Scribus_Generator|Scribus Generator]] Extend Scribus with Mail Merge functionality
* [[Scribus_Generator|Scribus Generator]] Extend Scribus with Mail Merge functionality
|
|
* [[Calendar]]
* [[CalendarWizard]]
* [[CalendarWizard]]
* [[Year-Calendar-Script]]
* [[Planner]]
* [[Image crop, resize and CMYK conversion. Save and reload in TIFF format]]
* [[Image crop, resize and CMYK conversion. Save and reload in TIFF format]]
* [[Image crop, resize and color conversion GUI]]
* [[Image crop, resize and color conversion GUI]]
Line 181: Line 229:
* [[Automatic story formatting]]
* [[Automatic story formatting]]
* [[Clean-up the imported text based on the Slovak typographic rules]]
* [[Clean-up the imported text based on the Slovak typographic rules]]
* [[Import any Pandoc-readable format]]
|}
|}


Line 190: Line 239:


* [https://github.com/JLuc/scribus-project-manager Project manager] : create a book out of several parts documents, manage common format and styles, search across parts...
* [https://github.com/JLuc/scribus-project-manager Project manager] : create a book out of several parts documents, manage common format and styles, search across parts...
== New scripter engine ==
A new script engine is currently being integrated into Scribus.
A plan how the new API could look like is here: https://scribus-scripter.readthedocs.io/en/latest/ (referring to version 1.5).
The next steps will be to get the script engine to work. This has not been made active as of Scribus version 1.6.4.


== Extension scripts and PyQt ==
== Extension scripts and PyQt ==


* [[Extension script discussion]]
* [[Extension script discussion]] (outdated)
* [[Experimental PyQt projects]]
* [[Experimental PyQt projects]] (outdated)


== Python issues ==
== Python issues ==


* [[Known Scripter Issues]]
* [[Known Scripter Issues]] (outdated)


= Other =
= Other =
* [[Extension_script_repository ]]
* Alessandro Rimoldi's script repository [https://github.com/aoloe/scribus-script-repository]
* [[Web optimised PDF]] &mdash; learn how to minimize PDF size, make your life easier with the included Perl script (runs outside of Scribus)
* [[Web optimised PDF]] &mdash; learn how to minimize PDF size, make your life easier with the included Perl script (runs outside of Scribus)
* [[Imagemagick Imposition]] &ndash; a bash script doing simple imposition of PNG files exported from Scribus
* [[Imagemagick Imposition]] &ndash; a bash script doing simple imposition of PNG files exported from Scribus
Line 207: Line 261:
* [[Using createParagraphStyle]]
* [[Using createParagraphStyle]]
* [[Text and Text Manipulation]]
* [[Text and Text Manipulation]]
* Alessandro Rimoldi's blog series on scripter functions - [http://www.graphicslab.org/Blog/Blog a_l_e's blog]
* Alessandro Rimoldi's blog series on scripter functions - [http://www.graphicslab.org/Blog/Blog a_l_e's blog] (currently being rebuilt)
* [[Windows Full Python Integration]]
* [[Windows Full Python Integration]]

Latest revision as of 11:43, 7 August 2025

Other languages: Polski (pl) Portuguese (pt_BR)

Intro - a simple example

Since version 1.6.0 Python 3 is supported by Scribus. Scribus commands may be executed by a script.

As a simple example open from the script menu 'Show console', paste the following code and run the script.

import scribus
origX = 15
origY = 25
i = 0
boxHeight = 20
boxWidth = 50
endValueY = origY + 10 * boxHeight
for y in range(origY,endValueY,boxHeight):
    i = i + 1
    myFrame = "box"+str(i)
    scribus.createText(origX,y,boxWidth,boxHeight,myFrame)
    scribus.setLineColor("Black",myFrame)
    scribus.setText(str(i),myFrame)
    scribus.setFontSize(24,myFrame)

Note that the first line of the code needs to be blank. The units given are in millimeters. This example uses four Scribus commands.

Scripter

Here is documentation about the current scripting component in Scribus:

  • Scripter API -- Routines which can be used in scripts to control Scribus
  • Databases -- Scripts can interact with database software like MySQL or SQLite

This wiki is capable of letting users download raw code embedded into the pages and have it appear syntax highlighted.

  • So as to cite python script code with proper syntax hilight, use the following tag <syntaxhighlight lang='python'> instead of using the usual HTML tag <pre>.
  • See example and other possible tags : Wikitext for Raw Code Download

Pure Python Functions

The open() function is a pure python function and does not involve any Scribus code. Here are some pages with advices on how to handle unicode file names in python:

The string returned by the Scribus fileDialog() function is always Unicode UTF-8 encoded.

If file is not closed after python error within Scribus: This is up to you to handle python exceptions, Scribus cannot do that in your place


Script Template

Here is a script template with all setups. Use it as a starting point for writing your own script, fill in your application specific code. script template main(). There is also a template called boilerplate.py within Scribus Script directory.

You might also check out scriptmaker.py, a Python script to run outside of Scribus to make the beginnings of a script that only runs inside of Scribus!

Troubleshooting Scripts

The content is on another page, since this one has gotten a bit out of control in terms of its size.

Building blocks / snippets

This section contains snippets you can use to create your own scripts.

ToDo: Add some more snippets
  • reading a file
  • updating a status bar
  • selecting a frame
  • pausing the screen update


Get page parameters

pageHeight = getPageSize()[0]
pageWidth = getPageSize()[1]

pageMargins = getPageMargins()
marginTop = pageMargins[0]
marginLeft = pageMargins[1]
marginRight = pageMargins[2]
marginBottom = pageMargins[3]

printableAreaHeight = pageHeight - marginTop - marginBottom
printableAreaWidth = pageWidth - marginLeft - marginRight

print("pageHeight=",pageHeight)
print("pageWidth=",pageWidth)
print("marginTop=",marginTop)
print("marginLeft=",marginLeft)
print("marginRight=",marginRight)
print("printableAreaHeight=",printableAreaHeight)
print("printableAreaWidth=",printableAreaWidth)

Iterate over all elements on a page

page = 1
pagenum = scribus.pageCount()
content = []
while (page <= pagenum):
    scribus.gotoPage(page)
    d = scribus.getPageItems()
    for item in d:
        // do something
    page += 1

Get content like text from a frame

content = []
d = scribus.getPageItems()
for item in d:
    if (item[1] == 4):
        contents = scribus.getAllText(item[0])
        if (contents in content):
            contents = 'Duplication, perhaps linked-to frame'
            content.append(contents)
        elif (item[1] == 2):
            imgname = scribus.getImageFile(item[0])

ITEM TYPE

  • ItemType1 = 1,
  • ImageFrame = 2,
  • ItemType3 = 3,
  • TextFrame = 4,
  • Line = 5,
  • Polygon = 6,
  • PolyLine = 7,
  • PathText = 8,
  • LatexFrame = 9,
  • Multiple = 99


Get some text frame page number

Parsing the document's .sla file (which is just XML), here's the baseic gist to get the page number for a frame named "foo":

import xml.etree.ElementTree as ET
tree = ET.parse(scribus.getDocName()) # in a real script
# tree = ET.parse(getDocName())       # in the console
root = tree.getroot()
frame = "foo"
element = root.find(f'./DOCUMENT/PAGEOBJECT[@ANNAME="{frame}"]')
page_number = element.get("OwnPage")

For this to work, the object has to manually have been given a name, not just leaving the auto-generated one, otherwise it's not stored in the .sla file.

Auto-Output all Scripter Commands

From Scribus User http://meiradarocha.jor.br Mailinglist Feb. 2012 This script needs to be updated for 1.6.n. The output for this script is collected in Automatic Scripter Commands list.

d = dir(scribus)
for j in d:
   try:
       exec 'res = '+j+'.__doc__'
       if res[0:5] == 'float':
           print '\nCONSTANT:\n',j,'\nVALUE: float'
           exec 'print '+j+'\n'
       elif res[0:5] == 'int(x':
           print '\nCONSTANT:\n',j,'\nVALUE: integer'
           exec 'print '+j+'\n'
       elif res[0:5] == 'tuple':
           print '\nTUPLE:\n',j,'\nVALUE:'
           exec 'print repr('+j+')\n'
       elif res[0:4] == 'str(':
           print '\nSTRING:\n',j,'\nVALUE:'
           exec 'print repr('+j+')\n'
       else:
           print '\nFUNCTION:\n'+j+'\n\nSYNTAX:'
           print res
   except: pass

Image Manipulation

  • Objects: Images -- Example Scripts that manipulate images in a Scribus document

Beginners Scripts

More than 30 scripts have been moved to a separate page to reduce the size of this one: Beginners Scripts

Basic scripts

Scripts which give you ideas how you can solve your tasks.

Full functional scripts

Scripts that are ready for achieving specific tasks

Scripting new Scribus' functions

Scripts which sketch new features which may be included in future releases of Scribus

  • Project manager : create a book out of several parts documents, manage common format and styles, search across parts...

New scripter engine

A new script engine is currently being integrated into Scribus. A plan how the new API could look like is here: https://scribus-scripter.readthedocs.io/en/latest/ (referring to version 1.5). The next steps will be to get the script engine to work. This has not been made active as of Scribus version 1.6.4.

Extension scripts and PyQt

Python issues

Other

Pages in category "Scripts"

The following 102 pages are in this category, out of 102 total.