Images
Images are supported by mPDF: GIF, PNG, JPG, WMF, SVG, BMP, WEBP and generated images from PHP scripts.
Transparent GIF images are supported, and so are interlaced and transparent PNG files, including transparency using alpha channel.
JPG image | |
GIF with transparency | |
PNG with transparency | |
PNG with alpha channel | |
WMF image (will only show in IE or PDF) | |
SVG image (will only show in some browsers e.g. Firefox which support SVG, and PDF) | |
WEBP image (since v8.0.16; will only show in browsers with WEBP support) |
Debugging Errors: If you are having trouble with images not displaying correctly, set the
variable $mpdf->showImageErrors = true
.
Images are handled in mPDF as in-line elements.
Unlike the HTML specification, the width and height attributes of IMG will additionally take different
dimensions e.g. mm
, pt
etc.
<img src="image.jpg" width="90" /> // 90 pixels, just like HTML
<img src="image.jpg" width="90mm" /> // non-standard support for dimensions
<img src="image.jpg" style="width:90mm;" /> // Can also use CSS
Images for which the size is not defined are output at a default dpi set in by the img_dpi configuration variable:
<?php
$mpdf->img_dpi = 96;
In addition, many CSS style properties are supported including vertical-align
, as well
as some custom attributes such as opacity
and rotate
.
(See Supported CSS and HTML attributes)
Images can be used in:
- In-line images, including in HTML headers & footers
- Watermarks
- CSS background-image
Size constraint
When writing HTML, image size is automatically constrained to current margins and page position. An extra parameter added to end of the Image() function allows you to override this:
<?php
// the last "false" allows a full page picture
$mpdf->Image('files/images/frontcover.jpg', 0, 0, 210, 297, 'jpg', '', true, false);
This is useful for e.g. a cover page for your document.
This can be achieved using HTML and CSS like this:
<div style="position: absolute; left:0; right: 0; top: 0; bottom: 0;">
<img src="/files/images/frontcover.jpg"
style="width: 210mm; height: 297mm; margin: 0;" />
</div>
Float and Text wrapping
mPDF partially supports the CSS style float
with IMG elements. Text will wrap around these images, with certain limitations:
- only 1
float:right
and 1float:left
image are allowed at a time i.e. you cannot overlap 2 right or 2 left - the containing HTML element is extended at the bottom if necessary to enclose the last image (unlike your browser)
- the float is ignored if the image is too wide, inside a table, columns are on, or
div page-break-inside: avoid
is set - disabled when columns are being used
If ignored, the image is output as a normal in-line element.
Performance
- JPG images are quickest and most efficient.
- PNG images with no alpha channel and not interlaced are next best.
- GIF images are extremely slow if you do not have the appropriate GD library installed (above 2.0.8).
- GIF images with GD library installed are quite fast.
- PNG images which are interlaced or have alpha channel transparency, and GIF images use the GD library if it is installed.
Any process that requires the GD library uses a large amount of memory - to create a GD image in memory can use up to
10× the file size (e.g. a 690K GIF file read into imagecreatefromstring()
used about 5MB of PHP memory).
Dynamically generated Images
You can define a script which generates an image just as you can in HTML:
<img src="/files/my_file_generating_script.php?color=red" />
Embedded Image data
Embedded image data can be used either in <img>
elements or in CSS background
. gif, png and jpeg are supported.
<img src="data:image/gif;base64,...." />
div {
background: url(data:image/gif;base64,....) no-repeat 4px center;
}
Image data as a Variable
A PHP variable containing image data can be passed directly to mPDF. You need to allocate the data to an array item (changed in 7.0)
(you can make any name up) e.g.
<?php
$mpdf->imageVars['myvariable'] = file_get_contents('alpha.png');
The image can then be referred to by use of var:varname
instead of a file name, either in src=""
or
direct to Image()
function e.g.
<?php
$html = '<img src="var:myvariable" />';
$mpdf->WriteHTML($html);
<?php
$mpdf->Image('var:myvariable', 0, 0);
SVG images
mPDF partially supports SVG images, including as embedded HTML e.g.:
This is an embedded SVG image:
<svg>.....</svg>
All units with no dimension are taken as pixels.
Size of SVG image
The viewBox attribute of the <svg>
element is used (if present) to determine the intrinsic size of the image.
If viewBox is not present, a width and/or height be specified e.g. width="400" height="200"
NB preserveAspectRatio
is not supported.
If none of these are present, the intrinsic size will be set as the width of containing block (height = width).
Partially supported
- embedded images (but not embedded SVG/WMF [vector] images)
tspan
,tref
<use ../>
- gradient on text (fill)
<clipPath>
- embedded
<style>
elements* - automatic font selection for text*
As from mPDF 6.0 there is limited support for CSS classes and for automatic font selection (see the defined constants
at the top of \Mpdf\Svg
class).
Not supported
- filters
<marker>
- DOM
<pattern>
textlength
,lengthadjust
,toap
ortextPath
- gradient on stroke
* Note: SVG images can be embedded within the HTML code. They may be a useful way to deal with some presentation issues not supported by HTML/CSS e.g. Text used with a transformation, or text used as a clipPath e.g.
<body>
<div>
<svg width="100%" height="100%" viewBox="0 0 480 360">
<text x="100" y="-100" transform="rotate(60)" font-size="35">ROTATE</text>
<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
</svg>
<svg width="100%" height="100%" viewBox="0 0 480 360">
<defs>
<clipPath id="sample" clipPathUnits="userSpaceOnUse">
<text x="45" y="270" font-size="100" font-family="Impact">Clip Test</text>
</clipPath>
</defs>
<image xlink:href="bluesquidj.png" preserveAspectRatio="none" x="20" y="170" width="410" height="160" clip-path="url(#sample)"/>
<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
</svg>
</div>
</body>