PDF::Builder::Resource::XObject::Image::SVG(3pm)

NAME
PDF::Builder::Resource::XObject::Image::SVG - Support routines for SVG (Scalable Vector Graphics) image library

Inherits from PDF::Builder::Resource::XObject::Image

Note that, unlike the output of other image formats, "image_svg()" returns an array of anonymous hashes, one for each <svg> tag within the SVG input. See "What is returned" below for details.

  METHODS

  new
    $res = PDF::Builder::Resource::XObject::Image::SVG->new($pdf, $file, %opts)

$file gives the SVG input (see the SVGPDF library for details and limitations). It may be a filename, a string reference (with SVG content), or a filehandle.

    Options:

    subimage => n
        If multiple "svg" entries are in an SVG file, and they are not combined by the SVGPDF "combine" option into one image, this permits selection of which image to display. Any n may be given, from 0 up to the number of "svg" images minus 1. The n-th element will be retained, and all others discarded. The default is to return the entire array, and not remove any elements, permitting display of mulitple images in any desired order. See the discussion on combining multiple images "Dealing with multiple image objects, and combining them". The default behavior of the display routine ("object") is to display only the first element (there must be at least one).

    MScore => flag
        If set to true (a non-zero value), a font callback for the 14 Microsoft Windows "core" extensions will be added to any other font callbacks given by the user. These include "Georgia" serif, "Verdana" sans-serif, and "Trebuchet" sans-serif fonts, and "Wingdings" and "Webdings" symbology fonts. Non-Windows systems usually don't include these "core" fonts, so it may be unsafe to use them.

        This option is enabled for all operating systems, not just MS Windows, so you can create PDFs that make use of Windows "core" fonts (extension). This does not guarantee that such fonts will be available on the machine used to read the resulting PDF!

    compress => flag
        If set to true (a non-zero value; default is 1), the resulting XObject stream will be compressed. This is what you would normally do. On the other hand, setting it to false (0) leaves the stream uncompressed. You may wish to do this if you want to examine the stream in the finished PDF, such as is done for the t-test.

    SVGPDF Options:

    These are options which, if given, are passed on to the SVGPDF library. Some of them are fixed by "image_svg" and can not be changed, while others are defaulted by "image_svg" but can be overridden by the user.

    You should consult the SVGPDF library documentation for more details on such options.

    pdf => PDF object
        This is automatically set by the SVG routine, and can not be overridden by the user. It is passed to "SVGPDF->new()".

    fontsize => n
        This is the font size (in points) for SVGPDF to use to scale text and figure the em and ex sizes. The default is 12 points. It is passed on to both the "SVGPDF->new()" and "$svg->process()" SVGPDF methods.

    pagesize => [ width, height ]
        This is the maximum dimensions of the resulting object, in case there are no dimensions given, or they are too large to display. The default is 595 pt x 842 pt (A4 page size), internal to SVGPDF. It is passed to "SVGPDF->new()".

    grid => n
        The default is 0. A value greater than 0 indicates the spacing (in points) of a grid for development/debugging purposes. It is passed to "SVGPDF->new()".

    verbose => n
        It defaults to 0 (fatal messages only), but the user may set it to a higher value for outputting informational messages. It is passed to "SVGPDF->new()".

    fc => \&fonthandler_callback
        This is a list of one or more callbacks for the font handler. If the "MScore" flag is true (see above), another callback will be added to the list to handle MS Windows "core" font faces. It is passed to "SVGPDF->new()".

        Note that some supporting packages, such as GnuPlot, make use of Windows fonts such as Arial, which may or may not be installed on non-Windows platforms, and even for Windows, would need to be added to FontManager. You should check the resulting SVG files produced by Third-Party packages to see what fonts they are expecting. MathJax creates text characters as filled outlines in SVG, and does not appear to use any standard fonts.

    combine => 'method'
        If there are multiple XObjects defined by an SVG (due to multiple "svg" entries), they may be combined into a single XObject. The default is none, which does not combine XObjects. Currently, the only other supported method is stacked, which vertically stacks images, with "sep" spacing between them. At this writing, the bbox combine method is not supported by SVGPDF, but may be in the future. It is passed to "$svg->process()".

    sep => n
        Vertical space (in points) to add between individual images when "combine" is not 'none'. The default is 0 (no space between images). It is passed to "$svg->process()".

What is returned

Returns an image in the SVG. Unlike other image formats, it is not actually some form of image object, but an array (of at least one element) containing XObjects of the SVG converted into PDF graphics and text commands. If an SVG includes a pixel-based image, that image will be scaled up and down in the normal image way, while PDF graphics and text are always fully scalable, both when setting an image size and when zooming in and out in a PDF Reader.

A returned "object" is always an array of hashes (including the XObject as one of the elements), one per "svg" tag. Note that "svg"s must be peers (top-level), and may not be nested one within another! In most applications, an SVG file will have one "svg" tag and thus a single element in the array. However, some SVGs will produce multiple array elements from multiple "svg" tags.

Dealing with multiple image objects, and combining them

If you don't set "subimage", the full array will be returned. If you set "subimage => n", where n is a valid element number (0...), all elements except the n-th will be discarded, leaving a single element array. When it comes time for object() to display this XObject array, the first (0th) element will be displayed, and any other elements will be ignored. Thus, the default behavior is effectively "subimage => 0". You may call either "object" or "image", as "image" will simply pass everything on to "object".

Remember that not setting "subimage" will cause the entire array to be returned. You are free to rearrange and/or subset this array, if you wish. If you want to display (in the PDF) multiple images, you can select one or more of the array elements to be processed (see the examples). If you want to stack all of them vertically, perhaps with some space between them, consider using the "combine => 'stacked'" option, but be aware that the total height of the single resulting image may be too large for your page! You may need to output them separately, as many as will fit on a page.

This leaves the possibility of overlaying multiple images to overlap in one large combined image. You have the various width and height (and bounding box coordinates), so it is possible to align images to have the same origin. SVGPDF may get "combine => 'bbox'" at some point in the future, to automate this, but for the time being you need to do it yourself. Keep an eye out for different "svg"s scaled at different sizes; they may need rescaling to overlay properly.