1PDF::Builder::Content(3U)ser Contributed Perl DocumentatiPoDnF::Builder::Content(3)
2
3
4

NAME

6       PDF::Builder::Content - Methods for adding graphics and text to a PDF
7

SYNOPSIS

9           # Start with a PDF page (new or opened)
10           my $pdf = PDF::Builder->new();
11           my $page = $pdf->page();
12
13           # Add new content object(s)
14           my $content = $page->graphics();  # or gfx()
15           #   and/or (as separate object name)
16           my $content = $page->text();
17
18           # Then call the methods below to add graphics and text to the page.
19           # Note that negative coordinates can have unpredictable effects, so
20           # keep your coordinates non-negative!
21
22       These methods add content to streams output for text or graphics
23       objects.  Unless otherwise restricted by a check that we are in or out
24       of text mode, many methods listed here apply equally to text and
25       graphics streams. It is possible that there are some which have no
26       effect in one stream type or the other, but are currently lacking a
27       check to prevent them from being inserted into an inapplicable stream.
28

METHODS

30       All public methods listed, except as otherwise noted, return $self, for
31       ease of chaining calls.
32
33   Coordinate Transformations
34       The methods in this section change the coordinate system for the
35       current content object relative to the rest of the document.  Note: the
36       changes are relative to the original page coordinates (and thus,
37       absolute), not to the previous position! Thus, "translate(10, 10);
38       translate(10, 10);" ends up only moving the origin to "[10, 10]",
39       rather than to "[20, 20]". There is one call, transform_rel(), which
40       makes your changes relative to the previous position.
41
42       If you call more than one of these methods, the PDF specification
43       recommends calling them in the following order: translate, rotate,
44       scale, skew.  Each change builds on the last, and you can get
45       unexpected results when calling them in a different order.
46
47       CAUTION: a text object ($content) behaves a bit differently. Individual
48       translate, rotate, scale, and skew calls cancel out any previous
49       settings.  If you want to combine multiple transformations for text,
50       use the "transform" call.
51
52       $content->translate($dx,$dy)
53           Moves the origin along the x and y axes by $dx and $dy
54           respectively.
55
56       $content->rotate($degrees)
57           Rotates the coordinate system counter-clockwise (anti-clockwise)
58           around the current origin. Use a negative argument to rotate
59           clockwise. Note that 360 degrees will be treated as 0 degrees.
60
61           Note: Unless you have already moved (translated) the origin, it is,
62           and will remain, at the lower left corner of the visible sheet. It
63           will not automatically shift to another corner. For example, a
64           rotation of +90 degrees (counter-clockwise) will leave the entire
65           visible sheet in negative Y territory (0 at the left edge,
66           -original_width at the right edge), while X remains in positive
67           territory (0 at bottom, +original_height at the top edge).
68
69           This rotate() call permits any angle. Do not confuse it with the
70           page rotation "rotate" call, which only permits increments of 90
71           degrees (with opposite sign!), but does shift the origin to another
72           corner of the sheet.
73
74       $content->scale($sx,$sy)
75           Scales (stretches) the coordinate systems along the x and y axes.
76           Separate multipliers are provided for x and y.
77
78       $content->skew($skx,$sky)
79           Skews the coordinate system by $skx degrees
80           (counter-clockwise/anti-clockwise) from the x axis and $sky degrees
81           (clockwise) from the y axis.  Note that 360 degrees will be treated
82           the same as 0 degrees.
83
84       $content->transform(%opts)
85           Use one or more of the given %opts:
86
87               $content->transform(
88                   'translate' => [$dx,$dy],
89                   'rotate'    => $degrees,
90                   'scale'     => [$sx,$sy],
91                   'skew'      => [$skx,$sky],
92                   'matrix'    => [$a, $b, $c, $d, $e, $f],
93                   'point'     => [$x,$y]
94                   'repeat'    => $boolean
95               )
96
97           A six element list may be given ("matrix") for a further
98           transformation matrix:
99
100               $a = cos(rot) * scale factor for X
101               $b = sin(rot) * tan(skew for X)
102               $c = -sin(rot) * tan(skew for Y)
103               $d = cos(rot) * scale factor for Y
104               $e = translation for X
105               $f = translation for Y
106
107           Performs multiple coordinate transformations in one call, in the
108           order recommended by the PDF specification (translate, rotate,
109           scale, skew).  This is equivalent to making each transformation
110           separately, in the indicated order.  A matrix of 6 values may also
111           be given ("matrix"). The transformation matrix is updated.  A
112           "point" may be given (a point to be multiplied [transformed] by the
113           completed matrix).  Omitted options will be unchanged.
114
115           If "repeat" is true, and if this is not the first call to a
116           transformation method, the previous transformation will be
117           performed again, modified by any other provided arguments.
118
119       $content->transform_rel(%opts)
120           Makes transformations similarly to "transform", except that it adds
121           to the previously set values, rather than replacing them (except
122           for scale, which multiplies the new values with the old).
123
124           Unlike "transform", "matrix" and "point" are not supported.
125
126       $content->matrix($a, $b, $c, $d, $e, $f)
127           (Advanced) Sets the current transformation matrix manually. Unless
128           you have a particular need to enter transformations manually, you
129           should use the "transform" method instead.
130
131            $a = cos(rot) * scale factor for X
132            $b = sin(rot) * tan(skew for X)
133            $c = -sin(rot) * tan(skew for Y)
134            $d = cos(rot) * scale factor for Y
135            $e = translation for X
136            $f = translation for Y
137
138           In text mode, the text matrix is returned.  In graphics mode, $self
139           is returned.
140
141   Graphics State Parameters
142       The following calls also affect the text state.
143
144       $content->linewidth($width)
145           Sets the width of the stroke (in points). This is the line drawn in
146           graphics mode, or the outline of a character in text mode (with
147           appropriate "render" mode). If no $width is given, the current
148           setting is returned. If the width is being set, $self is returned
149           so that calls may be chained.
150
151           Alternate name: "line_width"
152
153           This is provided for compatibility with PDF::API2.
154
155       $content->linecap($style)
156           Sets the style to be used at the end of a stroke. This applies to
157           lines which come to a free-floating end, not to "joins" ("corners")
158           in polylines (see "linejoin").
159
160           Alternate name: "line_cap"
161
162           This is provided for compatibility with PDF::API2.
163
164           "butt" or "b" or 0 = Butt Cap (default)
165               The stroke ends at the end of the path, with no projection.
166
167           "round" or "r" or 1 = Round Cap
168               A semicircular arc is drawn around the end of the path with a
169               diameter equal to the line width, and is filled in.
170
171           "square" or "s" or 2 = Projecting Square Cap
172               The stroke continues past the end of the path for half the line
173               width.
174
175           If no $style is given, the current setting is returned. If the
176           style is being set, $self is returned so that calls may be chained.
177
178           Either a number or a string (case-insensitive) may be given.
179
180       $content->linejoin($style)
181           Sets the style of join to be used at corners of a path (within a
182           multisegment polyline).
183
184           Alternate name: "line_join"
185
186           This is provided for compatibility with PDF::API2.
187
188           "miter" or "m" or 0 = Miter Join, default
189               The outer edges of the strokes extend until they meet, up to
190               the limit specified by miterlimit. If the limit would be
191               surpassed, a bevel join is used instead. For a given linewidth,
192               the more acute the angle is (closer to 0 degrees), the higher
193               the ratio of miter length to linewidth will be, and that's what
194               miterlimit controls -- a very "pointy" join is replaced by a
195               bevel.
196
197           "round" or "r" or 1 = Round Join
198               A filled circle with a diameter equal to the linewidth is drawn
199               around the corner point, producing a rounded corner. The arc
200               will meet up with the sides of the line in a smooth tangent.
201
202           "bevel" or "b" or 2 = Bevel Join
203               A filled triangle is drawn to fill in the notch between the two
204               strokes.
205
206           If no $style is given, the current setting is returned. If the
207           style is being set, $self is returned so that calls may be chained.
208
209           Either a number or a string (case-insensitive) may be given.
210
211       $content->miterlimit($ratio)
212           Sets the miter limit when the line join style is a miter join.
213
214           The ratio is the maximum length of the miter (inner to outer
215           corner) divided by the line width. Any miter above this ratio will
216           be converted to a bevel join. The practical effect is that lines
217           meeting at shallow angles are chopped off instead of producing long
218           pointed corners.
219
220           The default miter limit is 10.0 (approximately 11.5 degree cutoff
221           angle).  The smaller the limit, the larger the cutoff angle.
222
223           If no $ratio is given, the current setting is returned. If the
224           ratio is being set, $self is returned so that calls may be chained.
225
226           Alternate name: "miter_limit"
227
228           This is provided for compatibility with PDF::API2.  Long ago, in a
229           distant galaxy, this method was misnamed meterlimit, but that was
230           removed a while ago. Any code using that name should be updated!
231
232       $content->linedash()
233       $content->linedash($length)
234       $content->linedash($dash_length, $gap_length, ...)
235       $content->linedash('pattern' => [$dash_length, $gap_length, ...],
236       'shift' => $offset)
237           Sets the line dash pattern.
238
239           If called without any arguments, a solid line will be drawn.
240
241           If called with one argument, the dashes and gaps (strokes and
242           spaces) will have equal lengths.
243
244           If called with two or more arguments, the arguments represent
245           alternating dash and gap lengths.
246
247           If called with a hash of arguments, the pattern array may have one
248           or more elements, specifying the dash and gap lengths.  A dash
249           phase may be set (shift), which is a positive integer specifying
250           the distance into the pattern at which to start the dashed line.
251           Note that if you wish to give a shift amount, using "shift", you
252           need to use "pattern" instead of one or two elements.
253
254           If an odd number of dash array elements are given, the list is
255           repeated by the reader software to form an even number of elements
256           (pairs).
257
258           If a single argument of -1 is given, the current setting is
259           returned.  This is an array consisting of two elements: an
260           anonymous array containing the dash pattern (default: empty), and
261           the shift (offset) amount (default: 0).  If the dash pattern is
262           being set, $self is returned so that calls may be chained.
263
264           Alternate name: "line_dash_pattern"
265
266           This is provided for compatibility with PDF::API2.
267
268       $content->flatness($tolerance)
269           (Advanced) Sets the maximum variation in output pixels when drawing
270           curves. The defined range of $tolerance is 0 to 100, with 0 meaning
271           use the device default flatness. According to the PDF
272           specification, you should not try to force visible line segments
273           (the curve's approximation); results will be unpredictable.
274           Usually, results for different flatness settings will be
275           indistinguishable to the eye.
276
277           The $tolerance value is silently clamped to be between 0 and 100.
278
279           If no $tolerance is given, the current setting is returned. If the
280           tolerance is being set, $self is returned so that calls may be
281           chained.
282
283           Alternate name: "flatness_tolerance"
284
285           This is provided for compatibility with PDF::API2.
286
287       $content->egstate($object)
288           (Advanced) Adds an Extended Graphic State object containing
289           additional state parameters.
290
291   Path Construction (Drawing)
292       $content->move($x,$y)
293           Starts a new path at the specified coordinates.  Note that multiple
294           x,y pairs can be given, although this isn't that useful (only the
295           last pair would have an effect).
296
297       $content->close()
298           Closes and ends the current path by extending a line from the
299           current position to the starting position.
300
301       $content->endpath()
302           Ends the current path without explicitly enclosing it.  That is,
303           unlike "close", there is no line segment drawn back to the starting
304           position.
305
306           Alternate name: "end"
307
308           This is provided for compatibility with PDF::API2. Do not confuse
309           it with the "$pdf->end()" method!
310
311       Straight line constructs
312
313       Note: None of these will actually be visible until you call "stroke" or
314       "fill". They are merely setting up the path to draw.
315
316       $content->line($x,$y)
317       $content->line($x,$y, $x2,$y2,...)
318           Extends the path in a line from the current coordinates to the
319           specified coordinates, and updates the current position to be the
320           new coordinates.
321
322           Multiple additional "[$x,$y]" pairs are permitted, to draw joined
323           multiple line segments. Note that this is not equivalent to a
324           polyline (see "poly"), because the first "[$x,$y]" pair in a
325           polyline is a move operation.  Also, the "linecap" setting will be
326           used rather than the "linejoin" setting for treating the ends of
327           segments.
328
329       $content->hline($x)
330       $content->vline($y)
331           Shortcuts for drawing horizontal and vertical lines from the
332           current position. They are like line(), but to the new x and
333           current y ("hline"), or to the the current x and new y ("vline").
334
335       $content->polyline($x1,$y1, ..., $xn,$yn)
336           This is a shortcut for creating a polyline path from the current
337           position. It extends the path in line segments along the specified
338           coordinates.  The current position is changed to the last "[$x,$y]"
339           pair given.
340
341           A critical distinction between the "polyline" method and the "poly"
342           method is that in this ("polyline"), the first pair of coordinates
343           are treated as a draw order (unlike the move order in "poly").
344
345           Thus, while this is provided for compatibility with PDF::API2, it
346           is not really an alias or alternate name for "poly"!
347
348       $content->poly($x1,$y1, ..., $xn,$yn)
349           This is a shortcut for creating a polyline path. It moves to
350           "[$x1,$y1]", and then extends the path in line segments along the
351           specified coordinates.  The current position is changed to the last
352           "[$x,$y]" pair given.
353
354           The difference between a polyline and a "line" with multiple
355           "[$x,$y]" pairs is that the first pair in a polyline are a move,
356           while in a line they are a draw.  Also, "line_join" instead of
357           "line_cap" is used to control the appearance of the ends of line
358           segments.
359
360           A critical distinction between the "polyline" method and the "poly"
361           method is that in this ("poly"), the first pair of coordinates are
362           treated as a move order.
363
364       $content = $content->rectangle($x1, $y1, $x2, $y2)
365           Creates a new rectangle-shaped path, between the two corner points
366           "[$x1, $y1]" and "[$x2, $y2]". The corner points are swapped if
367           necessary, to make "1" the lower left and "2" the upper right (x2 >
368           x1 and y2 > y1).  The object (here, $content) is returned, to
369           permit chaining.
370
371           Note that this is not an alias or alternate name for "rect". It
372           handles only one rectangle, and takes corner coordinates for corner
373           "2", rather than the width and height.
374
375       $content = $content->rect($x,$y, $w,$h)
376       $content = $content->rect($x1,$y1, $w1,$h1, ..., $xn,$yn, $wn,$hn)
377           This creates paths for one or more rectangles, with their lower
378           left points at "[$x,$y]" and specified widths (+x direction) and
379           heights (+y direction).  Negative widths and heights are permitted,
380           which draw to the left (-x) and below (-y) the given corner point,
381           respectively.  The current position is changed to the "[$x,$y]" of
382           the last rectangle given.  Note that this is the starting point of
383           the rectangle, not the end point.  The object (here, $content) is
384           returned, to permit chaining.
385
386           Note that this differs from the "rectangle" method in that multiple
387           rectangles may be drawn in one call, and the second pair for each
388           rectangle are the width and height, not the opposite corner
389           coordinates.
390
391       $content->rectxy($x1,$y1, $x2,$y2)
392           This creates a rectangular path, with "[$x1,$y1]" and "[$x2,$y2]"
393           specifying opposite corners. They can be Lower Left and Upper
394           Right, or Upper Left and Lower Right, in either order, so long as
395           they are diagonally opposite each other.  The current position is
396           changed to the "[$x1,$y1]" (first) pair.
397
398           This is not quite an alias or alternate name for "rectangle", as it
399           permits the corner points to be specified in any order.
400
401       Curved line constructs
402
403       Note: None of these will actually be visible until you call "stroke" or
404       "fill". They are merely setting up the path to draw.
405
406       $content->circle($xc,$yc, $radius)
407           This creates a circular path centered on "[$xc,$yc]" with the
408           specified radius. It does not change the current position.
409
410       $content->ellipse($xc,$yc, $rx,$ry)
411           This creates a closed elliptical path centered on "[$xc,$yc]", with
412           axis radii (semidiameters) specified by $rx (x axis) and $ry (y
413           axis), respectively.  It does not change the current position.
414
415       $content->arc($xc,$yc, $rx,$ry, $alpha,$beta, $move, $dir)
416       $content->arc($xc,$yc, $rx,$ry, $alpha,$beta, $move)
417           This extends the path along an arc of an ellipse centered at
418           "[$xc,$yc]".  The semidiameters of the elliptical curve are $rx (x
419           axis) and $ry (y axis), respectively, and the arc sweeps from
420           $alpha degrees to $beta degrees. The current position is then set
421           to the endpoint of the arc.
422
423           Set $move to a true value if this arc is the beginning of a new
424           path instead of the continuation of an existing path. Either way,
425           the current position will be updated to the end of the arc.  Use
426           "$rx == $ry" for a circular arc.
427
428           The optional $dir arc sweep direction defaults to 0 (false), for a
429           counter-clockwise/anti-clockwise sweep. Set to 1 (true) for a
430           clockwise sweep.
431
432       $content->pie($xc,$yc, $rx,$ry, $alpha,$beta, $dir)
433       $content->pie($xc,$yc, $rx,$ry, $alpha,$beta)
434           Creates a pie-shaped path from an ellipse centered on "[$xc,$yc]".
435           The x-axis and y-axis semidiameters of the ellipse are $rx and $ry,
436           respectively, and the arc sweeps from $alpha degrees to $beta
437           degrees.  It does not change the current position.  Depending on
438           the sweep angles and direction, this can draw either the pie
439           "slice" or the remaining pie (with slice removed).  Use "$rx ==
440           $ry" for a circular pie.  Use a different "[$xc,$yc]" for the
441           slice, to offset it from the remaining pie.
442
443           The optional $dir arc sweep direction defaults to 0 (false), for a
444           counter-clockwise/anti-clockwise sweep. Set to 1 (true) for a
445           clockwise sweep.
446
447           This is a shortcut to draw a section of elliptical (or circular)
448           arc and connect it to the center of the ellipse or circle, to form
449           a pie shape.
450
451       $content->curve($cx1,$cy1, $cx2,$cy2, $x,$y)
452           This extends the path in a curve from the current point to
453           "[$x,$y]", using the two specified control points to create a cubic
454           Bezier curve, and updates the current position to be the new point
455           ("[$x,$y]").
456
457           Within a text object, the text's baseline follows the Bezier curve.
458
459           Note that while multiple sets of three "[x,y]" pairs are permitted,
460           these are treated as independent cubic Bezier curves. There is no
461           attempt made to smoothly blend one curve into the next!
462
463       $content->qbspline($cx1,$cy1, $x,$y)
464           This extends the path in a curve from the current point to
465           "[$x,$y]", using the two specified points to create a quadratic
466           Bezier curve, and updates the current position to be the new point.
467
468           Internally, these splines are one or more cubic Bezier curves (see
469           "curve") with the two control points synthesized from the two given
470           points (a control point and the end point of a quadratic Bezier
471           curve).
472
473           Note that while multiple sets of two "[x,y]" pairs are permitted,
474           these are treated as independent quadratic Bezier curves. There is
475           no attempt made to smoothly blend one curve into the next!
476
477           Further note that this "spline" does not match the common
478           definition of a spline being a continuous curve passing through all
479           the given points! It is a piecewise non-continuous cubic Bezier
480           curve. Use with care, and do not make assumptions about splines for
481           you or your readers. You may wish to use the "bspline" call to have
482           a continuously smooth spline to pass through all given points.
483
484           Pairs of points (control point and end point) are consumed in a
485           loop. If one point or coordinate is left over at the end, it is
486           discarded (as usual practice for excess data to a routine). There
487           is no check for duplicate points or other degeneracies.
488
489           Alternate name: "spline"
490
491           This method is still named "spline" in PDF::API2, so for
492           compatibility, that name is usable here. Since there are both
493           quadratic and cubic splines available in PDF, it is preferred to
494           use more descriptive names such as "qbspline" and "cbspline" to
495           minimize confusion.
496
497       $content->bspline($ptsRef, %opts)
498           This extends the path in a curve from the current point to the end
499           of a list of coordinate pairs in the array referenced by $ptsRef.
500           Smoothly continuous cubic Bezier splines are used to create a curve
501           that passes through all the given points. Multiple control points
502           are synthesized; they are not supplied in the call. The current
503           position is updated to the last point.
504
505           Internally, these splines are one cubic Bezier curve (see "curve")
506           per pair of input points, with the two control points synthesized
507           from the tangent through each point as set by the polyline that
508           would connect each point to its neighbors. The intent is that the
509           resulting curve should follow reasonably closely a polyline that
510           would connect the points, and should avoid any major excursions.
511           See the discussions below for the handling of the control points at
512           the endpoints (current point and last input point). The point at
513           the end of the last line or curve drawn becomes the new current
514           point.
515
516           Options %opts:
517
518           'firstseg' => 'mode'
519               where mode is
520
521               curve
522                   This is the default behavior.  This forces the first
523                   segment (from the current point to the first given point)
524                   to be drawn as a cubic Bezier curve. This means that the
525                   direction of the curve coming off the current point is
526                   unconstrained (it will end up being a reflection of the
527                   tangent at the first given point).
528
529               line1
530                   This forces the first segment (from the current point to
531                   the first given point) to be drawn as a curve, with the
532                   tangent at the current point to be constrained as parallel
533                   to the polyline segment.
534
535               line2
536                   This forces the first segment (from the current point to
537                   the first given point) to be drawn as a line segment. This
538                   also sets the tangent through the first given point as a
539                   continuation of the line, as well as constraining the
540                   direction of the line at the current point.
541
542               constraint1
543                   This forces the first segment (from the current point to
544                   the first given point) to not be drawn, but to be an
545                   invisible curve (like mode=line1) to leave the tangent at
546                   the first given point unconstrained. A move will be made to
547                   the first given point, and the current point is otherwise
548                   ignored.
549
550               constraint2
551                   This forces the first segment (from the current point to
552                   the first given point) to not be drawn, but to be an
553                   invisible line (like mode=line2) to constrain the tangent
554                   at the first given point. A move will be made to the first
555                   given point, and the current point is otherwise ignored.
556
557           'lastseg' => 'mode'
558               where mode is
559
560               curve
561                   This is the default behavior.  This forces the last segment
562                   (to the last given input point) to be drawn as a cubic
563                   Bezier curve. This means that the direction of the curve
564                   goin to the last point is unconstrained (it will end up
565                   being a reflection of the tangent at the next-to-last given
566                   point).
567
568               line1
569                   This forces the last segment (to the last given input
570                   point) to be drawn as a curve with the the tangent through
571                   the last given point parallel to the polyline segment, thus
572                   constraining the direction of the line at the last point.
573
574               line2
575                   This forces the last segment (to the last given input
576                   point) to be drawn as a line segment. This also sets the
577                   tangent through the next-to-last given point as a back
578                   continuation of the line, as well as constraining the
579                   direction of the line at the last point.
580
581               constraint1
582                   This forces the last segment (to the last given input
583                   point) to not be drawn, but to be an invisible curve (like
584                   mode=line1) to leave the tangent at the next-to-last given
585                   point unconstrained. The last given input point is ignored,
586                   and next-to-last point becomes the new current point.
587
588               constraint2
589                   This forces the last segment (to the last given input
590                   point) to not be drawn, but to be an invisible line (like
591                   mode=line2) to constrain the tangent at the next-to-last
592                   given point. The last given input point is ignored, and
593                   next-to-last point becomes the new current point.
594
595           'ratio' => n
596               n is the ratio of the length from a point to a control point to
597               the length of the polyline segment on that side of the given
598               point. It must be greater than 0.1, and the default is 0.3333
599               (1/3).
600
601           'colinear' => 'mode'
602               This describes how to handle the middle segment when there are
603               four or more colinear points in the input set. A mode of 'line'
604               specifies that a line segment will be drawn between each of the
605               interior colinear points. A mode of 'curve' (this is the
606               default) will draw a Bezier curve between each of those points.
607
608               "colinear" applies only to interior runs of colinear points,
609               between curves.  It does not apply to runs at the beginning or
610               end of the point list, which are drawn as line segments or
611               linear constraints regardless of firstseg and lastseg settings.
612
613           'debug' => N
614               If N is 0 (the default), only the spline is returned. If it is
615               greater than 0, a number of additional items will be drawn:
616               (N>0) the points, (N>1) a green solid polyline connecting them,
617               (N>2) blue original tangent lines at each interior point, and
618               (N>3) red dashed lines and hollow points representing the
619               Bezier control points.
620
621       Special cases
622
623       Adjacent points which are duplicates are consolidated.  An extra
624       coordinate at the end of the input point list (not a full "[x,y]" pair)
625       will, as usual, be ignored.
626
627       0 given points (after duplicate consolidation)
628           This leaves only the current point (unchanged), so it is a no-op.
629
630       1 given point (after duplicate consolidation)
631           This leaves the current point and one point, so it is rendered as a
632           line, regardless of %opt flags.
633
634       2 given points (after duplicate consolidation)
635           This leaves the current point, an intermediate point, and the end
636           point. If the three points are colinear, two line segments will be
637           drawn. Otherwise, both segments are curves (through the tangent at
638           the intermediate point). If either end segment mode is requested to
639           be a line or constraint, it is treated as a line1 mode request
640           instead.
641
642       N colinear points at beginning or end
643           N colinear points at beginning or end of the point set causes N-1
644           line segments ("line2" or "constraint2", regardless of the settings
645           of "firstseg", "lastseg", and "colinear".
646
647       Alternate name: "cbspline"
648
649       This is to emphasize that it is a cubic Bezier spline, as opposed to a
650       quadratic Bezier spline (see "qbspline" above).
651
652       $content->bogen($x1,$y1, $x2,$y2, $radius, $move, $larger, $reverse)
653       $content->bogen($x1,$y1, $x2,$y2, $radius, $move, $larger)
654       $content->bogen($x1,$y1, $x2,$y2, $radius, $move)
655       $content->bogen($x1,$y1, $x2,$y2, $radius)
656           (German for bow, as in a segment (arc) of a circle. This is a
657           segment of a circle defined by the intersection of two circles of a
658           given radius, with the two intersection points as inputs. There are
659           four possible resulting arcs, which can be selected with $larger
660           and $reverse.)
661
662           This extends the path along an arc of a circle of the specified
663           radius between "[$x1,$y1]" to "[$x2,$y2]". The current position is
664           then set to the endpoint of the arc ("[$x2,$y2]").
665
666           Set $move to a true value if this arc is the beginning of a new
667           path instead of the continuation of an existing path. Note that the
668           default ($move = false) is not a straight line to P1 and then the
669           arc, but a blending into the curve from the current point. It will
670           often not pass through P1!
671
672           Set $larger to a true value to draw the larger ("outer") arc
673           between the two points, instead of the smaller one. Both arcs are
674           drawn clockwise from P1 to P2. The default value of false draws the
675           smaller arc.
676
677           Set $reverse to a true value to draw the mirror image of the
678           specified arc (flip it over, so that its center point is on the
679           other side of the line connecting the two points). Both arcs are
680           drawn counter-clockwise from P1 to P2. The default (false) draws
681           clockwise arcs.
682
683           The $radius value cannot be smaller than half the distance from
684           "[$x1,$y1]" to "[$x2,$y2]". If it is too small, the radius will be
685           set to half the distance between the points (resulting in an arc
686           that is a semicircle). This is a silent error.
687
688   Path Painting (Drawing)
689       $content->stroke()
690           Strokes the current path.
691
692       $content->fill($use_even_odd_fill)
693       $content->fill('rule' => $rule)
694       $content->fill()  # use default nonzero rule
695           Fill the current path's enclosed area.  It does not stroke the
696           enclosing path around the area.
697
698           $user_even_odd_fill = 0 or false (default)
699           $rule = 'nonzero'
700               If the path intersects with itself, the nonzero winding rule
701               will be used to determine which part of the path is filled in.
702               This basically fills in everything inside the path, except in
703               some situations depending on the direction of the path.
704
705           $user_even_odd_fill = 1 (non-zero value) or true
706           $rule = 'even-odd'
707               If the path intersects with itself, the even-odd winding rule
708               will be used to determine which part of the path is filled in.
709               In most cases, this means that the filling state alternates
710               each time the path is intersected.  This basically will fill
711               alternating closed sub-areas.
712
713           See the PDF Specification, section 8.5.3.3 (in version 1.7), for
714           more details on filling.
715
716           The "rule" parameter is added for PDF::API2 compatibility.
717
718       $content->fillstroke($use_even_odd_fill)
719       $content->fillstroke('rule' => $rule)
720       $content->fillstroke()  # use default nonzero rule
721           Fill the current path's enclosed area and then stroke the enclosing
722           path around the area (possibly with a different color).
723
724           $user_even_odd_fill = 0 or false (default)
725           $rule = 'nonzero'
726               If the path intersects with itself, the nonzero winding rule
727               will be used to determine which part of the path is filled in.
728               This basically fills in everything inside the path, except in
729               some situations depending on the direction of the path.
730
731           $user_even_odd_fill = 1 (non-zero value) or true
732           $rule = 'even-odd'
733               If the path intersects with itself, the even-odd winding rule
734               will be used to determine which part of the path is filled in.
735               In most cases, this means that the filling state alternates
736               each time the path is intersected.  This basically will fill
737               alternating closed sub-areas.
738
739           See the PDF Specification, section 8.5.3.3 (in version 1.7), for
740           more details on filling.
741
742           The "rule" parameter is added for PDF::API2 compatibility.
743
744           Alternate names: "paint" and "fill_stroke"
745
746           "paint" is for compatibility with PDF::API2, while "fill_stroke" is
747           added for compatibility with many other PDF::API2-related renamed
748           methods.
749
750       $content->clip($use_even_odd_fill)
751       $content->clip('rule' => $rule)
752       $content->clip()  # use default nonzero rule
753           Modifies the current clipping path by intersecting it with the
754           current path. Initially (a fresh page), the clipping path is the
755           entire media. Each definition of a path, and a clip() call,
756           intersects the new path with the existing clip path, so the
757           resulting clip path is no larger than the new path, and may even be
758           empty if the intersection is null.
759
760           $user_even_odd_fill = 0 or false (default)
761           $rule = 'nonzero'
762               If the path intersects with itself, the nonzero winding rule
763               will be used to determine which part of the path is included
764               (clipped in or out).  This basically includes everything inside
765               the path, except in some situations depending on the direction
766               of the path.
767
768           $user_even_odd_fill = 1 (non-zero value) or true
769           $rule = 'even-odd'
770               If the path intersects with itself, the even-odd winding rule
771               will be used to determine which part of the path is included.
772               In most cases, this means that the inclusion state alternates
773               each time the path is intersected.  This basically will include
774               alternating closed sub-areas.
775
776           It is common usage to make the endpath() call (n) after the clip()
777           call, to clear the path (unless you want to reuse that path, such
778           as to fill and/or stroke it to show the clip path). If you want to
779           clip text glyphs, it gets rather complicated, as a clip port cannot
780           be created within a text object (that will have an effect on text).
781           See the object discussion in "Rendering Order" in
782           PDF::Builder::Docs.
783
784               my $grfxC1 = $page->gfx();
785               my $textC  = $page->text();
786               my $grfxC2 = $page->gfx();
787                ...
788               $grfxC1->save();
789               $grfxC1->endpath();
790               $grfxC1->rect(...);
791               $grfxC1->clip();
792               $grfxC1->endpath();
793                ...
794               $textC->  output text to be clipped
795                ...
796               $grfxC2->restore();
797
798           The "rule" parameter is added for PDF::API2 compatibility.
799
800       $content->shade($shade, @coord)
801           Sets the shading matrix.
802
803           $shade
804               A hash reference that includes a name() method for the shade
805               name.
806
807           @coord
808               An array of 4 items: X-translation, Y-translation, X-scaled and
809               translated, Y-scaled and translated.
810
811   Colors
812       $content->fillcolor($color)
813       $content->strokecolor($color)
814           Sets the fill (enclosed area) or stroke (path) color. The interior
815           of text characters are filled, and (if ordered by "render") the
816           outline is stroked.
817
818               # Use a named color
819               # -> RGB color model
820               # there are many hundreds of named colors defined in
821               # PDF::Builder::Resource::Colors
822               $content->fillcolor('blue');
823
824               # Use an RGB color (# followed by 3, 6, 9, or 12 hex digits)
825               # -> RGB color model
826               # This maps to 0-1.0 values for red, green, and blue
827               $content->fillcolor('#FF0000');   # red
828
829               # Use a CMYK color (% followed by 4, 8, 12, or 16 hex digits)
830               # -> CMYK color model
831               # This maps to 0-1.0 values for cyan, magenta, yellow, and black
832               $content->fillcolor('%FF000000');   # cyan
833
834               # Use an HSV color (! followed by 3, 6, 9, or 12 hex digits)
835               # -> RGB color model
836               # This maps to 0-360 degrees for the hue, and 0-1.0 values for
837               # saturation and value
838               $content->fillcolor('!FF0000');
839
840               # Use an HSL color (& followed by 3, 6, 9, or 12 hex digits)
841               # -> L*a*b color model
842               # This maps to 0-360 degrees for the hue, and 0-1.0 values for
843               # saturation and lightness. Note that 360 degrees = 0 degrees (wraps)
844               $content->fillcolor('&FF0000');
845
846               # Use an L*a*b color ($ followed by 3, 6, 9, or 12 hex digits)
847               # -> L*a*b color model
848               # This maps to 0-100 for L, -100 to 100 for a and b
849               $content->fillcolor('$FF0000');
850
851           In all cases, if too few digits are given, the given digits are
852           silently right-padded with 0's (zeros). If an incorrect number of
853           digits are given, the next lowest number of expected digits are
854           used, and the remaining digits are silently ignored.
855
856               # A single number between 0.0 (black) and 1.0 (white) is an alternate way
857               # of specifying a gray scale.
858               $content->fillcolor(0.5);
859
860               # Three array elements between 0.0 and 1.0 is an alternate way of specifying
861               # an RGB color.
862               $content->fillcolor(0.3, 0.59, 0.11);
863
864               # Four array elements between 0.0 and 1.0 is an alternate way of specifying
865               # a CMYK color.
866               $content->fillcolor(0.1, 0.9, 0.3, 1.0);
867
868           In all cases, if a number is less than 0, it is silently turned
869           into a 0. If a number is greater than 1, it is silently turned into
870           a 1. This "clamps" all values to the range 0.0-1.0.
871
872               # A single reference is treated as a pattern or shading space.
873
874               # Two or more entries with the first element a Perl reference, is treated
875               # as either an indexed colorspace reference plus color-index(es), or
876               # as a custom colorspace reference plus parameter(s).
877
878           If no value was passed in, the current fill color (or stroke color)
879           array is returned, otherwise $self is returned.
880
881           Alternate names: "fill_color" and "stroke_color".
882
883           These are provided for PDF::API2 compatibility.
884
885   External Objects
886       $content->image($image_object, $x,$y, $width,$height)
887       $content->image($image_object, $x,$y, $scale)
888       $content->image($image_object, $x,$y)
889       $content->image($image_object)
890               # Example
891               my $image_object = $pdf->image_jpeg($my_image_file);
892               $content->image($image_object, 100, 200);
893
894           Places an image on the page in the specified location (specifies
895           the lower left corner of the image). The default location is
896           "[0,0]".
897
898           If coordinate transformations have been made (see Coordinate
899           Transformations above), the position and scale will be relative to
900           the updated coordinates. Otherwise, "[0,0]" will represent the
901           bottom left corner of the page, and $width and $height will be
902           measured at 72dpi.
903
904           For example, if you have a 600x600 image that you would like to be
905           shown at 600dpi (i.e., one inch square), set the width and height
906           to 72.  (72 Big Points is one inch)
907
908       $content->formimage($form_object, $x,$y, $scaleX, $scaleY)
909       $content->formimage($form_object, $x,$y, $scale)
910       $content->formimage($form_object, $x,$y)
911       $content->formimage($form_object)
912           Places an XObject on the page in the specified location (giving the
913           lower left corner of the image) and scale (applied to the image's
914           native height and width). If no scale is given, use 1 for both X
915           and Y. If one scale is given, use for both X and Y.  If two scales
916           given, they are for (separately) X and Y. In general, you should
917           not greatly distort an image by using greatly different scaling
918           factors in X and Y, although it is now possible for when that
919           effect is desirable. The "$x,$y" default is "[0,0]".
920
921           Note that while this method is named form image, it is also used
922           for the pseudoimages created by the barcode routines. Images are
923           naturally dimensionless (1 point square) and need at some point to
924           be scaled up to the desired point size. Barcodes are naturally
925           sized in points, and should be scaled at approximately 1.
926           Therefore, it would greatly overscale barcodes to multiply by image
927           width and height within "formimage", and require scaling of 1/width
928           and 1/height in the call. So, we leave scaling alone within
929           "formimage" and have the user manually scale images by the image
930           width and height (in pixels) in the call to "formimage".
931
932       $content = $content->object($object, $x,$y, $scale_x,$scale_y)
933           Places an image or other external object (a.k.a. XObject) on the
934           page in the specified location.
935
936           For images, $scale_x and $scale_y represent the width and height of
937           the image on the page, in points. If $scale_x is omitted, it will
938           default to 72 pixels per inch. If $scale_y is omitted, the image
939           will be scaled proportionally, based on the image dimensions.
940
941           For other external objects, the scale is a multiplier, where 1 (the
942           default) represents 100% (i.e. no change).
943
944           If coordinate transformations have been made (see Coordinate
945           Transformations above), the position and scale will be relative to
946           the updated coordinates.
947
948           If no coordinate transformations are needed, this method can be
949           called directly from the PDF::Builder::Page object instead.
950
951   Text
952       Text State Parameters
953
954       All of the following parameters that take a size are applied before any
955       scaling takes place, so you don't need to adjust values to counteract
956       scaling.
957
958       $spacing = $content->charspace($spacing)
959           Sets additional spacing between characters in a line. This is in
960           points, and is initially zero.  It may be positive to give an
961           expanded effect to words, or it may be negative to give a condensed
962           effect to words.  If $spacing is given, the current setting is
963           replaced by that value and $self is returned (to permit chaining).
964           If $spacing is not given, the current setting is returned.
965
966           CAUTION: be careful about using "charspace" if you are using a
967           connected font. This might include Arabic, Devanagari, Latin
968           cursive handwriting, and so on. You don't want to leave gaps
969           between characters, or cause overlaps. For such fonts and
970           typefaces, set the "charspace" spacing to 0.
971
972           Alternate names: "character_spacing" and "char_space"
973
974           character_spacing is provided for compatibility with PDF::API2,
975           while char_space is provided to be consistent with many other
976           method name changes in PDF::API2.
977
978       $spacing = $content->wordspace($spacing)
979           Sets additional spacing between words in a line. This is in points
980           and is initially zero (i.e., just the width of the space, without
981           anything extra). It may be negative to close up sentences a bit.
982           If $spacing is given, the current setting is replaced by that value
983           and $self is returned (to permit chaining).  If $spacing is not
984           given, the current setting is returned.
985
986           Note that it is a limitation of the PDF specification (as of
987           version 1.7, section 9.3.3) that only spacing with an ASCII space
988           (x20) is adjusted. Neither required blanks (xA0) nor any multiple-
989           byte spaces (including thin and wide spaces) are currently
990           adjusted.
991
992           alternate names: "word_spacing" and "word_space"
993
994           word_spacing is provided for compatibility with PDF::API2, while
995           word_space is provided to be consistent with many other method name
996           changes in PDF::API2.
997
998       $scale = $content->hscale($scale)
999           Sets the percentage of horizontal text scaling (relative sizing,
1000           not spacing). This is initally 100 (percent, i.e., no scaling). A
1001           scale of greater than 100 will stretch the text, while less than
1002           100 will compress it.  If $scale is given, the current setting is
1003           replaced by that value and $self is returned (to permit chaining).
1004           If $scale is not given, the current setting is returned.
1005
1006           Note that scaling affects all of the character widths, interletter
1007           spacing, and interword spacing. It is inadvisable to stretch or
1008           compress text by a large amount, as it will quickly make the text
1009           unreadable. If your objective is to justify text, you will usually
1010           be better off using "charspace" and "wordspace" to expand (or
1011           slightly condense) a line to fill a desired width. Also see the
1012           text_justify() calls for this purpose.
1013
1014       $leading = $content->leading($leading)
1015       $leading = $content->leading()
1016           Sets the text leading, which is the distance between baselines.
1017           This is initially zero (i.e., the lines will be printed on top of
1018           each other). The unit of leading is points.  If $leading is given,
1019           the current setting is replaced by that value and $self is returned
1020           (to permit chaining).  If $leading is not given, the current
1021           setting is returned.
1022
1023           Note that "leading" here is defined as used in electronic
1024           typesetting and the PDF specification, which is the full interline
1025           spacing (text baseline to text baseline distance, in points). In
1026           cold metal typesetting, leading was usually the extra spacing
1027           between lines beyond the font height itself, created by inserting
1028           lead (type alloy) shims.
1029
1030       $leading = $content->lead($leading)
1031       $leading = $content->lead()
1032           Deprecated, to be removed after March 2023. Use leading() now.
1033
1034           Note that the "$self->{' lead'}" internal variable is no longer
1035           available, having been replaced by "$self->{' leading'}".
1036
1037       $mode = $content->render($mode)
1038           Sets the text rendering mode.
1039
1040           0 = Fill text
1041           1 = Stroke text (outline)
1042           2 = Fill, then stroke text
1043           3 = Neither fill nor stroke text (invisible)
1044           4 = Fill text and add to path for clipping
1045           5 = Stroke text and add to path for clipping
1046           6 = Fill, then stroke text and add to path for clipping
1047           7 = Add text to path for clipping
1048
1049           If $mode is given, the current setting is replaced by that value
1050           and $self is returned (to permit chaining).  If $mode is not given,
1051           the current setting is returned.
1052
1053       $dist = $content->rise($dist)
1054           Adjusts the baseline up or down from its current location.  This is
1055           initially zero. A $dist greater than 0 moves the baseline up the
1056           page (y increases).
1057
1058           Use this for creating superscripts or subscripts (usually along
1059           with an adjustment to the font size).  If $dist is given, the
1060           current setting is replaced by that value and $self is returned (to
1061           permit chaining).  If $dist is not given, the current setting is
1062           returned.
1063
1064       %state = $content->textstate(charspace => $value, wordspace => $value,
1065       ...)
1066           This is a shortcut for setting multiple text state parameters at
1067           once.  If any parameters are set, an empty hash is returned.  This
1068           can also be used without arguments to retrieve the current text
1069           state settings (a hash of the state is returned).
1070
1071           Note: This does not work with the "save" and "restore" commands.
1072
1073       $content->font($font_object, $size)
1074           Sets the font and font size. $font is an object created by calling
1075           "font" in PDF::Builder to add the font to the document.
1076
1077               # Example (12 point Helvetica)
1078               my $pdf = PDF::Builder->new();
1079
1080               my $font = $pdf->font('Helvetica');
1081               $text->font($font, 24);
1082               $text->position(72, 720);
1083               $text->text('Hello, World!');
1084
1085               $pdf->save('sample.pdf');
1086
1087       Positioning Text
1088
1089       $content = $content->position($x, $y) # Set (also returns object, for
1090       ease of chaining)
1091       ($x, $y) = $content->position()  # Get
1092           If called with arguments (Set), moves to the start of the current
1093           line of text, offset by $x and $y (right and up for positive
1094           values).
1095
1096           If called without arguments (Get), returns the current position of
1097           the cursor (before the effects of any coordinate transformation
1098           methods).
1099
1100           Note that this is very similar in function to distance(), added
1101           recently to PDF::API2 and added here for compatibility.
1102
1103       ($tx,$ty) = $content->textpos()
1104           Returns the current text position on the page (where next write
1105           will happen) as an array.
1106
1107           Note: This does not affect the PDF in any way. It only tells you
1108           where the the next write will occur.
1109
1110           Alternate name: "position" (added for compatibility with PDF::API2)
1111
1112       $content->distance($dx,$dy)
1113           This moves to the start of the previously-written line, plus an
1114           offset by the given amounts, which are both required. "[0,0]" would
1115           overwrite the previous line, while "[0,36]" would place the new
1116           line 36pt above the old line (higher y). The $dx moves to the
1117           right, if positive.
1118
1119           "distance" is analogous to graphic's "move", except that it is
1120           relative to the beginning of the previous text write, not to the
1121           coordinate origin.  Note that subsequent text writes will be
1122           relative to this new starting (left) point and Y position! E.g., if
1123           you give a non-zero $dx, subsequent lines will be indented by that
1124           amount.
1125
1126       $content->cr()
1127       $content->cr($vertical_offset)
1128       $content->cr(0)
1129           If passed without an argument, moves (down) to the start of the
1130           next line (distance set by "leading"). This is similar to nl().
1131
1132           If passed with an argument, the "leading" distance is ignored and
1133           the next line starts that far up the page (positive value) or down
1134           the page (negative value) from the current line. "Y" increases
1135           upward, so a negative value would normally be used to get to the
1136           next line down.
1137
1138           An argument of 0 would simply return to the start of the present
1139           line, overprinting it with new text.  That is, it acts as a simple
1140           carriage return, without a linefeed.
1141
1142           Note that any setting for "leading" is ignored. If you wish to
1143           account for the "leading" setting, you may wish to use the "crlf"
1144           method instead.
1145
1146       $content->nl()
1147       $content->nl($indent)
1148       $content->nl(0)
1149           Moves to the start of the next line (see "leading"). If $indent is
1150           not given, or is 0, there is no indentation. Otherwise, indent by
1151           that amount (outdent if a negative value). The unit of measure is
1152           hundredths of a "unit of text space", or roughly 88 per em.
1153
1154           Note that any setting for "leading" is ignored. If you wish to
1155           account for the "leading" setting, you may wish to use the "crlf"
1156           method instead.
1157
1158       $content = $content->crlf()
1159           Moves to the start of the next line, based on the "leading"
1160           setting. It returns its own object, for ease of chaining.
1161
1162           If leading isn't set, a default distance of 120% of the font size
1163           will be used.
1164
1165           Added for compatibility with PDF::API2 changes; may be used to
1166           replace both "cr" and "nl" methods.
1167
1168       $width = $content->advancewidth($string, %opts)
1169           Options %opts:
1170
1171           'font' => $f3_TimesRoman
1172               Change the font used, overriding $self->{' font'}. The font
1173               must have been previously created (i.e., is not the name).
1174               Example: use Times-Roman.
1175
1176           'fontsize' => 12
1177               Change the font size, overriding $self->{' fontsize'}. Example:
1178               12 pt font.
1179
1180           'wordspace' => 0.8
1181               Change the additional word spacing, overriding
1182               $self->wordspace().  Example: add 0.8 pt between words.
1183
1184           'charspace' => -2.1
1185               Change the additional character spacing, overriding
1186               $self->charspace().  Example: subtract 2.1 pt between letters,
1187               to condense the text.
1188
1189           'hscale' => 125
1190               Change the horizontal scaling factor, overriding
1191               $self->hscale().  Example: stretch text to 125% of its natural
1192               width.
1193
1194           Returns the width of the $string (when set as a line of type),
1195           based on all currently set text-state attributes. These can
1196           optionally be overridden with %opts. Note that these values
1197           temporarily replace the existing values, not scaling them up or
1198           down. For example, if the existing charspace is 2, and you give in
1199           options a value of 3, the value used is 3, not 5.
1200
1201           Note: This does not affect the PDF in any way. It only tells you
1202           how much horizontal space a text string will take up.
1203
1204           Alternate name: "text_width"
1205
1206           This is provided for compatibility with PDF::API2.
1207
1208       Rendering Text
1209
1210       Single Lines
1211
1212       $width = $content->text($text, %opts)
1213           Adds text to the page (left justified).  The width used (in points)
1214           is returned.
1215
1216           Options:
1217
1218           'indent' => $distance
1219               Indents the text by the number of points (A value less than 0
1220               gives an outdent).
1221
1222           'underline' => 'none'
1223           'underline' => 'auto'
1224           'underline' => $distance
1225           'underline' => [$distance, $thickness, ...]
1226               Underlines the text. $distance is the number of units beneath
1227               the baseline, and $thickness is the width of the line.
1228               Multiple underlines can be made by passing several distances
1229               and thicknesses.  A value of 'none' means no underlining (is
1230               the default).
1231
1232               Example:
1233
1234                   # 3 underlines:
1235                   #   distance 4, thickness 1, color red
1236                   #   distance 7, thickness 1.5, color yellow
1237                   #   distance 11, thickness 2, color (strokecolor default)
1238                   'underline' => [4,[1,'red'],7,[1.5,'yellow'],11,2],
1239
1240           'strikethru' => 'none'
1241           'strikethru' => 'auto'
1242           'strikethru' => $distance
1243           'strikethru' => [$distance, $thickness, ...]
1244               Strikes through the text (like HTML s tag). A value of 'auto'
1245               places the line about 30% of the font size above the baseline,
1246               or a specified $distance (above the baseline) and $thickness
1247               (in points).  Multiple strikethroughs can be made by passing
1248               several distances and thicknesses.  A value of 'none' means no
1249               strikethrough. It is the default.
1250
1251               Example:
1252
1253                   # 2 strikethroughs:
1254                   #   distance 4, thickness 1, color red
1255                   #   distance 7, thickness 1.5, color yellow
1256                   'strikethru' => [4,[1,'red'],7,[1.5,'yellow']],
1257
1258       $width = $content->textHS($HSarray, $settings, %opts)
1259           Takes an array of hashes produced by HarfBuzz::Shaper and outputs
1260           them to the PDF output file. HarfBuzz outputs glyph CIDs and
1261           positioning information.  It may rearrange and swap characters
1262           (glyphs), and the result may bear no resemblance to the original
1263           Unicode point list. You should see examples/HarfBuzz.pl, which
1264           shows a number of examples with Latin and non-Latin text, as well
1265           as vertical writing.  https://www.catskilltech.com/Examples has a
1266           sample available in case you want to see some examples of what
1267           HarfBuzz can do, and don't yet have HarfBuzz::Shaper installed.
1268
1269           $HSarray
1270               This is the reference to array of hashes produced by
1271               HarfBuzz::Shaper, normally unchanged after being created (but
1272               can be modified). See "Using Shaper" in PDF::Builder::Docs for
1273               some things that can be done.
1274
1275           $settings
1276               This a reference to a hash of various pieces of information
1277               that textHS() needs in order to function. They include:
1278
1279               'script' => 'script_name'
1280                   This is the standard 4 letter code (e.g., 'Latn') for the
1281                   script (alphabet and writing system) you're using.
1282                   Currently, only Latn (Western writing systems) do kerning,
1283                   and 'Latn' is the default. HarfBuzz::Shaper will usually be
1284                   able to figure out from the Unicode points used what the
1285                   script is, and you might be able to use the set_script()
1286                   call to override its guess. However, PDF::Builder and
1287                   HarfBuzz::Shaper do not talk to each other about the script
1288                   being used.
1289
1290               'features' => array_of_features
1291                   This item is required, but may be empty, e.g.,
1292                   "$settings->{'features'} = ();".  It can include switches
1293                   using the standard HarfBuzz naming, and a + or - switch,
1294                   such as '-liga' to turn off ligatures. '-liga' and '-kern',
1295                   to turn off ligatures and kerning, are the only features
1296                   supported currently. Note that this is separate from any
1297                   switches for features that you send to HarfBuzz::Shaper
1298                   (with "$hb->add_features()", etc.) when you run it (before
1299                   textHS()).
1300
1301               'language' => 'language_code'
1302                   This item is optional and currently does not appear to have
1303                   any substantial effect with HarfBuzz::Shaper. It is the
1304                   standard code for the language to be used, such as 'en' or
1305                   'en_US'. You might need to define this for
1306                   HarfBuzz::Shaper, in case that system can't surmise the
1307                   language rules to be used.
1308
1309               'dir' => 'flag'
1310                   Tell textHS() whether this text is to be written in a Left-
1311                   To-Right manner (L, the default), Right-To-Left (R), Top-
1312                   To-Bottom (T), or Bottom-To-Top (B). From the script used
1313                   (Unicode points), HarfBuzz::Shaper can usually figure out
1314                   what direction to write text in. Also, HarfBuzz::Shaper
1315                   does not share its information with PDF::Builder -- you
1316                   need to separately specify the direction, unless you want
1317                   to accept the default LTR direction. You can use
1318                   HarfBuzz::Shaper's get_direction() call (in addition to
1319                   get_language() and get_script()) to see what HarfBuzz
1320                   thinks is the correct text direction. set_direction() may
1321                   be used to override Shaper's guess as to the direction.
1322
1323                   By the way, if the direction is RTL, HarfBuzz will reverse
1324                   the text and return an array with the last character first
1325                   (to be written LTR). Likewise, for BTT, HarfBuzz will
1326                   reverse the text and return a string to be written from the
1327                   top down. Languages which are normally written horizontally
1328                   are usually set vertically with direction TTB. If setting
1329                   text vertically, ligatures and kerning, as well as
1330                   character connectivity for cursive scripts, are
1331                   automatically turned off, so don't let the direction
1332                   default to LTR or RTL in the Shaper call, and then try to
1333                   fix it up in textHS().
1334
1335               align => 'flag'
1336                   Given the current output location, align the text at the
1337                   Beginning of the line (left for LTR, right for RTL),
1338                   Centered at the location, or at the End of the line (right
1339                   for LTR, left for RTL).  The default is B. Centered is
1340                   analogous to using text_center(), and End is analogous to
1341                   using text_right(). Similar alignments are done for TTB and
1342                   BTT.
1343
1344               'dump' => flag
1345                   Set to 1, it prints out positioning and glyph CID
1346                   information (to STDOUT) for each glyph in the chunk. The
1347                   default is 0 (no information dump).
1348
1349               'minKern' => amount (default 1)
1350                   If the amount of kerning (font character width differs from
1351                   glyph ax value) is larger than this many character grid
1352                   units, use the unaltered ax for the width (textHS() will
1353                   output a kern amount in the TJ operation).  Otherwise,
1354                   ignore kerning and use ax of the actual character width.
1355                   The intent is to avoid bloating the PDF code with
1356                   unnecessary tiny kerning adjustments in the TJ operation.
1357
1358           %opts
1359               This a hash of options.
1360
1361               'underline' => underlining_instructions
1362                   See text() for available instructions.
1363
1364               'strikethru' => strikethrough_instructions
1365                   See text() for available instructions.
1366
1367               'strokecolor' => line_color
1368                   Color specification (e.g., 'green', '#FF3377') for
1369                   underline or strikethrough, if not given in an array with
1370                   their instructions.
1371
1372           Text is sent separately to HarfBuzz::Shaper in 'chunks'
1373           ('segments') of a single script (alphabet), a single direction
1374           (LTR, RTL, TTB, or BTT), a single font file, and a single font
1375           size. A chunk may consist of a large amount of text, but at
1376           present, textHS() can only output a single line. For long lines
1377           that need to be split into column-width lines, the best way may be
1378           to take the array of hashes returned by HarfBuzz::Shaper and split
1379           it into smaller chunks at spaces and other whitespace. You may have
1380           to query the font to see what the glyph CIDs are for space and
1381           anything else used.
1382
1383           It is expected that when textHS() is called, that the font and font
1384           size have already been set in PDF::Builder code, as this
1385           information is needed to interpret what HarfBuzz::Shaper is
1386           returning, and to write it to the PDF file.  Needless to say, the
1387           font should be opened from the same file as was given to
1388           HarfBuzz::Shaper (ttfont() only, with .ttf or .otf files), and the
1389           font size must be the same. The appropriate location on the page
1390           must also already have been specified.
1391
1392           NOTE: as HarfBuzz::Shaper is still in its early days, it is
1393           possible that there will be major changes in its API. We hope that
1394           all changes will be upwardly compatible, but do not control this
1395           package and cannot guarantee that there will not be any
1396           incompatible changes that in turn require changes to PDF::Builder
1397           (textHS()).
1398
1399       $width = $content->advancewidthHS($HSarray, $settings, %opts)
1400           Returns text chunk width (in points) for Shaper-defined glyph
1401           array.  This is the horizontal width for LTR and RTL direction, and
1402           the vertical height for TTB and BTT direction.  Note: You must
1403           define the font and font size before calling advancewidthHS().
1404
1405           $HSarray
1406               The array reference of glyphs created by the HarfBuzz::Shaper
1407               call.  See textHS() for details.
1408
1409           $settings
1410               the hash reference of settings. See textHS() for details.
1411
1412               'dir' => 'L' etc.
1413                   the direction of the text, to know which "advance" value to
1414                   sum up.
1415
1416           %opts
1417               Options. Unlike advancewidth(), you cannot override the font,
1418               font size, etc. used by HarfBuzz::Shaper to calculate the glyph
1419               list.
1420
1421               'doKern' => flag (default 1)
1422                   If 1, cancel minor kerns per "minKern" setting. This flag
1423                   should be 0 (false) if -kern was passed to HarfBuzz::Shaper
1424                   (do not kern text).  This is treated as 0 if an ax override
1425                   setting is given.
1426
1427               'minKern' => amount (default 1)
1428                   If the amount of kerning (font character width differs from
1429                   glyph ax value) is larger than this many character grid
1430                   units, use the unaltered ax for the width (textHS() will
1431                   output a kern amount in the TJ operation).  Otherwise,
1432                   ignore kerning and use ax of the actual character width.
1433                   The intent is to avoid bloating the PDF code with
1434                   unnecessary tiny kerning adjustments in the TJ operation.
1435
1436           Returns total width in points.
1437
1438           Alternate name: "text_widthHS"
1439
1440   Advanced Methods
1441       $content->save()
1442           Saves the current graphics state on a PDF stack. See PDF definition
1443           8.4.2 through 8.4.4 for details. This includes the line width, the
1444           line cap style, line join style, miter limit, line dash pattern,
1445           stroke color, fill color, current transformation matrix, current
1446           clipping port, flatness, and dictname.  This method applies to both
1447           text and gfx/graphics objects.
1448
1449       $content->restore()
1450           Restores the most recently saved graphics state (see "save"),
1451           removing it from the stack. You cannot restore the graphics state
1452           (pop it off the stack) unless you have done at least one save
1453           (pushed it on the stack).  This method applies to both text and
1454           gfx/graphics objects.
1455
1456       $content->add(@content)
1457           Add raw content (arbitrary string(s)) to the PDF stream.  You will
1458           generally want to use the other methods in this class instead,
1459           unless this is in order to implement some PDF operation that
1460           PDF::Builder does not natively support. An array of multiple
1461           strings may be given; they will be concatenated with spaces between
1462           them.
1463
1464           Be careful when doing this, as you are dabbling in the black arts,
1465           directly setting PDF operations!
1466
1467           One interesting use is to split up an overly long object stream
1468           that is giving your editor problems when exploring a PDF file. Add
1469           a newline add("\n") every few hundred bytes of output or so, to do
1470           this. Note that you must use double quotes (quotation marks),
1471           rather than single quotes (apostrophes).
1472
1473           Use extreme care if inserting BT and ET markers into the PDF
1474           stream.  You may want to use textstart() and textend() calls
1475           instead, and even then, there are many side effects either way. It
1476           is generally not useful to suspend text mode with ET/textend and
1477           BT/textstart, but it is possible, if you really need to do it.
1478
1479           Another, useful, case is when your input PDF is from the Chrome
1480           browser printing a page to PDF with headers and/or footers. In some
1481           versions, this leaves the PDF page with a strange scaling (such as
1482           the page height in points divided by 3300) and the Y-axis flipped
1483           so 0 is at the top. This causes problems when trying to add
1484           additional text or graphics in a new text or graphics record, where
1485           text is flipped (mirrored) upsidedown and at the wrong end of the
1486           page. If this happens, you might be able to cure it by adding
1487
1488               $scale = .23999999; # example, 792/3300, examine PDF or experiment!
1489                ...
1490               if ($scale != 1) {
1491                   my @pageDim = $page->mediabox();     # e.g., 0 0 612 792
1492                   my $size_page = $pageDim[3]/$scale;  # 3300 = 792/.23999999
1493                   my $invScale = 1.0/$scale;           # 4.16666684
1494                   $text->add("$invScale 0 0 -$invScale 0 $size_page cm");
1495               }
1496
1497           as the first output to the $text stream. Unfortunately, it is
1498           difficult to predict exactly what $scale should be, as it may be
1499           3300 units per page, or a fixed amount. You may need to examine an
1500           uncompressed PDF file stream to see what is being used. It might be
1501           possible to get the input (original) PDF into a string and look for
1502           a certain pattern of "cm" output
1503
1504               .2399999 0 0 -.23999999 0 792 cm
1505
1506           or similar, which is not within a save/restore (q/Q). If the stream
1507           is already compressed, this might not be possible.
1508
1509       $content->addNS(@content)
1510           Like add(), but does not make sure there is a space between each
1511           element and before and after the new content. It is up to you to
1512           ensure that any necessary spaces in the PDF stream are placed there
1513           explicitly!
1514
1515       $content->compressFlate()
1516           Marks content for compression on output.  This is done
1517           automatically in nearly all cases, so you shouldn't need to call
1518           this yourself.
1519
1520           The new() call can set the compress parameter to 'flate' (default)
1521           to compress all object streams, or 'none' to suppress compression
1522           and allow you to examine the output in an editor.
1523
1524       $content->textstart()
1525           Starts a text object (ignored if already in a text object). You
1526           will likely want to use the text() method (text context, not text
1527           output) instead.
1528
1529           Note that calling this method, besides outputting a BT marker, will
1530           reset most text settings to their default values. In addition, BT
1531           itself will reset some transformation matrices.
1532
1533       $content->textend()
1534           Ends a text object (ignored if not in a text object).
1535
1536           Note that calling this method, besides outputting an ET marker,
1537           will output any accumulated poststream content.
1538
1539
1540
1541perl v5.38.0                      2023-07-21          PDF::Builder::Content(3)
Impressum