Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 R Output: Arial Typeface

Comparision from this Article:Arial vs. Helvetica enter image description here

like image 961
jakob-r Avatar asked Oct 24 '12 11:10

jakob-r


3 Answers

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")
like image 78
Josh O'Brien Avatar answered Nov 14 '22 23:11

Josh O'Brien


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.

like image 32
Gavin Simpson Avatar answered Nov 15 '22 00:11

Gavin Simpson


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 :)

like image 41
user18428 Avatar answered Nov 15 '22 01:11

user18428