Shape#
此类允许在 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()
即可生效。因此,两者都包含用于控制颜色等属性的参数。
方法 / 属性 |
描述 |
---|---|
更新页面内容 |
|
绘制三次贝塞尔曲线 |
|
绘制以某点为圆心的圆 |
|
使用一个辅助点绘制三次贝塞尔曲线 |
|
绘制直线 |
|
绘制椭圆 |
|
连接一系列点 |
|
绘制四边形 |
|
绘制矩形 |
|
绘制扇形或饼图块 |
|
绘制波浪线 |
|
绘制锯齿线 |
|
完成一组绘图命令 |
|
插入文本行 |
|
将文本放入矩形框内 |
|
存储页面所属的文档 |
|
自上次 |
|
存储页面的高度副本 |
|
存储当前点 |
|
存储所属页面 |
|
围绕绘图的矩形 |
|
累计的文本插入 |
|
累积的字符串,将存储在 |
|
存储页面的宽度副本 |
类 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) – 终点
- 返回类型:
- 返回:
终点,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) 才能容纳至少一个波。请看下图,它显示了由一个完整周期连接的两个点。
- 返回类型:
- 返回:
终点,p2。
这是一个由三条连接的线组成的示例,形成了一个闭合、填充的三角形。小箭头表示描边方向。
>>> 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")
注意
绘制的波浪不是三角函数(正弦/余弦)波。如果您需要,请查看 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) 才能容纳至少一个周期。
- 返回类型:
- 返回:
终点,p2。
- draw_polyline(points)#
在序列 points 中包含的点之间绘制多条连接的线。通过设置最后一个点等于第一个点,可以用于创建任意多边形。
- 参数:
points (sequence) –
point_like
对象的序列。其长度必须至少为 2(此时等同于 draw_line())。- 返回类型:
- 返回:
points[-1] – 参数序列中的最后一个点。
- draw_bezier(p1, p2, p3, p4)#
从 p1 到 p4 绘制一条标准三次贝塞尔曲线,使用 p2 和 p3 作为控制点。
所有参数都是
point_like
对象。- 返回类型:
- 返回:
终点,p4。
注意
这些点不必都不同——可以尝试一下让其中一些点相等!
示例
- draw_oval(tetra)#
在给定的四边形(tetragon)内绘制一个“椭圆”。如果它是一个正方形,则绘制一个正圆;如果是普通的矩形,则会得到一个椭圆。如果使用任意四边形,可能会得到各种各样的形状。
绘图以逆时针方向,从
bottom-left -> top-left
角落线段的中间点开始和结束。- 参数:
tetra (rect_like,quad_like) –
版本 1.14.5 更改: 现在也支持 Quad。
- 返回类型:
- 返回:
线段
rect.bl -> rect.tl
的中间点,或quad.ll -> quad.ul
的中间点。这里只看几个示例,或者查看 PyMuPDF-Utilities 仓库中的 quad-show?.py 脚本。
- draw_circle(center, radius)#
给定圆心和半径绘制一个圆。绘图以逆时针方向,从点
center - (radius, 0)
开始和结束。此点是外接正方形左边的中点。这是
draw_sector(center, start, 360, fullSector=False)
的快捷方式。要以顺时针方向绘制同一个圆,请使用-360
作为角度。
- draw_curve(p1, p2, p3)#
draw_bezier() 的特例:从 p1 绘制一条三次贝塞尔曲线到 p3。在
p1 -> p2
和p3 -> p2
这两条线段上各生成一个控制点。因此,两个控制点将位于线段p1 -> p3
的同一侧。这保证了曲线的曲率符号不会改变。如果指向 p2 的线段以 90 度角相交,则生成的曲线是一个四分之一椭圆(如果长度相等,则是一个四分之一圆)。所有参数都是
point_like
。- 返回类型:
- 返回:
终点,p3。下图是一个填充的四分之一椭圆段。黄色区域方向为顺时针:
- draw_sector(center, point, angle, fullSector=True)#
绘制一个扇形,可选择将弧线连接到圆心(就像一块饼图)。
- 参数:
center (point_like) – 圆心。
point (point_like) – 饼图弧段的两个端点之一。另一个端点根据 angle 计算得出。
angle (float) – 扇形的角度,以度为单位。用于计算弧的另一个端点。根据其符号,弧线以逆时针(正值)或顺时针方向绘制。
fullSector (bool) – 是否绘制连接弧的两端到圆心的线。如果指定了填充颜色,则填充整个“饼图”,否则只填充扇形。
- 返回类型:
- 返回:
弧的另一个端点。可用作后续调用的起始点,以创建逻辑上连接的饼图。示例
- 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)
时绘制椭圆。
- 返回类型:
- 返回:
矩形的左上角。
- draw_quad(quad)#
绘制一个四边形。绘图以逆时针方向,从左上角(
Quad.ul
)开始和结束。它是Shape.draw_polyline()
的快捷方式,参数为(ul, ll, lr, ur, 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 fixpoint 和 Matrix 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 页及后续。这里有一个示例来演示差异。
注意
对于形状中的每个像素,将发生以下情况
“奇偶规则”计数有多少区域包含该像素。如果计数为奇数,则该像素被视为形状的内部;如果为偶数,则该像素在形状外部。
默认规则“非零绕数”额外考虑包含该像素的每个区域的“方向”:如果区域以逆时针方向绘制,则加 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 的位置。
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 行的上方,依此类推。
- 返回类型:
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
,180
和270
(=-90
),每个值都会使文本从矩形的不同角落开始填充。左下角是90
,右下角是180
,而-90 / 270
是右上角。请参阅示例了解文本如何在矩形中填充。此参数优先于变形。请看第二个示例,它展示了文本先向左旋转 90 度,然后整个矩形围绕其左下角顺时针旋转。
- 返回类型:
float
- 返回:
如果为正值或零:执行成功。返回的值是矩形中未使用的行空间(以像素为单位)。可以安全地忽略此值——或用于优化矩形、定位后续项目等。
如果为负值:未执行。返回的值是存储文本行所需的空间不足。需要放大矩形、减小 fontsize、减少文本量等。
其他参数的描述请参阅通用参数。
- commit(overlay=True)#
使用累积的绘图更新页面的
contents
,后跟任何文本插入。如果文本与绘图重叠,文本将写在绘图之上。警告
不要忘记执行此方法
如果一个形状未提交,它将被忽略,页面也不会被更改!
此方法将重置属性
Shape.rect
,lastPoint
,draw_cont
,text_cont
和totalcont
。之后,该 shape 对象可以为同一页面重复使用。- 参数:
overlay (bool) – 确定是将内容放在前景(默认)还是背景。仅当页面已经有一个非空的
contents
对象时相关。
———- 属性 ———-
- 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)
- 类型:
- totalcont#
累积的总命令缓冲区,用于绘图和文本插入。这将由
Shape.commit()
使用。- 类型:
str
用法#
绘图对象通过 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()
>>> ....
注意
每次调用 finish() 会将之前的 draw 方法组合成一个逻辑形状,并赋予其通用的颜色、线宽、变形等属性。如果指定了 closePath,它还会将最后一个 draw 的终点与第一个 draw 的起点连接起来。
要成功创建复合图形,请让每个 draw 方法使用前一个方法的终点作为其起始点。在上述伪代码中,draw2 因此应使用 draw1 返回的 Point 作为其起始点。如果未能这样做,将自动开始一个新的路径,并且 finish() 可能无法按预期工作(但也不会报错)。
文本插入可以在提交之前的任何位置发生(它们既不影响
Shape.draw_cont
也不影响Shape.lastPoint
)。它们直接附加到 Shape.totalcont,而 draw 方法则由 Shape.finish 附加。每次 commit 会将所有文本插入和形状放置在页面的前景或背景——从而提供了一种控制图形图层的方式。
只有 commit 会更新页面的内容,其他方法基本上只是字符串操作。
示例#
创建由不同颜色饼图块组成的完整圆
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 种颜色的示例

创建一个正 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 的多边形

通用参数#
fontname (str)
通常有三种选项
使用标准PDF Base 14 字体之一。在这种情况下,不得指定 fontfile,如果也省略此参数,则使用 “Helvetica”。
选择页面中已使用的字体。然后指定其引用名称,前缀为斜杠“/”,见下方示例。
指定您系统上的字体文件。在这种情况下,为此参数选择一个任意但新的名称(不带“/”前缀)。
如果插入的文本应重用页面中的字体,请使用
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
,则不会生成相应的颜色选择命令。如果 fill 和 color 都为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。描边颜色为蓝色,填充颜色为黄色。
![]()
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
)![]()
抑制尖角的文本示例(
miter_limit=1
)![]()
overlay (bool)
使项目出现在前景(默认)或背景。
morph (sequence)
导致通过 draw*() 方法创建的形状,或通过页面方法 insert_textbox() / insert_text() 插入的文本发生“变形”。如果不是
None
,它必须是一个对 (fixpoint, matrix),其中 fixpoint 是一个 Point,matrix 是一个 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)
导致绘图的终点自动与起始点连接(通过一条直线)。