Shape#

此类仅适用于 PDF。

此类允许在 PDF 页面上创建相互连接的图形元素。其方法具有与相应的 Page 方法相同的含义和名称。

实际上,每个 Page 绘图方法都只是一个方便的包装器,它封装了 (1) 一个 shape 绘图方法,(2) Shape.finish() 方法,以及 (3) Shape.commit() 方法。对于页面文本插入,仅调用 Shape.commit() 方法。如果对页面执行许多绘图和文本操作,您应始终考虑使用 Shape 对象。

可以连续执行多个绘图方法,每个方法都会对一个绘图贡献。绘图完成后,必须调用 Shape.finish() 方法以应用颜色、虚线、宽度、变形及其他属性。

此类中的绘图方法(以及 Shape.insert_textbox())会记录它们覆盖的区域为一个矩形(Shape.rect)。此属性例如可用于设置 Page.cropbox_position

文本插入 Shape.insert_text()Shape.insert_textbox() 会隐式执行一次“finish”,因此只需调用 Shape.commit() 即可生效。因此,两者都包含用于控制颜色等属性的参数。

方法 / 属性

描述

Shape.commit()

更新页面内容

Shape.draw_bezier()

绘制三次贝塞尔曲线

Shape.draw_circle()

绘制以某点为圆心的圆

Shape.draw_curve()

使用一个辅助点绘制三次贝塞尔曲线

Shape.draw_line()

绘制直线

Shape.draw_oval()

绘制椭圆

Shape.draw_polyline()

连接一系列点

Shape.draw_quad()

绘制四边形

Shape.draw_rect()

绘制矩形

Shape.draw_sector()

绘制扇形或饼图块

Shape.draw_squiggle()

绘制波浪线

Shape.draw_zigzag()

绘制锯齿线

Shape.finish()

完成一组绘图命令

Shape.insert_text()

插入文本行

Shape.insert_textbox()

将文本放入矩形框内

Shape.doc

存储页面所属的文档

Shape.draw_cont

自上次 Shape.finish() 以来的绘图命令

Shape.height

存储页面的高度副本

Shape.lastPoint

存储当前点

Shape.page

存储所属页面

Shape.rect

围绕绘图的矩形

Shape.text_cont

累计的文本插入

Shape.totalcont

累积的字符串,将存储在 contents

Shape.width

存储页面的宽度副本

类 API

class Shape#
__init__(self, page)#

创建一个新的绘图。在导入 PyMuPDF 期间,会为 pymupdf.Page 对象添加便利方法 new_shape() 来构造 Shape 对象。实例化期间会检查我们是否拥有 PDF 页面。否则会引发异常。

参数:

page (Page) – PDF 文档中一个已存在的页面。

draw_line(p1, p2)#

point_like 对象 p1 绘制一条线到 p2

参数:
  • p1 (point_like) – 起始点

  • p2 (point_like) – 终点

返回类型:

Point

返回:

终点,p2

draw_squiggle(p1, p2, breadth=2)#

point_like 对象 p1 绘制一条波浪线(弯曲、起伏)到 p2。总是绘制整数个完整波周期,每个周期的长度为 4 * breadth。breadth 参数将根据需要进行调整以满足此条件。绘制的线离开 p1 时总是向“左”转,从“右”与 p2 连接。

参数:
  • p1 (point_like) – 起始点

  • p2 (point_like) – 终点

  • breadth (float) – 每个波的幅度。必须满足条件 2 * breadth < abs(p2 - p1) 才能容纳至少一个波。请看下图,它显示了由一个完整周期连接的两个点。

返回类型:

Point

返回:

终点,p2

_images/img-breadth.png

这是一个由三条连接的线组成的示例,形成了一个闭合、填充的三角形。小箭头表示描边方向。

>>> import pymupdf
>>> doc=pymupdf.open()
>>> page=doc.new_page()
>>> r = pymupdf.Rect(100, 100, 300, 200)
>>> shape=page.new_shape()
>>> shape.draw_squiggle(r.tl, r.tr)
>>> shape.draw_squiggle(r.tr, r.br)
>>> shape.draw_squiggle(r.br, r.tl)
>>> shape.finish(color=(0, 0, 1), fill=(1, 1, 0))
>>> shape.commit()
>>> doc.save("x.pdf")
_images/img-squiggly.png

注意

绘制的波浪不是三角函数(正弦/余弦)波。如果您需要,请查看 draw.py

draw_zigzag(p1, p2, breadth=2)#

point_like 对象 p1 绘制一条锯齿线到 p2。其他方面与 Shape.draw_squiggle() 完全相同。

参数:
  • p1 (point_like) – 起始点

  • p2 (point_like) – 终点

  • breadth (float) – 运动的幅度。必须满足条件 2 * breadth < abs(p2 - p1) 才能容纳至少一个周期。

返回类型:

Point

返回:

终点,p2

draw_polyline(points)#

在序列 points 中包含的点之间绘制多条连接的线。通过设置最后一个点等于第一个点,可以用于创建任意多边形。

参数:

points (sequence) – point_like 对象的序列。其长度必须至少为 2(此时等同于 draw_line())。

返回类型:

Point

返回:

points[-1] – 参数序列中的最后一个点。

draw_bezier(p1, p2, p3, p4)#

p1p4 绘制一条标准三次贝塞尔曲线,使用 p2p3 作为控制点。

所有参数都是 point_like 对象。

返回类型:

Point

返回:

终点,p4

注意

这些点不必都不同——可以尝试一下让其中一些点相等!

示例

_images/img-drawBezier.png
draw_oval(tetra)#

在给定的四边形(tetragon)内绘制一个“椭圆”。如果它是一个正方形,则绘制一个正圆;如果是普通的矩形,则会得到一个椭圆。如果使用任意四边形,可能会得到各种各样的形状。

绘图以逆时针方向,从 bottom-left -> top-left 角落线段的中间点开始和结束。

参数:

tetra (rect_like,quad_like) –

rect_likequad_like

版本 1.14.5 更改: 现在也支持 Quad。

返回类型:

Point

返回:

线段 rect.bl -> rect.tl 的中间点,或 quad.ll -> quad.ul 的中间点。这里只看几个示例,或者查看 PyMuPDF-Utilities 仓库中的 quad-show?.py 脚本。

_images/img-drawquad.jpg
draw_circle(center, radius)#

给定圆心和半径绘制一个圆。绘图以逆时针方向,从点 center - (radius, 0) 开始和结束。此点是外接正方形左边的中点。

这是 draw_sector(center, start, 360, fullSector=False) 的快捷方式。要以顺时针方向绘制同一个圆,请使用 -360 作为角度。

参数:
  • center (point_like) – 圆心。

  • radius (float) – 圆的半径。必须为正值。

返回类型:

Point

返回:

Point(center.x - radius, center.y).

_images/img-drawcircle.jpg

draw_curve(p1, p2, p3)#

draw_bezier() 的特例:从 p1 绘制一条三次贝塞尔曲线到 p3。在 p1 -> p2p3 -> p2 这两条线段上各生成一个控制点。因此,两个控制点将位于线段 p1 -> p3 的同一侧。这保证了曲线的曲率符号不会改变。如果指向 p2 的线段以 90 度角相交,则生成的曲线是一个四分之一椭圆(如果长度相等,则是一个四分之一圆)。

所有参数都是 point_like

返回类型:

Point

返回:

终点,p3。下图是一个填充的四分之一椭圆段。黄色区域方向为顺时针:

_images/img-drawCurve.png

draw_sector(center, point, angle, fullSector=True)#

绘制一个扇形,可选择将弧线连接到圆心(就像一块饼图)。

参数:
  • center (point_like) – 圆心。

  • point (point_like) – 饼图弧段的两个端点之一。另一个端点根据 angle 计算得出。

  • angle (float) – 扇形的角度,以度为单位。用于计算弧的另一个端点。根据其符号,弧线以逆时针(正值)或顺时针方向绘制。

  • fullSector (bool) – 是否绘制连接弧的两端到圆心的线。如果指定了填充颜色,则填充整个“饼图”,否则只填充扇形。

返回类型:

Point

返回:

弧的另一个端点。可用作后续调用的起始点,以创建逻辑上连接的饼图。示例

_images/img-drawSector1.png_images/img-drawSector2.png

draw_rect(rect, *, radius=None)#
  • 版本 v1.22.0 更改: 添加了参数 radius

绘制一个矩形。绘图以逆时针方向,从左上角开始和结束。

参数:
  • rect (rect_like) – 在页面上放置矩形的位置。

  • radius (multiple) – 绘制圆角矩形。如果不是 None,指定曲率半径为矩形边长的百分比。这必须是一个或(一个元组包含)两个浮点数 0 < radius <= 0.5,其中 0.5 对应于相应边长的 50%。如果是一个浮点数,曲率半径计算为 radius * min(width, height),将角落的周长绘制为四分之一圆。如果给定元组 (rx, ry),则曲率在水平和垂直方向上是不对称的。值为 radius=(0.5, 0.5) 时绘制椭圆。

返回类型:

Point

返回:

矩形的左上角。

draw_quad(quad)#

绘制一个四边形。绘图以逆时针方向,从左上角(Quad.ul)开始和结束。它是 Shape.draw_polyline() 的快捷方式,参数为 (ul, ll, lr, ur, ul)

参数:

quad (quad_like) – 在页面上放置四边形的位置。

返回类型:

Point

返回:

Quad.ul.

finish(width=1, color=(0,), fill=None, lineCap=0, lineJoin=0, dashes=None, closePath=True, even_odd=False, morph=(fixpoint, matrix), stroke_opacity=1, fill_opacity=1, oc=0)#

通过将通用参数应用于所有方法,完成一组 draw*() 方法。

它对 Shape.insert_text()Shape.insert_textbox() 无效

该方法还支持使用 Point fixpointMatrix matrix 对复合绘图进行变形

参数:
  • morph (sequence) – 通过应用 Matrix matrix,围绕任意 Point fixpoint 对文本或复合绘图进行变形。这意味着 fixpoint 是此操作的固定点:它不会改变其位置。默认为不变形 (None)。matrix 的前 4 个分量可以包含任意值,但必须满足 matrix.e == matrix.f == 0。这意味着任何缩放、剪切、旋转、翻转等的组合都是可能的,但平移是不可能的。

  • stroke_opacity (float) – (v1.18.1 新增) 设置描边颜色的透明度。小于 0 或大于 1 的值将被忽略。默认为 1(不透明)。

  • fill_opacity (float) – (v1.18.1 新增) 设置填充颜色的透明度。默认为 1(不透明)。

  • even_odd (bool) – 要求对填充操作使用“奇偶规则”。默认为 False,以便使用“非零绕数规则”。这些规则是应用于重叠区域的填充颜色的替代方法。只有对于相当复杂的形状,这些规则才会表现出不同的行为。有关详细解释,请参阅 Adobe PDF 参考,第 137 页及后续。这里有一个示例来演示差异。

  • oc (int) – (v1.18.4 新增) xref 值,用于指定一个 OCGOCMD,使此绘图可条件显示。

_images/img-even-odd.png

注意

对于形状中的每个像素,将发生以下情况

  1. “奇偶规则”计数有多少区域包含该像素。如果计数为奇数,则该像素被视为形状的内部;如果为偶数,则该像素在形状外部

  2. 默认规则“非零绕数”额外考虑包含该像素的每个区域的“方向”:如果区域以逆时针方向绘制,则加 1;如果以顺时针方向绘制,则减 1。如果结果为零,则该像素被视为外部;计数不为零的像素在形状内部

上图中的四个形状,上面两个各显示了以标准方式绘制的三个圆(逆时针,请看箭头)。下面两个形状包含一个(左上角)以顺时针方向绘制的圆。可以看出,区域方向与右列(奇偶规则)无关。

insert_text(point, text, *, fontsize=11, fontname='helv', fontfile=None, set_simple=False, encoding=TEXT_ENCODING_LATIN, color=None, lineheight=None, fill=None, render_mode=0, miter_limit=1, border_width=1, rotate=0, morph=None, stroke_opacity=1, fill_opacity=1, oc=0)#

point 开始插入文本行。

参数:
  • point (point_like) –

    text 第一个字符的像素级左下角位置。理解其与 rotate 参数如何协同工作非常重要。请看下图。小红点表示在四种可能情况下 point 的位置。

    _images/img-inserttext.jpg

  • text (str/sequence) – 要插入的文本。可以指定为字符串类型或序列类型。对于序列或包含换行符 \n 的字符串,将插入多行。不会考虑行是否过宽,但插入的行数将受到页面上“垂直”空间的限制(按 rotate 参数确定的阅读方向)。text 的任何剩余部分将被丢弃——但返回值包含已插入的行数。

  • lineheight (float) – 一个因子,用于覆盖根据字体属性计算的行高。如果不是 None,将使用 fontsize * lineheight 作为行高。

  • stroke_opacity (float) – (v1.18.1 新增) 设置描边颜色(字符的边框线)的透明度。只考虑 0 <= value <= 1 范围内的值。默认为 1(不透明)。

  • fill_opacity (float) – (v1.18.1 新增) 设置填充颜色的透明度。默认为 1(不透明)。使用此值控制文本颜色的透明度。描边不透明度影响字符的边框线。

  • rotate (int) – 确定是否旋转文本。可接受的值为 90 度的倍数。默认为 0(不旋转),表示文本行从左到右水平排列。180 表示文本从右到左倒置显示。90 表示逆时针旋转,文本向上运行。270(或 -90)表示顺时针旋转,文本向下运行。无论如何,point 指定第一个字符矩形的左下角坐标。如果有多行,它们总是遵循由此参数确定的阅读方向。因此,在 rotate = 180 的情况下,第 2 行位于第 1 行的上方,依此类推。

  • oc (int) – (v1.18.4 新增) xref 值,用于指定一个 OCGOCMD,使此文本可条件显示。

返回类型:

int

返回:

插入的行数。

其他参数的描述请参阅通用参数

insert_textbox(rect, buffer, *, fontsize=11, fontname='helv', fontfile=None, set_simple=False, encoding=TEXT_ENCODING_LATIN, color=None, fill=None, render_mode=0, miter_limit=1, border_width=1, expandtabs=8, align=TEXT_ALIGN_LEFT, rotate=0, lineheight=None, morph=None, stroke_opacity=1, fill_opacity=1, oc=0)#

仅限 PDF:将文本插入指定的矩形。文本将分割成行和单词,然后填充到可用空间中,从矩形四个角之一开始填充,具体取决于 rotate 参数。换行符和多个空格将被保留。

参数:
  • rect (rect_like) – 要使用的区域。它必须是有限的且非空。

  • buffer (str/sequence) – 要插入的文本。必须指定为字符串或字符串序列。在序列条目中出现的换行符也会被保留。

  • align (int) – 对齐每行文本。默认为 0(左对齐)。居中、右对齐和两端对齐是其他支持的选项,请参阅文本对齐。请注意,参数值 TEXT_ALIGN_JUSTIFY 的效果仅在使用“简单”(单字节)字体(包括PDF Base 14 字体)时才能实现。

  • lineheight (float) –

    一个因子,用于覆盖根据字体属性计算的行高。如果不是 None,将使用 fontsize * lineheight 作为行高。

    参数 int expandtabs:

    控制制表符 \t 的处理,使用 string.expandtabs() 方法,每行独立处理

  • stroke_opacity (float) – (v1.18.1 新增) 设置描边颜色的透明度。负值和大于 1 的值将被忽略。默认为 1(不透明)。

  • fill_opacity (float) – (v1.18.1 新增) 设置填充颜色的透明度。默认为 1(不透明)。使用此值控制文本颜色的透明度。描边不透明度影响字符的边框线。

  • rotate (int) – 要求在矩形内旋转文本。此值必须是 90 度的倍数。默认为 0(不旋转)。实际上,处理的值有 0, 90, 180270 (= -90),每个值都会使文本从矩形的不同角落开始填充。左下角是 90,右下角是 180,而 -90 / 270 是右上角。请参阅示例了解文本如何在矩形中填充。此参数优先于变形。请看第二个示例,它展示了文本先向左旋转 90 度,然后整个矩形围绕其左下角顺时针旋转。

  • oc (int) – (v1.18.4 新增) xref 值,用于指定一个 OCGOCMD,使此文本可条件显示。

返回类型:

float

返回:

如果为正值或零:执行成功。返回的值是矩形中未使用的行空间(以像素为单位)。可以安全地忽略此值——或用于优化矩形、定位后续项目等。

如果为负值:未执行。返回的值是存储文本行所需的空间不足。需要放大矩形、减小 fontsize、减少文本量等。

_images/img-rotate.png _images/img-rot%2Bmorph.png

其他参数的描述请参阅通用参数

commit(overlay=True)#

使用累积的绘图更新页面的 contents,后跟任何文本插入。如果文本与绘图重叠,文本将写在绘图之上。

警告

不要忘记执行此方法

如果一个形状未提交,它将被忽略,页面也不会被更改!

此方法将重置属性 Shape.rect, lastPoint, draw_cont, text_conttotalcont。之后,该 shape 对象可以为同一页面重复使用。

参数:

overlay (bool) – 确定是将内容放在前景(默认)还是背景。仅当页面已经有一个非空的 contents 对象时相关。

———- 属性 ———-

doc#

仅供参考:页面的文档。

类型:

Document

page#

仅供参考:所属页面。

类型:

Page

height#

页面高度的副本

类型:

float

width#

页面宽度的副本。

类型:

float

draw_cont#

自上次完成以来累积的绘图方法命令缓冲区。每个 finish 方法都会将其命令附加到 Shape.totalcont

类型:

str

text_cont#

累积的文本缓冲区。所有文本插入都在这里。此缓冲区将在 Shape.commit() 时附加到 totalcont,以便在同一 Shape 中文本永远不会被绘图覆盖。

类型:

str

rect#

围绕绘图的矩形。此属性可供您随时使用和更改。在创建或提交形状时,其值设置为 None。每个 draw* 方法和 Shape.insert_textbox() 都会更新此属性(即根据需要扩大矩形)。然而,变形操作(Shape.finish(), Shape.insert_textbox())会被忽略。

此属性的典型用法是在您为后续或外部使用创建形状时,将 Page.cropbox_position 设置为此值。如果您没有自己操作此属性,它应反映一个包含目前所有绘图的矩形。

如果您使用了变形,并且需要一个包含变形后对象的矩形,请使用以下代码

>>> # assuming ...
>>> morph = (point, matrix)
>>> # ... recalculate the shape rectangle like so:
>>> shape.rect = (shape.rect - pymupdf.Rect(point, point)) * ~matrix + pymupdf.Rect(point, point)
类型:

Rect

totalcont#

累积的总命令缓冲区,用于绘图和文本插入。这将由 Shape.commit() 使用。

类型:

str

lastPoint#

仅供参考:绘图路径的当前点。在创建 Shape 和每次调用 finish()commit() 后,其值为 None

类型:

Point

用法#

绘图对象通过 shape = page.new_shape() 构造。之后,可以根据需要调用任意数量的 draw、finish 和文本插入方法。每组连续的 draw 方法必须在提交绘图之前通过 finish 完成。整体编码模式如下所示

>>> shape = page.new_shape()
>>> shape.draw1(...)
>>> shape.draw2(...)
>>> ...
>>> shape.finish(width=..., color=..., fill=..., morph=...)
>>> shape.draw3(...)
>>> shape.draw4(...)
>>> ...
>>> shape.finish(width=..., color=..., fill=..., morph=...)
>>> ...
>>> shape.insert_text*
>>> ...
>>> shape.commit()
>>> ....

注意

  1. 每次调用 finish() 会将之前的 draw 方法组合成一个逻辑形状,并赋予其通用的颜色、线宽、变形等属性。如果指定了 closePath,它还会将最后一个 draw 的终点与第一个 draw 的起点连接起来。

  2. 要成功创建复合图形,请让每个 draw 方法使用前一个方法的终点作为其起始点。在上述伪代码中,draw2 因此应使用 draw1 返回的 Point 作为其起始点。如果未能这样做,将自动开始一个新的路径,并且 finish() 可能无法按预期工作(但也不会报错)。

  3. 文本插入可以在提交之前的任何位置发生(它们既不影响 Shape.draw_cont 也不影响 Shape.lastPoint)。它们直接附加到 Shape.totalcont,而 draw 方法则由 Shape.finish 附加。

  4. 每次 commit 会将所有文本插入和形状放置在页面的前景或背景——从而提供了一种控制图形图层的方式。

  5. 只有 commit 会更新页面的内容,其他方法基本上只是字符串操作。

示例#

  1. 创建由不同颜色饼图块组成的完整圆

    shape = page.new_shape()  # start a new shape
    cols = (...)  # a sequence of RGB color triples
    pieces = len(cols)  # number of pieces to draw
    beta = 360. / pieces  # angle of each piece of pie
    center = pymupdf.Point(...)  # center of the pie
    p0 = pymupdf.Point(...)  # starting point
    for i in range(pieces):
        p0 = shape.draw_sector(center, p0, beta,
                              fullSector=True) # draw piece
        # now fill it but do not connect ends of the arc
        shape.finish(fill=cols[i], closePath=False)
    shape.commit()  # update the page
    

这是 5 种颜色的示例

_images/img-cake.png
  1. 创建一个正 n 边形(填充黄色,红色边框)。我们仅使用 draw_sector() 来计算圆周上的点,并在绘制多边形之前再次清空绘图命令缓冲区。

    shape = page.new_shape() # start a new shape
    beta = -360.0 / n  # our angle, drawn clockwise
    center = pymupdf.Point(...)  # center of circle
    p0 = pymupdf.Point(...)  # start here (1st edge)
    points = [p0]  # store polygon edges
    for i in range(n):  # calculate the edges
        p0 = shape.draw_sector(center, p0, beta)
        points.append(p0)
    shape.draw_cont = ""  # do not draw the circle sectors
    shape.draw_polyline(points)  # draw the polygon
    shape.finish(color=(1,0,0), fill=(1,1,0), closePath=False)
    shape.commit()
    

这是 n = 7 的多边形

_images/img-7edges.png

通用参数#

fontname (str)

通常有三种选项

  1. 使用标准PDF Base 14 字体之一。在这种情况下,不得指定 fontfile,如果也省略此参数,则使用 “Helvetica”

  2. 选择页面中已使用的字体。然后指定其引用名称,前缀为斜杠“/”,见下方示例。

  3. 指定您系统上的字体文件。在这种情况下,为此参数选择一个任意但新的名称(不带“/”前缀)。

如果插入的文本应重用页面中的字体,请使用 Page.get_fonts() 中出现的引用名称,如下所示

假设字体列表包含项 [1024, 0, ‘Type1’, ‘NimbusMonL-Bold’, ‘R366’],则指定 fontname = “/R366”, fontfile = None 来使用字体 NimbusMonL-Bold


fontfile (str)

您计算机上存在的字体文件路径。如果您指定 fontfile,请确保使用的 fontname 未出现在上述列表中。这个新字体将在 doc.save() 时嵌入到 PDF 中。类似于新图像,字体文件只会嵌入一次。使用字体二进制内容的 MD5 代码表来确保这一点。


set_simple (bool)

默认情况下,从文件安装的字体安装为 Type0 字体。如果您只想使用 1 字节字符,请将其设置为 true。此设置无法恢复。后续更改将被忽略。


fontsize (float)

文本的字体大小,参阅: fontsize


dashes (str)

使线条以虚线绘制。通用格式是 "[n m] p",其中(最多)3 个浮点数表示像素长度。n 是虚线长度,m(可选)是后续间隙长度,p(“相位” - 必需,即使为 0!)指定在虚线开始前应跳过多少像素。如果省略 m,则默认为 n

使用 "[] 0"None"" 绘制连续线(无虚线)。示例

  • 指定 "[3 4] 0" 意味着虚线长 3 像素,间隙长 4 像素,交替出现。

  • "[3 3] 0""[3] 0" 的作用相同。

有关如何实现复杂虚线效果的(相当复杂的)详细信息,请参阅Adobe PDF 参考,第 217 页。


color / fill (list, tuple)

描边和填充颜色可以指定为介于 0 到 1 之间的浮点数元组或列表。这些序列的长度必须为 1(GRAY)、3(RGB)或 4(CMYK)。对于 GRAY 颜色空间,也接受单个浮点数,而不是笨重的 (float,)[float]。接受默认值或使用 None 表示不使用该参数。

为了简化颜色指定,可以使用 pymupdf.utils 中的 getColor() 方法按名称获取预定义的 RGB 颜色三元组。它接受一个字符串作为颜色名称并返回相应的三元组。该方法知道超过 540 个颜色名称——请参阅颜色数据库章节。

请注意,术语 color 在与填充颜色一起使用时通常表示“描边”颜色。

如果将颜色参数默认为 None,则不会生成相应的颜色选择命令。如果 fillcolor 都为 None,则绘图中将不包含颜色规范。但它仍然会被“描边”,这会导致 Adobe Acrobat 和所有其他查看器使用 PDF 的默认颜色“黑色”。


width (float)

形状中元素的描边(“边框”)宽度(如果适用)。默认值为 1。width、color 和 fill 的值具有以下关系/依赖性

  • 如果 fill=None,形状元素将始终绘制边框 - 即使 color=None(此时取黑色)或 width=0(此时取 1)。

  • 只有指定填充颜色(当然可以是白色)才能实现无边框的形状。要实现这一点,请指定 width=0。在这种情况下,将忽略 color 参数。


stroke_opacity / fill_opacity (floats)

这两个值都是 [0, 1] 范围内的浮点数。负值或大于 1 的值将被忽略(在大多数情况下)。两者都设置透明度,其中值 0.5 对应于 50% 透明度,0 表示不可见,1 表示不透明。例如,对于矩形,描边不透明度应用于其边框,填充不透明度应用于其内部。

对于文本插入(Shape.insert_text()Shape.insert_textbox()),文本使用 fill_opacity。乍一看可能令人惊讶,但当你进一步查看 render_mode 时就会明白:fill_opacity 应用于黄色部分,而 stroke_opacity 应用于蓝色部分。


border_width (float)

设置文本插入的边框宽度。v1.14.9 新增。仅当 render mode 参数使用的值大于零时相关。


render_mode (int)

版本 1.14.9 新增: range(8) 中的整数,用于控制文本外观(Shape.insert_text()Shape.insert_textbox())。请参阅Adobe PDF 参考第 246 页。v1.14.9 新增。这些方法现在也区分填充色和描边色。

  • 默认值为 0 时,仅使用文本填充色来绘制文本。为了向后兼容,使用 color 参数代替也有效。

  • 对于渲染模式 1,只绘制每个字形(即文本字符)的边框,厚度由参数 border_width 设置。使用 color 参数中选择的颜色,忽略 fill 参数。

  • 对于渲染模式 2,字形会被填充和描边,使用 color 和 fill 参数以及指定的 border width。您可以使用此值模拟粗体文本而无需使用另一种字体:为 fill 和 color 选择相同的值,并为 border_width 选择适当的值。

  • 对于渲染模式 3,字形既不描边也不填充:文本变得不可见。

以下示例使用 border_width=0.3 和 fontsize=15。描边颜色为蓝色,填充颜色为黄色。

_images/img-rendermode.jpg

miter_limit (float)

一个浮点数,指定商 miter-length / line-width(“斜接商”)的最大可接受值。用于文本输出方法。仅与非零的 render mode 值相关——此时,字符会绘制边框线(即“描边”)。

如果描绘某个字符的两条线以锐角(<= 90°)相交,并且线宽足够大,则可能会出现“尖角”——导致如下所示的不美观外观。更多背景信息,请参阅Adobe PDF 参考第 126 页。

例如,当连接处以 90° 相遇时,斜接长度是 sqrt(2) * line-width,因此斜接商是 sqrt(2)

如果超过 miter_limit,则所有具有较大商的连接处将显示为斜角(“平头”外观)。

默认值 1(以及任何更小的值)将确保所有连接处都渲染为平头。值为 None 将使用 PDF 默认值。

显示尖角的文本示例(miter_limit=None

_images/spikes-yes.png

抑制尖角的文本示例(miter_limit=1

_images/spikes-no.png

overlay (bool)

使项目出现在前景(默认)或背景。


morph (sequence)

导致通过 draw*() 方法创建的形状,或通过页面方法 insert_textbox() / insert_text() 插入的文本发生“变形”。如果不是 None,它必须是一个对 (fixpoint, matrix),其中 fixpoint 是一个 Pointmatrix 是一个 Matrix。matrix 可以是除平移之外的任何变换,即必须满足 matrix.e == matrix.f == 0。该点用作矩阵操作的固定点。例如,如果 matrix 是旋转或缩放,则 fixpoint 是其中心。类似地,如果 matrix 是左右或上下翻转,则镜像轴将是分别通过 fixpoint 的垂直线或水平线,等等。

注意

有几种方法包含检查要插入的项目是否实际适合页面(例如 Shape.insert_text()Shape.draw_rect())。然而,对于变形操作的结果,并没有这样的保证:这完全是程序员的责任。


lineCap (已弃用: “roundCap”) (int)

控制线段末端的样式。默认值 0 使每条线恰好在给定坐标处以尖角结束。值为 1 会在线段末端添加一个半圆,其圆心是终点,直径是线宽。值为 2 会添加一个半方形,其边长等于线宽,中心在线段末端。

版本 1.14.15 更改


lineJoin (int)

版本 1.14.15 新增: 控制线条连接处的样式。可以是尖角 (0)、圆角连接 (1) 或截断边缘 (2,“平头”)。


closePath (bool)

导致绘图的终点自动与起始点连接(通过一条直线)。


本软件按原样提供,不提供任何明示或暗示的保证。本软件根据许可协议分发,未经许可协议明确授权,不得复制、修改或分发。有关许可信息,请参阅 artifex.com,或联系 Artifex Software Inc., 39 Mesa Street, Suite 108A, San Francisco CA 94129, United States 获取更多信息。