RでPDFファイルをPNGファイルに変換する方法を検索したので、その方法をメモします。
PDFからPNGへの変換が必要になった理由
ggplotを使っていて、geom_line(linetype = "dotted")
やgeom_path(linetype = "dashed")
のように、点線や破線をプロットしようとした時に、データポイントが多すぎると、PNGで保存した場合には点線や破線が細かすぎて直線に見えてしまう。
PDFファイルで出力すると、linetype
が正しく反映され、点線や破線に見える。
また、他に以下の3つの理由でPNGファイルで出力したい。
- データ点が多すぎるとPDFファイルをPowerPointなどに貼り付けた際に動作が遅くなる。
- PDFを貼り付けたPowerPointファイルをWindowsユーザーに渡すと、半透明の塗り潰しが表示されない。
- PDFを貼り付けたPowerPointをPDFに変換してWindowsユーザーに渡すと、画像の淵に線が入る。
上記の問題の解決策があれば教えてほしい。。
これまではPDFファイルに出力して、プレビューアプリでPNGファイルに変換していた。
ファイル数が多くなればその分手間も多くなるし、データ点が多い場合はPDFが重くなって書き出しにも時間がかかる。
RでPDFファイルとして出力して、続けて変換してやれば良いと思った次第。
package 'pdftools'のインストールとエラー
PDFファイルから情報を取得したり、PDFファイルを画像形式に変換したり、PDFファイルを画像ファイルとして読み込んでRでの解析に使ったりするためのライブラリ。
CRANから入手できる。(エラーが出るのでソースからインストールした。後述)
PDFからPNGへの変換にはpdf_convert()
関数を使う。
環境は
macOS 10.15.4
R 4.0.0
> # install.packages("pdftools")
> # library(pdftools)
> test2 <- data.frame(x = 1:10, y = 1:10)
> test <- ggplot() + geom_line(data = test2, aes(x = x, y = y))
> ggsave(test, filename = "pdffile.pdf")
> pdf_convert(pdf = "pdffile.pdf", format = "png", pages = NULL, filenames = NULL,
+ dpi = 72, antialias = TRUE, opw = "", upw = "", verbose = TRUE)
Converting page 1 to pdffile_1.png...PDF error: Couldn't find a font for 'Helvetica'
PDF error: Couldn't find a font for 'Helvetica'
PDF error: Couldn't find a font for 'Helvetica'
PDF error: Couldn't find a font for 'Helvetica'
PDF error: Couldn't find a font for 'Helvetica'
PDF error: Couldn't find a font for 'Helvetica'
PDF error: Couldn't find a font for 'Helvetica'
PDF error: Couldn't find a font for 'Helvetica'
PDF error: Couldn't find a font for 'Helvetica'
PDF error: Couldn't find a font for 'Helvetica'
done!
[1] "pdffile_1.png"
Fontconfig error: Cannot load default config file
RStudioで一度できていたのだけど、R.appで再現しようとしたらエラーが出て、RStudioでも同様のエラーが出るようになった。
ソースからインストールする方法を試してみる。
とりあえず、ウェブサイトの手順通りにやってみた。
Text Extraction, Rendering and Converting of PDF Documents • rOpenSci: pdftools
brew install poppler
Homebrewのアップデートが始まって、しばらくするとインストールが始まった。結構長い。
インストールが終わって、
> library(pdftools)
> pdf_convert(pdf = "pdffile.pdf", format = "png", pages = NULL, filenames = NULL,
+ dpi = 72, antialias = TRUE, opw = "", upw = "", verbose = TRUE)
Converting page 1 to pdffile_1.png... done!
[1] "pdffile_1.png"
>
無事エラーがなくなった。
pdf_convert()関数の使い方
> # pdftoolsの読み込み
> library(pdftools)
> # ワーキングディレクトリのpdffile.pdfというPDFファイルを300dpiのpngfile.pngに変換
> pdf_convert(pdf = "pdffile.pdf", format = "png", pages = NULL, filenames = "pngfile.png",
+ dpi = 300, antialias = TRUE, opw = "", upw = "", verbose = TRUE)
pdf
に変換したいPDFファイルのパスをいれる。format
に出力したいファイル形式を指定。filenames
に出力するファイル名をいれる。拡張子は必要。NULL
の場合は、元のPDFファイル名に_1
を付けて拡張子を変えた名前になる。dpi
で解像度を指定。
他のオプションはわかりません。。
まとめ
package 'pdftoos'のpdf_convert()
関数を使えば、PDFファイルをPNGファイルに変換できる。
install.packages("pdftools")
ではフォントに関するエラーが起きた。
brewを使ってソースからインストールすることで解決した(多分)。
にしても、一度できてたやつができなくなったのはなぜ。