Mit Scripten lässt sich Scribus fast beliebig erweitern, Sie könnten beispielsweise…
Scripte in Scribus werden in der Programmiersprache Python (Version 2) geschrieben und kommunizieren über das Modul scribus
mit Scribus, sodass die Fähigkeiten und Vorteile von Python (Syntax, Dateizugriff, Datenbank-APIs usw.) in Kombination mit denen von Scribus genutzt werden können. Auf diesen Seiten wird lediglich diese Scripter-API erläutert und dokumentiert, allerdings nicht, wie man in Python programmiert – hierfür gibt es bereits eine Vielzahl von freien Tutorials im Web, sodass wir an dieser Stelle auf die Neuerfindung des Rades verzichten.
scribus.py
abzulegen, da der Interpreter beim nächsten Ausführen dann das als scribus.pyc
kompilierte scribus.py
als Modul scribus
lädt anstatt das des Programms Scribus!
Wenn sie ein Skript ausführen möchten, öffnen sie es in Scribus über den Menüpunkt Script → Script ausführen…
#!/usr/bin/env Python # -*- coding: utf-8 -*-
Die erste Zeile legt fest, dass es sich um ein Python-Programm handelt und wird eigentlich nur benötigt, wenn man das Script stand-alone also außerhalb von Scribus ausführt und kann daher in Python-Scripten für Scribus weggelassen werden.
Als nächstes legen wir die richtige Zeichenkodierung fest. Da der Standard in Python ASCII ist, sollten wir direkt das bessere UTF-8 wählen, um keine Probleme mit ä, ö und ähnlichen nicht-ASCII-Zeihen zu bekommen.
Weitere mögliche Werte für die Codierung sind ascii
und latin-1
, allerdings macht es durchaus Sinn, nur noch UTF-8 zu verwenden, da dies heutzutage Standard ist und man sich so am wenigsten Probleme mit der Kompatibilität einhandelt. Das Skript muss dann natürlich im Texteditor auch UTF-8-kodiert abgespeichert werden.
# -*- coding: utf-8 -*- import scribus # Wenn kein Dokument geöffnet ist, Dialog zum Erstellen eines neuen Dokuments anzeigen: if scribus.haveDoc() == False: scribus.newDocDialog() # Textrahmen erzeugen: (x-Position, y-Postition, Breite, Höhe) name_des_rahmens = scribus.createText(30, 50, 80, 20) # ... mit Text füllen ... scribus.setText('Blabla', name_des_rahmens) # ... Textfarbe festlegen .... scribus.setTextColor('Red', name_des_rahmens) # ... und zuletzt Größe festlegen scribus.setFontSize(20, name_des_rahmens) # alternativ Absatzstil festlegen (Stil muss natürlich angelegt sein!) -> zum Ausführen Komentarzeichen # entfernen! #scribus.setStyle('BeispielStil', name_des_rahmens)
Dieses Skript fragt als erstes mit einer if
-Bedingung ab, ob bereits ein Dokument geöffnet ist und zeigt den Dialog zum Erstellen an, falls nicht. Anschließend legt es einen Textrahmen an, füllt ihn mit Text, legt eine Textfarbe und Schriftgröße fest. Als Alternative dazu können Sie Scribus auch einfach einen Absatzstil darauf anwenden lassen (dieser muss allerdings existieren!).
Noch ein paar Anmerkungen zu den Maßeinheiten:
Wenn Sie in Scripten Längenangaben verwenden, werden diese immer in der Einheit des Dokuments interpretiert – erstellen Sie also ein Script und arbeiten immer mit Millimetern, funktioniert alles wie erwartet; wenn Sie das Script allerdings auf ein Dokument in der Maßeinheit Punkt anwenden, passen die Angaben allerdings nicht mehr. Die Lösung ist einfach: Am Anfang des Programms speichern sie die voreingestellte Maßeinheit in einer Variablen, setzen ihre Maßeinheit, führen Ihre Manipulationen am Dokument aus und setzen dann am Schluss die Maßeinheit wieder auf den vorherigen Wert zurück:
# -*- coding: utf-8 -*- import scribus # Maßeinheit auslesen: masseinheit = scribus.getUnit() scribus.messageBox('Maßeinheit', 'Die aktuelle Maßeinheit ist '+str(masseinheit), scribus.ICON_INFORMATION) # Ihre Maßeinheit setzen, z. B. Zentimeter: scribus.setUnit(scribus.UNIT_CM) # Manipulationen am Dokument mit Angaben in Zentimetern, wir zeigen einfach die aktuelle Maßeinheit an: scribus.messageBox('Maßeinheit', 'Die aktuelle Maßeinheit ist '+str(scribus.getUnit()), scribus.ICON_INFORMATION) # Wieder ursprüngliche Maßeinheit einsetzen: scribus.setUnit(masseinheit) scribus.messageBox('Maßeinheit', 'Die aktuelle Maßeinheit ist '+str(scribus.getUnit()), scribus.ICON_INFORMATION)
Nach jedem Schritt lassen wir uns die Maßeinheit anzeigen, wobei wir beobachten können, dass Scribus die Einheiten als Zahlen zurückgibt, beispielsweise steht 4 für Zentimeter.
In diesem Beispiel wählen Sie ein Textfeld aus und führen dann ein Skript aus, das an den Text das aktuelle Datum und die Uhrzeit anfügt (deshalb auch insertText('Text', -1)
(-1 für das Anhängen, sonst Positionsangabe im Text) statt setText
wie im zweiten Beispiel, letzteres würde bereits vorhandenen Text ersetzen).
# -*- coding: utf-8 -*- import scribus import datetime anzahl = scribus.selectionCount() if anzahl == 0: scribus.messageBox('Textrahmen auswählen', 'Es wurde kein Textrahmen ausgewählt, bitte wählen Sie einen aus und führen das Skript erneut aus!', scribus.ICON_INFORMATION) if anzahl == 1: zeit = datetime.datetime.now() scribus.insertText('\n'+zeit.strftime("→ %Y-%m-%d %H:%M"), -1) if anzahl > 1: scribus.messageBox('Textrahmen auswählen', 'Es wurden mehrere Objekte ('+str(anzahl)+') ausgewählt, bitte wählen Sie <b>einen Textrahmen</b> aus und führen das Skript erneut aus!', scribus.ICON_INFORMATION)
Indem wir mit einer while
-Schleife über alle ausgewählten Objekte iterieren, können wir das Ganze natürlich auch für mehrere ausgewählte Textrahmen durchführen und an alle das aktuelle Datum anhängen:
# -*- coding: utf-8 -*- import scribus import datetime anzahl = scribus.selectionCount() if anzahl == 0: scribus.messageBox('Textrahmen auswählen', 'Es wurde kein Textrahmen ausgewählt, bitte wählen Sie welche aus und führen das Skript erneut aus!', scribus.ICON_INFORMATION) if anzahl > 0: zeit = datetime.datetime.now() count = 0 while count < anzahl: objekt = scribus.getSelectedObject(count) count = count + 1 scribus.insertText('\n'+zeit.strftime("→ %Y-%m-%d %H:%M"), -1, objekt)
Indem man mit einer for
-Schleife über mehrere (ausgewählte) Objekte iteriert, lassen sich Operationen, die auf viele Objekte angewendet werden müssen, automatisieren. Im Beispiel wollen wir auf mehrere ausgewählte Textrahmen einen Absatzstil mittels setStyle anwenden, was über die Eigenschaften-Palette nicht möglich ist:
# -*- coding: utf-8 -*- import scribus anzahl = scribus.selectionCount() if anzahl >= 1: for i in xrange(0, anzahl): scribus.selectObject(scribus.getSelectedObject(i)) scribus.setStyle("BeispielStil") #Namen anzeigen, falls benötigt... #scribus.messageBox("", str(i)+"=>"+scribus.getSelectedObject(i)) else: scribus.messageBox("Keine Objekte ausgewählt", "Es wurden keine Objekte ausgewählt, bitte wählen sie welche aus!", scribus.ICON_WARNING)
#!/usr/bin/env Python # -*- coding: utf-8 -*- import sys try: import scribus except ImportError: print "Dieses Skript ist ein Script für Scribus und kann nur innerhalb von Scribus ausgeführt werden." sys.exit(1) # Das eigentliche Programm: scribus.messageBox("Titel", "Hallo Welt!")
Dieses Skript beendet sich, wenn es nicht innerhalb von Scribus läuft. Alternativ kann man auch Skripte schreiben, die sowohl innerhalb von Scribus als auch von der Kommandozeile aus laufen.
Einige Funktionen sind erst ab einer bestimmten Scribus-Version verfügbar, beispielsweise der applyMasterPage()-Befehl. Um dem Nutzer eine verständliche Fehlermeldung an die Hand geben zu können, wenn man sich auf diese Funktionen verlässt, kann man die Scribus-Version abfragen und vergleichen:
# -*- coding: utf-8 -*- import sys, scribus if scribus.scribus_version_info[:3] < (1,4,6): scribus.messageBox("Alte Scribus-Version", "Dieses Skript erfordert Scribus 1.4.6 oder höher. Sie verwenden allerdings noch <em>"+str(scribus.scribus_version)+"</em>.", scribus.ICON_CRITICAL) sys.exit() # Das eigentliche Programm: scribus.messageBox("Alles ist gut!", "Sie verwenden eine aktuelle Version von Scribus!")