
astro-pdfの出力設定をターミナル上でワンライン生成する
部門内のドキュメント出力システムが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の生成まで完全に自動化も可能でしょう。