查看原文
其他

R tips:extrafont包用导出中文pdf

冰糖 生信菜鸟团 2022-08-23

extrafont包用于解决R不支持导出中文pdf的解决方案应该很早就有了,但是具体使用的时候,发现这个包有一个很容易踩坑的地方:

  • extrafont解决中文pdf的解决方案根本无法复现,主要表现是

  • 如果正确使用extrafont包。

为何无法正确导入系统字体

extrafont导入系统字体失败:

搜索一下导入失败的原因,发现是依赖包Rfft2ps1的原因,解决方案是可以通过如下方式重新安装:

remotes::install_version("Rttf2pt1", version = "1.3.8")

然而这个包也比较坑,看似安装成功,其实并没有完成安装,安装过程中的make编译步骤有一堆的警告。

如何解决Rttf2pt1的安装

Rttf2pt1包其实就是包装了ttf2pt1字体转换工具,它用于将ttf字体文件转换为PostScript Type 1格式的字体文件,然后extrafont才可以导入这些字体。

既然ttf2pt1没有正确编译,可以去下载已经编译好的版本以替换Rttf2pt1的相应文件。

就算本机有RTools以及MinGW等编译环境也不行,原因在于make编译的时候路径中不能有空格,所以R如果安装在Program Files之类的路径中就就很难解决。

如果你的R的安装路径恰好没有空格,在编译环境配置正确的情况下,这个包应该是能完成安装的。

Rttf2pt1中编译好的ttf2pt1在Rttf2pt1包目录下的exec目录中:

system.file("exec", package = "Rttf2pt1")
# [1] "D:/Program Files/R/R-4.1.1/library/Rttf2pt1/exec"

dir(system.file("exec", package = "Rttf2pt1"))
# [1] "ttf2pt1.exe"

可以从下述地方下载编译好的二进制版本,解压后去覆盖上述文件即可:

http://gnuwin32.sourceforge.net/packages/ttf2pt1.htm

如下图所示,由于我的电脑已经导入过一次了,所以这些字体就不会重新导入了。目前可用字体有224种。

length(extrafont::fonts())
#[1] 224

要是此时还是无法正确导入字体,应该怎么办?可以尝试一下终极办法,直接替换extrafont的字体库。

extrafont导入成功后的字体文件是extrafontdb包在管理,只需要在另一台正确导入字体的电脑上将相应的extrafont字体文件覆盖extrafontdb包的相应文件即可。

system.file(package = "extrafontdb")
# [1] "D:/Program Files/R/R-4.1.1/library/extrafontdb"

dir(system.file(package = "extrafontdb"))
# [1] "DESCRIPTION" "fontmap"     "help"        "html"        "INDEX"       "MD5"         "Meta"        "metrics"     "NAMESPACE"   "R"   

真正需要替换的只需要fontmap和metrics两个文件夹即可。如果需要可以从这里下载:

链接:https://pan.baidu.com/s/1kCbVTfVYUi-L5KzTlbINAw
提取码:bm26

测试使用

如果需要使用微软雅黑字体的话,由于微软雅黑在本机是ttc文件,无法被ttf2pt1转换,自然也无法被extrafont导入,解决办法是网上下载一个微软雅黑的ttf文件,然后导入即可。

注意最后导出pdf的时候要是用cairo_pdf设备,而不是默认的pdf设备。

下面是一些常见中文字体的在导入extrafont后的字体名称:

  • 等线:DengXian

  • 方正姚体:FZYaoTi

  • 仿宋:FangSong

  • 黑体:SimHei

  • 微软雅黑:Microsoft YaHei

  • 幼圆:YouYuan

library(extrafont)
library(tidyverse)

# ttf2pt1二进制下载,替换Rttf2pt1 ---->
ttf_import()

# 如果ttf_import失败,可以下载上面已经导入好的extrafontdb包的字体文件,
# 并替换本机extrafontdb包中的相应文件

# 手动下载微软雅黑.ttf到D:\\ChromeDownloads
ttf_import(
  "D:\\ChromeDownloads"
)

loadfonts(device = "win")
extrafont::fonts()
extrafont::fonttable()

# 测试导出pdf
p <- data.frame(x = 1, y = 1, label = "测试中文字体")  %>% 
  ggplot(aes(x=x, y=y, label=label)) +
  geom_text()

cairo_pdf("测试中文字体.pdf", family = "Microsoft YaHei")
p
dev.off()

可以发现微软雅黑的字体已经正确输出到了pdf文件中。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存