pdf {grDevices} | R Documentation |
PDF Graphics Device
Description
pdf
starts the graphics device driver for producing PDF
graphics.
Usage
pdf(file = if(onefile) "Rplots.pdf" else "Rplot%03d.pdf",
width, height, onefile, family, title, fonts, version,
paper, encoding, bg, fg, pointsize, pagecentre, colormodel,
useDingbats, useKerning, fillOddEven, compress)
Arguments
file |
a character string giving the file path. See the section ‘File specifications’ for further details. |
width , height |
the width and height of the graphics region in
inches. The default values are |
onefile |
logical: if true (the default) allow multiple figures
in one file. If false, generate a file with name containing the page
number for each page. Defaults to |
family |
the initial font family to be used, normally as a
character string. See the section ‘Families’. Defaults to
|
title |
title string to embed as the ‘/Title’ field in the
file. Defaults to |
fonts |
a character vector specifying R graphics font family
names for additional fonts which will be included in the PDF file.
Defaults to |
version |
a string describing the PDF version that will be
required to view the output. This is a minimum, and will be
increased (with a warning) if necessary. Defaults to |
paper |
the target paper size. The choices are
|
encoding |
the name of an encoding file. Defaults to
The file is looked for in the ‘enc’ directory of package
grDevices if the path does not contain a path separator. An
extension |
bg |
the initial background color to be used. Defaults to
|
fg |
the initial foreground color to be used. Defaults to
|
pointsize |
the default point size to be used. Strictly
speaking, in bp, that is 1/72 of an inch, but approximately in
points. Defaults to |
pagecentre |
logical: should the device region be centred on the
page? – is only relevant for |
colormodel |
a character string describing the color model:
currently allowed values are |
useDingbats |
logical. Should small circles be rendered
via the Dingbats font? Defaults to For Unix-alikes (including macOS) see the ‘Note’ for a possible fix for some viewers. |
useKerning |
logical. Should kerning corrections be included in
setting text and calculating string widths? Defaults to |
fillOddEven |
logical controlling the polygon fill mode: see
|
compress |
logical. Should PDF streams be generated with Flate
compression? Defaults to |
Details
All arguments except file
default to values given by
pdf.options()
. The ultimate defaults are quoted in the
arguments section.
pdf()
opens the file file
and the PDF commands needed to
plot any graphics requested are sent to that file.
The family
argument can be used to specify a PDF-specific
font family as the initial/default font for the device. If additional
font families are to be used they should be included in the
fonts
argument.
If a device-independent R graphics font family is specified (e.g., via
par(family = )
in the graphics package), the PDF device makes use
of the PostScript font mappings to convert the R graphics font family
to a PDF-specific font family description. (See the
documentation for pdfFonts
.)
This device does not embed fonts in the PDF file, so it is only
straightforward to use mappings to the font families that can be
assumed to be available in any PDF viewer: "Times"
(equivalently "serif"
), "Helvetica"
(equivalently
"sans"
) and "Courier"
(equivalently "mono"
).
Other families may be specified, but it is the user's responsibility
to ensure that these fonts are available on the system and third-party
software (e.g., Ghostscript) may be required to embed the fonts so
that the PDF can be included in other documents (e.g., LaTeX): see
embedFonts
. The URW-based families described for
in section ‘Families’.can be used with viewers, platform dependently:
- on Unix-alikes
viewers set up to use URW fonts, which is usual with those based on
xpdf
or Ghostscript.- on Windows
viewers such as GSView which utilise URW fonts.
Since embedFonts
makes use of Ghostscript, it should be
able to embed the URW-based families for use with other viewers.
The PDF produced is fairly simple, with each page being represented as a single stream (by default compressed and possibly with references to raster images). The R graphics model does not distinguish graphics objects at the level of the driver interface.
The version
argument declares the version of PDF that gets
produced. The version must be at least 1.2 when compression is used,
1.4 for semi-transparent output to be understood, and at least 1.3 if
CID fonts are to be used: if any of these features are used the
version number will be increased (with a warning). (PDF 1.4 was first
supported by Acrobat 5 in 2001; it is very unlikely not to be
supported in a current viewer.)
Line widths as controlled by par(lwd = )
are in multiples of
1/96 inch. Multiples less than 1 are allowed. pch = "."
with
cex = 1
corresponds to a square of side 1/72 inch, which is
also the ‘pixel’ size assumed for graphics parameters such as
"cra"
.
The paper
argument sets the ‘/MediaBox’ entry in the file,
which defaults to width
by height
. If it is set to
something other than "special"
, a device region of the
specified size is (by default) centred on the rectangle given by the
paper size: if either width
or height
is less
than 0.1
or too large to give a total margin of 0.5 inch, it is
reset to the corresponding paper dimension minus 0.5. Thus if you
want the default behaviour of postscript
use
pdf(paper = "a4r", width = 0, height = 0)
to centre the device region
on a landscape A4 page with 0.25 inch margins.
When the background colour is fully transparent (as is the initial default value), the PDF produced does not paint the background. Most PDF viewers will use a white canvas so the visual effect is if the background were white. This will not be the case when printing onto coloured paper, though.
File specifications
Tilde expansion (see path.expand
) is done on the
file
argument. An input with a marked encoding is converted to
the native encoding or an error is given.
For use with onefile = FALSE
, give a C integer format such as
"Rplot%03d.pdf"
(the default in that case) which is expanded
using the page number, so this uses files ‘Rplot001.pdf’, ...,
‘Rplot999.pdf’, ‘Rplot1000.pdf’,
A single integer format matching the regular expression
"%[#0 +=-]*[0-9.]*[diouxX]"
is allowed in file
. The
character string should not otherwise contain a %
: if it is
really necessary, use %%
in the string for %
in the
file path.
For pdf
, file
can be NULL
when no external file
is created (effectively, no drawing occurs), but the device may still
be queried (e.g., for the size of text by (base graphics)
strwidth
or (grid)
stringWidth
).
Families
Font families are collections of fonts covering the five font faces,
(conventionally plain, bold, italic, bold-italic and symbol) selected
by the graphics parameter par(font = )
or the grid
parameter gpar(fontface = )
. Font families can be
specified either as an initial/default font family for the device
via the family
argument or after the device is opened by
the graphics parameter par(family = )
or the grid
parameter gpar(fontfamily = )
. Families which will be
used in addition to the initial family must be specified in the
fonts
argument when the device is opened.
Font families are declared via a call to pdfFonts
or postscriptFonts
.
The argument family
specifies the initial/default font family
to be used. In normal use it is one of "AvantGarde"
,
"Bookman"
, "Courier"
, "Helvetica"
,
"Helvetica-Narrow"
, "NewCenturySchoolbook"
,
"Palatino"
or "Times"
, and refers to the standard Adobe
PostScript fonts families of those names which are included (or
cloned) in all common PDF/PostScript renderers.
Many PDF/PostScript renders (including those based on
Ghostscript) use the URW equivalents of these fonts, which are
"URWGothic"
, "URWBookman"
, "NimbusMon"
,
"NimbusSan"
, "NimbusSanCond"
, "CenturySch"
,
"URWPalladio"
and "NimbusRom"
respectively. If your
viewer is using URW fonts, you will obtain access to more characters
and more appropriate metrics by using these names. To make these
easier to remember, "URWHelvetica" == "NimbusSan"
and
"URWTimes" == "NimbusRom"
are also supported. However, if the
viewer is not using URW fonts (for example Adobe Acrobat Reader) it
may substitute inappropriately or not render at all. (Consider using
embedFonts
.)
As from R 4.4.0 there is support for URW 2.0 fonts in
families "URW2Helvetica"
(with ‘Oblique’ fonts),
"URW2HelveticaItalic"
(with ‘Italic’ fonts),
"URW2Times"
and "NimbusMonoPS"
. As recent versions of
Ghostscript will render with (and embed) these fonts. these families
should be used instead of "URWHelvetica"
, "URWTimes"
,
"NimbusSan"
, "NimbusRom"
, and "NimbusMon"
Another type of family makes use of CID-keyed fonts for East Asian
languages – see pdfFonts
.
The family
argument is normally a character string naming a
font family, but family objects generated by Type1Font
and CIDFont
are also accepted. For compatibility with
earlier versions of R, the initial family can also be specified as a
vector of four or five afm files.
Note that R does not embed the font(s) used in the PostScript output:
see embedFonts
for a utility to help do so.
Viewers and embedding applications frequently substitute fonts for
those specified in the family, and the substitute will often have
slightly different font metrics. useKerning = TRUE
spaces the
letters in the string using kerning corrections for the intended
family: this may look uglier than useKerning = FALSE
.
Encodings
Encodings describe which glyphs are used to display the character codes
(in the range 0–255). Most commonly R uses ISOLatin1 encoding, and
the examples for text
are in that encoding. However,
the encoding used on machines running R may well be different, and by
using the encoding
argument the glyphs can be matched to
encoding in use. This suffices for European and Cyrillic languages,
but not for East Asian languages. For the latter, composite CID fonts are
used. These fonts are useful for other languages: for example they
may contain Greek glyphs. (The rest of this section applies only when CID
fonts are not used.)
None of this will matter if only ASCII characters (codes 32–126) are
used as all the encodings (except "TeXtext"
) agree over that
range. Some encodings are supersets of ISOLatin1. However, if
accented and special characters do not come out as you expect, you may
need to change the encoding. Some other encodings are supplied with
R: "ISOLatin2.enc"
(Central/Eastern Europe),
"ISOLatin7.enc"
(ISO 8859-13, ‘Baltic Rim’),
"ISOLatin9.enc"
(ISO 8859-15, including Euro),
"Cyrillic.enc"
(ISO 8859-5), "KOI8-R.enc"
,
"KOI8-U.enc"
, and the Windows encodings "WinAnsi.enc"
(also known as "CP1252.enc"
, "CP1250.enc"
(Central/Eastern Europe), "CP1251.enc"
(Cyrillic),
"Greek.enc"
(ISO 8859-7), "CP1253.enc"
(modern Greek)
and "CP1257.enc"
(‘Baltic Rim’). Note that many glyphs
in these encodings are not in the fonts corresponding to the standard
families. (The Adobe ones for all but Courier, Helvetica and Times
cover little more than Latin-1, whereas the URW ones also cover
Latin-2, Latin-7, Latin-9 and Cyrillic but no Greek. The Adobe
exceptions cover the Latin character sets, but not the Euro.)
NB: support for encodings other than "ISOLatin1.enc"
(and the
Windows ones on Windows) depends on support by the platform's
libiconv
in a UTF-8 locale.
If you specify the encoding, it is your responsibility to ensure that the PostScript font contains the glyphs used. One issue here is the Euro symbol which is in several encodings (including WinAnsi and ISOLatin9 encodings) but may well not be in the PostScript fonts. (It is in the URW variants; it is not in the supplied Adobe Font Metric files so will not be centred correctly.)
There is an exception. Character 45 ("-"
) is always set
as minus (its value in Adobe ISOLatin1) even though it is hyphen in
the other encodings. Hyphen is available as character 173 (octal
0255) in all the Latin encodings, Cyrillic and Greek. (This can be
entered as "\u00ad"
in a UTF-8 locale.) There are some
discrepancies in accounts of glyphs 39 and 96: the supplied encodings
(except CP1250 and CP1251) treat these as ‘quoteright’ and
‘quoteleft’ (rather than ‘quotesingle’/‘acute’
and ‘grave’ respectively), as they are in the Adobe
documentation.
Color models
The default color model ("srgb"
) is sRGB. Model "gray"
(or "grey"
) maps sRGB colors to greyscale using perceived
luminosity (biased towards green). "cmyk"
outputs in CMYK
colorspace. The simplest possible conversion from sRGB to CMYK is
used
(https://en.wikipedia.org/wiki/CMYK_color_model#Mapping_RGB_to_CMYK),
and raster images are output in RGB.
Also available for backwards compatibility is model "rgb"
which
uses uncalibrated RGB and corresponds to the model used with that name
in R prior to 2.13.0. Some viewers may render some plots in that
colorspace faster than in sRGB, and the plot files will be smaller.
Conventions
This section describes the implementation of the conventions for graphics devices set out in the ‘R Internals’ manual.
The default device size is 7 inches square.
Font sizes are in big points.
The default font family is Helvetica.
Line widths are as a multiple of 1/96 inch, with a minimum of 0.01 enforced.
Circles of any radius are allowed. If
useDingbats = TRUE
, opaque circles of less than 10 big points radius are rendered using char 108 in the Dingbats font: all semi-transparent and larger circles using a Bézier curve for each quadrant.Colours are by default specified as sRGB.
At very small line widths, the line type may be forced to solid.
Printing
Except on Windows it is possible to print directly from pdf
by
something like (this is appropriate for a CUPS printing system):
pdf("|lp -o landscape", paper = "a4r")
This forces onefile = TRUE
.
Note
If you have drawn any typeset glyphs (see glyphInfo
)
then it is highly recommended that you use
embedGlyphs
to embed the relevant fonts.
Note
If you see problems with PDF output, do remember that the problem is much more likely to be in your viewer than in R. Try another viewer if possible. Symptoms for which the viewer has been at fault are apparent grids on image plots (turn off graphics anti-aliasing in your viewer if you can) and missing or incorrect glyphs in text (viewers silently doing font substitution).
Unfortunately the default viewers on most Linux and macOS systems have these problems, and no obvious way to turn off graphics anti-aliasing.
Acrobat Reader does not use the fonts specified but rather emulates them from multiple-master fonts. This can be seen in imprecise centering of characters, for example the multiply and divide signs in Helvetica. This can be circumvented by embedding fonts where possible. Most other viewers substitute fonts, e.g. URW fonts for the standard Helvetica and Times fonts, and these too often have different font metrics from the true fonts.
Acrobat Reader can be extended by ‘font packs’, and these will be needed for the full use of encodings other than Latin-1 (although they may be offered for download as needed).
- On some Unix-alike systems:
-
If
useDingbats = TRUE
, the default plotting characterpch = 1
was displayed in some PDF viewers incorrectly as a"q"
character. (These seem to be viewers based on the ‘poppler’ PDF rendering library). This may be due to incorrect or incomplete mapping of font names to those used by the system. Adding the following lines to ‘~/.fonts.conf’ or ‘/etc/fonts/local.conf’ may circumvent this problem, although this has largely been corrected on the affected systems.<fontconfig> <alias binding="same"> <family>ZapfDingbats</family> <accept><family>Dingbats</family></accept> </alias> </fontconfig>
Some further workarounds for problems with symbol fonts on viewers using ‘fontconfig’ are given in the ‘Cairo Fonts’ section of the help for
X11
. - On Windows:
-
The TeXworks PDF viewer was one of those which has been seen to fail to display Dingbats (used by e.g.
pch = 1
) correctly. Whereas on other platforms the problems seen were incorrect output, on Windows points were silently omitted: however recent versions seem to manage to display Dingbats.
There was a different font bug in the pdf.js
viewer included
in Firefox: that mapped Dingbats to the Symbol font and so displayed
symbols such pch = 1
as lambda.
See Also
pdfFonts
, pdf.options
,
embedFonts
, glyphInfo
,
Devices
,
postscript
.
cairo_pdf
and (on macOS only) quartz
for other devices that can produce PDF.
More details of font families and encodings and especially handling text in a non-Latin-1 encoding and embedding fonts can be found in
Paul Murrell and Brian Ripley (2006). “Non-standard fonts in PostScript and PDF graphics.” R News, 6(2), 41–47. https://www.r-project.org/doc/Rnews/Rnews_2006-2.pdf.
Examples
## Test function for encodings
TestChars <- function(encoding = "ISOLatin1", ...)
{
pdf(encoding = encoding, ...)
par(pty = "s")
plot(c(-1,16), c(-1,16), type = "n", xlab = "", ylab = "",
xaxs = "i", yaxs = "i")
title(paste("Centred chars in encoding", encoding))
grid(17, 17, lty = 1)
for(i in c(32:255)) {
x <- i %% 16
y <- i %/% 16
points(x, y, pch = i)
}
dev.off()
}
## there will be many warnings.
TestChars("ISOLatin2")
## this does not view properly in older viewers.
TestChars("ISOLatin2", family = "URWHelvetica")
## works well for viewing in gs-based viewers, and often in xpdf.