|
|
|
Advertisement
|
PDF documents permit the drawing of images with vector graphics primitives. PDF::Writer supports these primitives and adds a few more complex shapes of its own. Vector graphics are based on tracing paths and either drawing the lines along those paths (called “stroking” in PDF) or filling between the paths, as opposed to “sampled” (bitmapped) images—SVG as opposed to PNG.
PDF::Writer does not yet support SVG (Scalable Vector Graphics)[13] or EPS (Encapsulated PostScript®)[14] document insertion natively, but in time there will be a native API for inserting an SVG image document similar to those provided for bitmapped images. EPS support should be possible not long after.
The comparison with SVG is apt, as there are clear differences between the two drawing formats. With SVG, when a line draw command is given, a visible line is drawn between the two points. With PDF, an invisible path is drawn. The path is not made visible until it is either stroked or filled. There is a further distinction to how paths work, but curved paths are supported in PDF documents with cubic Bézier curves[15]; SVG supports both cubic and quadratic Bézier curves.
PDF::Writer offers the basic primitives (#move_to,
#line_to, #curve_to and variants,
#rectangle, and #close) and more complex
shapes that draw complete paths (#line, #curve
and variants, #circle_at, #ellipse_at,
#ellipse2_at, #segment_at,
#polygon, #rounded_rectangle, and
#star). These drawn paths may be stroked or filled with
#stroke and #fill and variants. The following
demonstrates many of these drawing operations:
# This is a modified version of demo/pac.rb.
require 'pdf/writer'
pdf = PDF::Writer.new(:orientation =< :landscape)
pdf.fill_color Color::RGB::Black
pdf.rectangle(0, 0, pdf.page_width, pdf.page_height).fill
# Wall
pdf.fill_color Color::RGB::Magenta
pdf.stroke_color Color::RGB::Cyan
pdf.rounded_rectangle(20, 500, 750, 20, 10).close_fill_stroke
pdf.rounded_rectangle(20, 200, 750, 20, 10).close_fill_stroke
# Body
pdf.fill_color Color::RGB::Yellow
pdf.stroke_color Color::RGB::Black
pdf.circle_at(150, 350, 100).fill_stroke
# Mouth
pdf.fill_color Color::RGB::Black
pdf.segment_at(150, 350, 100, 100, 30, -30).close_fill_stroke
# Dot
pdf.fill_color Color::RGB::Yellow
pdf.circle_at(250, 350, 20).fill_stroke
pdf.circle_at(300, 350, 10).fill_stroke
pdf.circle_at(350, 350, 10).fill_stroke
pdf.circle_at(400, 350, 10).fill_stroke
pdf.circle_at(450, 350, 10).fill_stroke
# Ghost
pdf.fill_color Color::RGB::Blue
pdf.stroke_color Color::RGB::Cyan
pdf.move_to(500, 250).line_to(500, 425).
curve_to(550, 475, 600, 475, 650, 425).line_to(650, 250).
line_to(625, 275).line_to(600, 250).line_to(575, 275).
line_to(550, 250).line_to(525, 275).line_to(500, 250).
fill_stroke
# Ghost Eyes
pdf.fill_color Color::RGB::White
pdf.rectangle(525, 375, 25, 25).fill
pdf.rectangle(575, 375, 25, 25).fill
pdf.fill_color Color::RGB::Black
pdf.rectangle(525, 375, 10, 10).fill
pdf.rectangle(575, 375, 10, 10).fill
pdf.save_as("pac.pdf")
PDF::Writer supports charts and tables, too. As of this writing, only one chart type (a standard deviation) is supported, but others will be added over time.
This chart type shows the average value of a series of data and the standard deviations from those values. The average value is plotted as a point on a scale; the standard deviation values will be plotted as bars above and below that point. This is a fixed-height, variable-width chart that will wrap to a second chart if there more columns than can be displayed.
require 'pdf/writer'
require 'pdf/charts/stddev'
pdf = PDF::Writer.new
PDF::Charts::StdDev.new do |chart|
chart.data <<
PDF::Charts::StdDev::DataPoint.new(1, 4.0000, 0.5774) <<
PDF::Charts::StdDev::DataPoint.new(2, 4.8333, 0.3727) <<
PDF::Charts::StdDev::DataPoint.new(3, 3.8333, 0.3727) <<
PDF::Charts::StdDev::DataPoint.new(4, 4.0000, 0.5774) <<
PDF::Charts::StdDev::DataPoint.new(5, 4.3333, 0.7454) <<
PDF::Charts::StdDev::DataPoint.new(6, 3.8000, 0.4000) <<
PDF::Charts::StdDev::DataPoint.new(7, 4.1667, 0.8975) <<
PDF::Charts::StdDev::DataPoint.new(8, 4.0000, 0.8165) <<
PDF::Charts::StdDev::DataPoint.new("Tot.", 4.1277, 0.7031)
chart.scale.show_labels = true
chart.render_on pdf
end
pdf.save_as('stddev.pdf')
|
Sponsored Links
|