Rで解析:ブロックを積み重ねて複数ページのPDFレポートを作る「simPDF」パッケージの紹介
「simPDF」パッケージは、段落・整形済みテキスト・署名欄などのブロックを積み重ねて、複数ページのPDFレポートを組み立てるコマンドを提供します。R標準のグラフィックスデバイスの上で動くため、RMarkdownやLaTeXといった外部ツールを別途用意する必要はありません。設定するのは表示したい文字列や、行ごとに区切った文字列ベクトルで、ページの幅に収まるよう自動で折り返し、収まりきらない内容は次のページへ送ります。定型的な報告書や証跡書類をスクリプトから素早く組み立てたい人には、扱いやすいパッケージだと考えます。
パッケージバージョンは0.1.2。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
<おすすめのRに関する書籍です>
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("simPDF")
# パッケージの読み込み
library("simPDF")コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
本パッケージでは、sp_new()で作成するPDFファイルへの参照を文書(doc)と呼びます。以降のほとんどのコマンドには、この文書を最初に渡します。段落や整形済みテキスト、署名欄など、レポートに配置する内容の単位はブロック(block)と呼ばれ、block_para()やblock_pre()などのコマンドが返します。
flow_run()にブロックのリストを渡すと、現在のページの余白内へ上から順に配置し、収まりきらないブロックは自動で次のページへ送ります。以降のコマンド例では、次の文章と一覧を共通のブロック内容として使い回します。
全てのコマンドは実行ユーザーのAppData\Local\Temp\にpdfで保存されます。保存先のPDFファイルを作成の部分を適時変更してください。
# 京都府山城地域の茶業レポートを想定した本文
lead_text <- "宇治茶の令和7年産一番茶は、4月中旬からの好天に恵まれ、例年より収量が増加しました。特に和束町と宇治田原町では、被覆栽培によるてん茶の生産量も伸びています。"
# 産地別の収量をまとめた固定幅の行
yield_lines <- c(
"産地 収量(kg) 前年比",
"宇治市 1280 +6%",
"和束町 2140 +9%",
"宇治田原町 1860 +4%"
)PDFレポートのひな型を作成する:sp_newコマンド
sp_new()はPDFファイルを新規に作成し、以降のコマンドへ渡す文書を返します。cairoをTRUEにしてcairo_pdf()を使うと、日本語を含むUnicode文字を埋め込んだPDFを作成できます(既定のfamily “Helvetica” と cairo = FALSE の組み合わせでは、日本語の文字は描画できません)。作成した文書はsp_page()でページを開始し、flow_run()でブロックを流し込んだあと、sp_close()で書き出して閉じます。
| オプション | 意味 | 初期値 |
|---|---|---|
| file | 保存先のPDFファイルのパス | なし |
| paper | 用紙サイズ。”A4″、”letter”、”A3″のいずれか | “A4” |
| margin | ページ余白(ポイント単位) | 25 |
| family | 既定のフォントファミリー | “Helvetica” |
| size | 既定のフォントサイズ(ポイント単位) | 10 |
| pointsize | デバイスのポイントサイズ(文字の拡大率の基準)。既定のまま使う | 12 |
| cairo | TRUEにするとcairo_pdf()を使う(フォントの埋め込み、Unicode・日本語に対応)。FALSEだと標準のpdf()を使う | FALSE |
| onefile | TRUEで複数ページを1つのファイルにまとめる。FALSEだとページごとに別ファイルになる | TRUE |
# 保存先のPDFファイルを作成
report_file <- tempfile(fileext = ".pdf")
# A4サイズの文書を、日本語フォントを埋め込める設定で開く
doc <- sp_new(report_file, paper = "A4", margin = 25, family = "MS Gothic", cairo = TRUE)
# 1ページ目を開始
sp_page(doc)
# 冒頭の文章を1つの段落ブロックとして流し込む
flow_run(doc, list(block_para(text = lead_text)))
# PDFに書き出して閉じる
sp_close(doc)
<おすすめのRに関する書籍です>
段落のブロックを作成する:block_paraコマンド
block_para()は、渡した文字列をブロックの幅に収まるよう自動で折り返す段落ブロックです。alignで左寄せ・右寄せ・中央寄せを切り替えられ、indentで先頭の字下げ幅をポイント単位で指定できます。
| オプション | 意味 | 初期値 |
|---|---|---|
| text | 段落にする文字列(改行を含められる) | なし |
| size | フォントサイズ(ポイント単位) | 10 |
| font | 字体。1が標準、2が太字、3が斜体、4が太字斜体 | 1L |
| family | フォントファミリー(”sans”、”serif”、”mono”またはコアフォント名) | “sans” |
| leading | 行間の倍率 | 1.2 |
| align | 配置。”left”、”right”、”center”、”justify”のいずれか(このバージョンではjustifyはleftと同じ扱いになる) | c(“left”, “right”, “center”, “justify”) |
| indent | 左インデント(ポイント単位) | 0 |
| col | 文字色 | “black” |
# 見出し文を中央寄せの段落ブロックとして作成
title_block <- block_para(text = "宇治茶生産レポート", size = 14, align = "center")
# 本文を、先頭を1文字分下げた段落ブロックとして作成
body_block <- block_para(text = lead_text, size = 11, indent = 12)
# 保存先のPDFファイルを作成
report_file <- tempfile(fileext = ".pdf")
# 日本語フォントを埋め込める設定で文書を開く
doc <- sp_new(report_file, family = "MS Gothic", cairo = TRUE)
# 1ページ目を開始
sp_page(doc)
# 見出しと本文の間にすき間を挟んで流し込む
flow_run(doc, list(title_block, block_spacer(8), body_block))
# PDFに書き出して閉じる
sp_close(doc)
<おすすめのRに関する書籍です>
整形済みテキストのブロックを作成する:block_preコマンド
block_pre()は、文字列ベクトルの各要素を1行としてそのまま等幅フォントで配置するブロックです。桁を揃えた数値の一覧や、コンソール出力をそのままレポートに載せたいときに使います。sizeは文字サイズの上限で、幅に収まらない場合は自動的に縮小されます。
| オプション | 意味 | 初期値 |
|---|---|---|
| lines | 1行ずつの要素を持つ文字列ベクトル | なし |
| size | フォントサイズの上限(ポイント単位)。幅に収まらない場合は縮小される | 9 |
| font | 字体 | 1L |
| family | フォントファミリー(既定は等幅フォント) | “mono” |
| leading | 行間の倍率 | 1.15 |
| col | 文字色 | “black” |
# 産地別の収量を等幅フォントのブロックとして作成
yield_block <- block_pre(yield_lines, size = 10)
# 保存先のPDFファイルを作成
report_file <- tempfile(fileext = ".pdf")
# 日本語フォントを埋め込める設定で文書を開く
doc <- sp_new(report_file, family = "MS Gothic", cairo = TRUE)
# 1ページ目を開始
sp_page(doc)
# 見出しの段落と収量の一覧を続けて流し込む
flow_run(doc, list(block_para(text = "産地別収量(速報値)"), block_spacer(6), yield_block))
# PDFに書き出して閉じる
sp_close(doc)署名欄のブロックを作成する:block_signatureコマンド
block_signature()は、役割名を並べた署名欄のブロックです。with_dateをTRUEにすると各署名欄に日付欄が添えられ、gapで欄どうしの間隔、sig_heightで1件あたりの高さを調整できます。
| オプション | 意味 | 初期値 |
|---|---|---|
| roles | 署名者の役割名を並べた文字列ベクトル | c(“Performed by”, “Reviewed by”) |
| with_date | 各署名欄に日付欄を添えるかどうか | TRUE |
| size | 役割名の文字サイズ(ポイント単位) | 10 |
| caption_size | 日付欄などの注記の文字サイズ(ポイント単位) | 8 |
| sig_height | 1件あたりの署名欄の高さ(ポイント単位) | 26 |
| sig_frac | 枠の幅に対する署名欄の割合 | 0.5 |
| date_frac | 枠の幅に対する日付欄の割合 | 0.22 |
| gap | 署名欄どうしの縦方向の間隔(ポイント単位) | 16 |
| field | 文書に入力可能なフィールドの矩形を記録するかどうか | TRUE |
# 記入者・確認者・所属長の3段からなる署名欄を作成
sig_block <- block_signature(roles = c("記入者", "確認者", "所属長"), sig_height = 30, gap = 20)
# 保存先のPDFファイルを作成
report_file <- tempfile(fileext = ".pdf")
# 日本語フォントを埋め込める設定で文書を開く
doc <- sp_new(report_file, family = "MS Gothic", cairo = TRUE)
# 1ページ目を開始
sp_page(doc)
# 確認文と署名欄を続けて流し込む
flow_run(doc, list(block_para(text = "以上の内容を確認しました。"), block_spacer(10), sig_block))
# PDFに書き出して閉じる
sp_close(doc)
<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。