Scribus中的Python脚本入门

在上一篇文章“ 使用此温度转换脚本学习Perl”中 ,我向读者介绍了Perl脚本。 当我第一次开始使用Scribus(一种桌面发布(DTP)应用程序,用于创建要以印刷或在线发布的PDF格式)时,Perl是我最熟悉的脚本语言,甚至尝试将其与Scribus一起使用。 有一次我制作了一个Perl脚本,它将从头开始以Scribus格式(SLA)生成文件。 尽管肯定可行,但实际上并没有太多实际用途。

Scribus附带了一个名为Scripter的插件,该插件允许使用许多内部Python命令在Scribus中执行各种分析,创建和编辑操作,以及使用Python提供的所有其他功能。 正如我在有关Perl入门的文章中所提倡的那样,我首先查看了Python附带的各种脚本,并来回引用了各种参考,并制作了在Scribus之外使用的各种脚本。 如果您不能使基本算法在Scribus之外以某种方式起作用,那么它肯定不会在其中起作用。

让我们从稍后可能在DTP设置中使用的基本实用工具开始。 这是一个名为date.py的简单脚本:



   
   
#!/usr/bin/env python
# -*- coding: utf-8  -*-

from datetime import date

today = date. today ( )
d = today. strftime ( "%A, %d %B %Y" )

print d

在顶部,我们有她的爆炸行( ,与Perl一样),但是这有点不同,使用/usr/bin/env查找当前的系统Python解释器。 下一个并不是绝对必要的,因为UTF-8是大多数Linux系统上的默认字符编码,但是它确实突出了我从Windows计算机复制的脚本修改此脚本时遇到的一个问题。 当我尝试运行此命令时,我不断收到错误消息,它找不到/usr/bin/env python^M 最终,我发现文件的编码是(如Windows中一样),尽管脚本中存在此行,但在行的末尾有回车符。 我要做的就是在文件上运行dos2unix

当我们谈到可执行行时,请注意,在Python中,这些行不是以分号结尾,而是以结尾。 另外,变量名也不能以特殊字符开头。 fromimport是Python命令; datetimedate是变量名。 在这种特定情况下, datetime指代该名称的Python模块,而date指代该模块中的特定函数。 没有此语句,基本的Python解释器将不了解该命令。 稍后,我们将看到这如何适用于Scribus。

我们的下一条语句today使用收集到的date.today()信息设置一个新变量。 Python在这里也特别注重语法。 today是在date执行的一项运算,其结果现在保存在today的变量today 。 从某种意义上说,这对我来说是不幸的变量命名,但同时表明Python将它们视为两个独立的实体,其语法结构对此做了澄清。

接下来,就像在Python中使用sprintf命令一样,我们为今天的日期设置输出的特殊格式: A是星期几, d是月份, B是月份, Y是年份。 因此,当我运行该脚本时,其输出为:


Thursday , 13 October 2016 

看看格式中的逗号如何传递到输出? 您可以查找datetime模块,以查看格式化的选项。

作为一个独立的脚本,考虑到我可以随时从命令行运行date ,因此这是一个非常弱的脚本。 现在让我们考虑一下DTP和Scribus —例如,假设我们正在制作一份新闻通讯或其他期刊文档,希望在其上具有发布日期,也许在标题中。 从概念上讲,您只需运行此小脚本,就完成了。 除了我们关心的DTP中的许多设计问题之外。

桌面发布和页面设计

在Scribus之类的DTP程序中,默认情况下您没有任何要使用的东西。 在创建一个或打开一个已保存的文档之前,您没有文档。 当您打开一个新文档时,默认情况下它只有一页,除非您告诉它,否则它不会自动进行其他任何操作。 此外,页面只是工作的空间。 您不会开始在页面上打字或插入图片; 相反,您必须在框架环境中工作。 框架是您可以在其中输入文本,图像或其他图形(例如表格或图表)的空间,但是它们是唯一的-您不能在图像框架中输入文本,反之亦然。

使用脚本,或更具体地说是Scribus中的Scripter,您还必须使用这种环境。 我尝试在Scribus中使用脚本进行推广的一个一般规则是,当这是最有效的工作方式时,应使用图形环境,但是当您要执行重复的,乏味的或可能困难的任务时,则应使用脚本一些规律性。

重复性任务示例

让我们发明一个重复的任务,以便可以利用有关datetime的Python逻辑。 想象一下,我们有一个通讯,其中有一个模板,在标题中,我们有以下内容:

OpenSource Gazette sample banner with date

从结构上讲,这是一个文本框架,具有一定的尺寸,并在页面上具有特定的X,Y位置,并带有两点宽的黑色边框。 文本居中,第一行是20点Fontin Bold,第二行是14点Fontin Regular,具有自动行距,并且在顶部增加了9个空格(在Scribus中称为“ Distance”)。我们的脚本任务,我们只想更新日期,因此我们将使用其中包含此框架的现有文档。

我们创建了脚本,打开文档,运行脚本,然后完成了,但是请稍等。 Scripter如何知道要处理哪个页面元素? 与Scripter之外的Scribus一样,您必须在当前页面上选择一个项目才能开始工作(如果您不制作新元素)。

让我们提出一个操作列表:

  1. 识别选定的框架。 (是否已选中?是文本框吗?)
  2. 清除所有文本,或仅清除日期。
  3. 创建要输入的新日期,然后在正确的位置输入框架。
  4. 确保使用正确的字体,字体大小和对齐方式。

这是我们最终想出的(不要让它的大小吓到您):



   
   
#!/usr/bin/env python
# -*- coding: utf-8  -*-
# gazette_date.py

try :
      import scribus
except ImportError :
      print "Unable to import the 'scribus' module. This script will only run within"
      print "the Python interpreter embedded in Scribus. Try Script->Execute Script."
      sys . exit ( 1 )

from datetime import date

if not scribus. haveDoc ( ) :
     scribus. messageBox ( 'Scribus - Script Error' , "No document open" , scribus. ICON_WARNING , scribus. BUTTON_OK )
      sys . exit ( 1 )

if scribus. selectionCount ( ) == 0 :
     scribus. messageBox ( 'Scribus - Script Error' ,
              "There is no object selected. \n Please select a text frame and try again." ,
             scribus. ICON_WARNING , scribus. BUTTON_OK )
      sys . exit ( 2 )
if scribus. selectionCount ( ) > 1 :
     scribus. messageBox ( 'Scribus - Script Error' ,
              "You have more than one object selected. \n Please select one text frame and try again." ,
             scribus. ICON_WARNING , scribus. BUTTON_OK )
      sys . exit ( 2 )
textbox = scribus. getSelectedObject ( )
ftype = scribus. getObjectType ( textbox )

if ( ftype != "TextFrame" ) :
     scribus. messageBox ( 'Scribus - Script Error' , "This is not a textframe. Try again." , scribus. ICON_WARNING , scribus. BUTTON_OK )
      sys . exit ( 2 )

today = date. today ( )
d = today. strftime ( "%A, %B %d, %Y" )
length = scribus. getTextLength ( )
scribus. selectText ( 19 , length- 19 , textbox )
scribus. deleteText ( textbox )
scribus. insertText ( d , - 1 , textbox )

length = scribus. getTextLength ( )
scribus. selectText ( 19 , length- 19 , textbox )
scribus. setFontSize ( 14.0 , textbox )

脚本说明

try:到最后一个sys.exit(2)都是错误检查样板,您可以轻松地从一个脚本复制到另一个脚本(或从其他人的脚本复制)。 你不必把所有这些错误检查在那里,如果你不介意你的脚本崩溃(直到你弄清楚你没有选择的对象,或者它不是一个文本框,等等)。 至少,您确实需要具有import scribus并且该脚本需要from datetime import date 。 这些检查的作用是提供有关脚本失败原因的反馈,即使对于您自己,这也是一件好事。

today = date.today()开始today = date.today()应该看起来很熟悉。 因为我们已经检查了这是一个选中的文本框架,所以我们可以在其上获取getTextLength() 。 我们必须在scribus以便Python知道这是Scripter命令。 我们将使用该文本长度从框架中有选择地删除日期。 我们不知道日期中将有多少个字符,但是我们知道这是总数减去第一行中的数字。 在Scribus中,对selectText()命令的字符计数从0开始,并且您必须计算在第一行末尾隐含的\n ,这就是我想出19作为第二行的第一个字符的方式。

我以为我会很幸运,可以在insertText()命令之后完成操作,因为旧文本消失了,新文本就在那里了,具有正确的字体,并且居中,但是字体大小为16pt。 我对此没有很好的解释,因为我曾尝试在原始版本中多次重新键入; 在换行到下一个过渡的过程中,磅值已更改。 最简单的答案是在重新检查textLength()setFontSize()以修复后重新选择日期。 确实不错。

保存脚本后,选择的编剧 | 在Scribus菜单中执行脚本以查找您的脚本并运行它。 如果您最近运行脚本,它会出现在脚本编写者 | 最近的脚本列表。

故障排除

可以肯定的是,该脚本并没有做什么用,但应该可以帮助您掌握在Scribus中使用Python的过渡。 通常,我会慢慢构建脚本,逐步实现目标,直到获得所需的最终结果。

有时,当您执行了一系列操作后,您将无法确定正在发生的事情。 例如,如果耐心地计数字符不起作用怎么办? 我经常使用messageBox()命令作为故障排除工具。 在以length开头的任何一行之后,我们可以插入以下内容(全部插入一行):



   
   
scribus. messageBox ( 'Length Value' ,
              "Text length is " + str ( length ) , scribus. ICON_NONE , scribus. BUTTON_OK )

脚本到达这一点时,它将暂停以显示此消息,然后在单击“ 确定”按钮后继续执行。 请注意,与Perl相比,您必须将整数length转换为字符串以将其与前面的文本组合在一起。 如果您在valueDialog()命令中请求用户输入,则会发生相反的情况。 始终将其视为字符串,因此,如果要将其用作数字,则必须使用int()float()

Scribus中包含有关Scripter命令的文档,并且您还可以在Wiki上找到许多脚本来查看和借鉴。

翻译自: https://opensource.com/life/16/10/python-scripting-scribus

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值