astro-pdfの出力設定をターミナル上でワンライン生成する

astro-pdfの出力設定をターミナル上でワンライン生成する

Astroにて公開されたドキュメントサイトを元にPDFを生成するために必要なastro-pdfの設定を、ソースディレクトリを元にワンラインで生成してみました
Clock Icon2025.05.26

部門内のドキュメント出力システムがDocusaurusからAstroに移行したことにより、これまでNotebookLMのソース生成に使用していたdoc-to-pdfが利用できなくなりました。

NotebookLMからPDFを除外することは可能ですが、必要なソースが欠落することで調査の手間が増え、社内からの問い合わせが再び増加することも予想されます。

幸いなことにAstroにもPDF出力設定用のモジュールが用意されています。ドキュメント構成が複雑でなければ設定自体はシンプルですが、各ページごとに相対URLと出力ファイル名の設定が必要です。利用例が殆ど見当たらないのは、この設定の手間が原因かもしれません。

今回のドキュメント構成は全体がシンプルだったこともあり、全構成をまとめてワンライン生成に挑戦してみました。

astro-pdfの設定

astroの設定がなされたディレクトリ下で操作します。

nodenv install 20.19.0
nodenv rehash
nodenv local 20.19.0
eval "$(nodenv init -)"
npm install astro-pdf

PDF設定の出力

astro.config.mjsへ追記する設定を出力します。効率の良い整形を行うため、URL上の相対パス開始位置相当のディレクトリまで移動します。

% ls -dlR *.md(|x) \
| awk 'NR == 1{print "pdf({\n\tpages: {"}''{ $12 = $11;gsub("/", "_", $12);sub(/\.md.*$/, ".pdf", $12);gsub(/\.md[^\/]*/, "", $11);print "\t\t\047/" $11 "/\047: \047" $12 "\047," }''END{ print "\t}\n})" }' \
| tee >(pbcopy)

手続きの詳細は以下の通り。

まずは全体からmarkdownファイルに絞り込みます。

% ls -dlR *.md(|x)                                                                                                                                     [develop][..4e30eb39d9cca]
lrwxr-xr-x  1 xxxxxxx  staff   9  5 23 15:49 api.md -> ja/api.md
lrwxr-xr-x  1 xxxxxxx  staff  17  5 23 15:49 awsaccounts.md -> ja/awsaccounts.md
lrwxr-xr-x  1 xxxxxxx  staff  13  5 23 15:49 billing.md -> ja/billing.md
lrwxr-xr-x  1 xxxxxxx  staff  20  5 23 15:49 classmethod-id.md -> ja/classmethod-id.md
lrwxr-xr-x  1 xxxxxxx  staff  21  5 23 15:49 cloud-guidebook.md -> ja/cloud-guidebook.md

次にawkで整形します。相対パスをファイル名向けに流用してPDFファイル名の重複を防ぎたいのですが、gsubでの直接加工は元のリソースを書き換えてしまいます。そこで、$12=$11でPDF向けのフィールドを末尾に追加します。

ファイル名は、相対パスのスラッシュをアンダースコアに置換したPDF形式とします。これをastro-pdfのintegration設定用にpdf({ pages: {…}})で囲みます。

% ls -dlR *.md(|x) \
| awk 'NR == 1{print "pdf({\n\tpages: {"}''{ $12 = $11;gsub("/", "_", $12);sub(/\.md.*$/, ".pdf", $12);gsub(/\.md[^\/]*/, "", $11);print "\t\t\047/" $11 "/\047: \047" $12 "\047," }''END{ print "\t}\n})" }'

最後にtee >(pbcopy)にて出力コピーしつつログにも残しておきます。

% ls -dlR *.md(|x) \
| awk 'NR == 1{print "pdf({\n\tpages: {"}''{ $12 = $11;gsub("/", "_", $12);sub(/\.md.*$/, ".pdf", $12);gsub(/\.md[^\/]*/, "", $11);print "\t\t\047/" $11 "/\047: \047" $12 "\047," }''END{ print "\t}\n})" }' \
| tee >(pbcopy)

> pdf({
> 	pages: {
> 		'/ja/api/': 'ja_api.pdf',
>     ...
> 		'/ja/user/': 'ja_user.pdf,'
> 	}
> })

出力した設定をastro.config.mjsへ追記で完了です。

import pdf from 'astro-pdf'

export default defineConfig({
..
  integrations: [
    pdf({
        pages: {
            '/ja/': 'index.pdf',
            ...
            '/ja/user/': 'ja_user.pdf',
        }
    }),
  ]
})

astro-pdfのPDF生成はbuild時に行われます。

npm run build

出力結果はdistディレクトリに格納されます。各URLごとに個別のPDFが生成されますが、NotebookLMのソース枠を節約するためpdfuniteを使用して1つのファイルに結合します。NotebookLMの仕様上、結合時のページ順序は任意で構いません。

pdfunite dist/*.pdf

あとがき

ページ内容が複雑でない限り、このコマンドで一括設定が可能です。さらにastro.config.mjsへの置換処理を工夫すれば、結合済みPDFの生成まで完全に自動化も可能でしょう。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.