pdf device and font family "Arial" / Or: Change font name (not font) in PDF

I have a problem with typefaces and PDF-Output in R. On this windows machine there is no Helvetica and the Font used by the device seems to be Arial as you can see below. The simple problem is, that Arial is used (as I want it to be) but editing the PDF-File it says Helvetica is used. How can I get R to write the correct Name into the PDF-file. pdf(...,family="Arial") won't work, as this family is not known (grDevices version 2.15.1).

Or can I substitude this font in the PDF afterwards, creating a file with the font I want?

R-PDF-Output

Comparision from this Article:Arial vs. Helvetica

Answers


You need to set a new font family for use with pdf(). This requires you to have Adobe Font Metric files (*.afm files) for the fonts you wish to use. You can convert the .tty files to .afm ones or find .afm files for Arial on the interweb if you don't already have them.

Arial <- Type1Font(family = "Arial",
                   metrics = c("ArialMT.afm",
                               "arial-BoldMT.afm", 
                               "Arial-ItalicMT.afm",
                               "Arial-BoldItalicMT.afm"))

where the character vector metrics contains the paths to the relevant .afm files, The files should be specified in this order:

  1. plain face
  2. bold face
  3. italic face
  4. bold-italic face

The you use the pdfFonts() function to add a mapping to these new fonts

pdfFonts(Arial = Arial)

where Arial is the object produced by Type1Font() earlier.

The final step is to use the family argument in pdf() which refers to one of the existing families as defined by pdfFonts():

pdf("testArial.pdf", family = "Arial")
plot(1:10, 1:10)
dev.off()

I haven't tried this as I don't have Arial on my system nor too many .afm files lying around, but I pieced this together from several sources:

  1. Paul Murrell and Brian Ripley (2006) Non-standard fonts in PostScript and PDF graphics. R News, 6(2):41-47. PDF
  2. A posting by David L. Carlson on the R mailing list from earlier this year.

An alternative depending on how your system is set-up is to a Cairo-based PDF device as that will use the functions of your system to identify and load fonts based simply on their name. See ?cairo_pdf and then the Cairo Fonts section of ?X11 for details.


R by default does not embed fonts. It just specifies that a Helvetica is to be used. You're probably best off embedding fonts. There's two ways to do that, either use the cairo_pdf device or the extrafont package with the usual pdf device. cairo_pdf is a lot simpler, but the output differs in subtle ways from pdf.


As it is stated in the one of the comments, base 14 fonts does'nt need to be embedded and Helvetica is one of these fonts.PDF consumers are supposed to provide replacements for such fonts and Arial (or Arial MT) is often used in place of Helvetica.

I'm not familiar with R but you seem to be able to embed fonts afterward

edit: This question's answer explains how to embed fonts afterward with ghostscript, just be sure to have GS map Helvetica (or Arial) to the version of the font you want. Thanks to Gavin Simpson for having me search for that :)


Since R-3.1.0, this is much more straightforward. Now, to get an Arial font, just set family="ArialMT":

pdf("Arial.pdf", height=0.3, width=1.45, family="ArialMT")
grid::grid.text("CGJQRSafrst1237")
dev.off()

Quoting from the April 2014 R-3.1.0 release notes:

There is a new family, "ArialMT", for the pdf() and postscript() devices. This will only be rendered correctly on viewers which have access to Monotype TrueType fonts (which are sometimes requested by journals).

To ensure that the pdf will be rendered correctly wherever it's viewed, you'll need to also embed the required Arial fonts in the document. Here's one easy way to do that:

library(extrafont)
loadfonts()  ## Really only needed the first time you use extrafont
## Modify this to point to the corresponding Ghostscript executable on your own machine
Sys.setenv(R_GSCMD = "C:/Program Files/gs/gs9.07/bin/gswin64c.exe")
embed_fonts("Arial.pdf")

Need Your Help

DOSBox: debug.exe reads file - processes commands incorrectly

assembly dosbox x86-16

I'm trying to use DOSBox with debug.exe on a 64-bit system. It works perfectly fine if I enter the commands manually. When I redirect input from a file with: