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