JSONからPDFを生成するCLIツール
rs-pdfは、JSON設定ファイルからPDFドキュメントを生成するRustで書かれたコマンドラインツールです。テキスト、画像、図形、線などの要素を組み合わせて、複雑なレイアウトのPDFを作成できます。
📄 JSON設定による柔軟なレイアウト - JSON形式の設定ファイルでPDFのレイアウトを定義
🎨 豊富な要素サポート - テキスト、画像、矩形、線を組み合わせた文書作成
📐 レスポンシブレイアウト - FlexibleコンテナによるFlexboxライクなレイアウト
🎯 精密な位置指定 - ミリメートル単位での正確な要素配置
🌈 スタイルカスタマイズ - 色、ボーダー、フォントなど詳細なスタイル設定
🔤 日本語フォント対応 - CJKフォントを含む外部フォントの読み込み
📱 マルチページ対応 - 複数ページの文書生成
🔄 自動ページ分割 - 動的ページでのコンテンツ自動改ページ機能
rs-pdf -i input.json -o output.pdf-i, --input <PATH>: 入力JSONファイルのパス-o, --output <PATH>: 出力PDFファイルのパス-d, --debug: デバッグモード(グリッド表示)-a, --allow-override: 既存ファイルの上書きを許可
{
"$schema": "https://github.com/apple-x-co/rs-pdf/blob/master/schema/schema.json",
"document": {
"title": "文書タイトル",
"width": 210.0,
"height": 297.0,
"font_path": "fonts/NotoSansCJKjp-Thin.ttf",
"pages": [
{
"type": "static", // または "dynamic"
"objects": [
// ページ内の要素
]
}
]
}
}rs-pdfは2種類のページタイプをサポートしています:
要素を相対位置または絶対位置に配置します。
{
"type": "static",
"objects": [
// 要素を直接配置
]
}自動ページ分割機能を持つページ形式です。
共通要素は静的ページ同様に相対位置または絶対位置に配置します。
コンテンツ要素がコンテンツ領域に収まらない場合は自動的に次ページに分割されます。
{
"type": "dynamic",
"common": {
"objects": [
// 全ページに共通して表示される要素(ヘッダー、フッターなど)
]
},
"content": {
"frame": {
"point": { "x": 10.0, "y": 50.0 },
"size": { "width": 190.0, "height": 240.0 }
},
"objects": [
// 自動ページ分割される動的コンテンツ
]
}
}また2ページ目以降に共通して表示される要素を変えることも可能です。
{
"type": "dynamic",
"common": {
// 全ページ共通コンテンツ
},
"content": {
// 動的コンテンツ
},
"continuation": {
"common_objects": [
// 2ページ目以降に共通して表示される要素(ヘッダー、フッターなど)
],
"content_frame": {
// 2ページ目以降の動的コンテンツを表示する矩形
}
}
}動的ページの利点:
- コンテンツ量が可変の文書(請求書、納品書など)に最適
- ヘッダーやフッターを全ページに自動的に配置
- コンテンツ領域を超える要素を自動的に次ページに配置
{
"type": "text",
"text": "表示するテキスト",
"font_size": 24.0,
"frame": {
"point": { "x": 10.0, "y": 10.0 },
"size": { "width": 100.0, "height": 30.0 }
},
"style": {
"text_fill_color": { "red": 0, "green": 0, "blue": 255 },
"border_color": { "red": 200, "green": 200, "blue": 200 }
}
}{
"type": "image",
"path": "assets/images/sample.png",
"frame": {
"point": { "x": 50.0, "y": 50.0 },
"size": null
}
}{
"type": "rectangle",
"frame": {
"point": { "x": 0.0, "y": 0.0 },
"size": { "width": 100.0, "height": 50.0 }
},
"style": {
"background_color": { "red": 200, "green": 255, "blue": 200 },
"border_width": { "width": 1.0 }
}
}{
"type": "line",
"frame": {
"point": { "x": 0.0, "y": 0.0 },
"size": { "width": 100.0, "height": 0.0 }
},
"style": {
"border_style": { "line_style": "dash", "dash_1": 2 }
}
}{
"type": "objects",
"direction": "horizontal",
"frame": {
"point": { "x": 10.0, "y": 10.0 },
"size": { "width": 200.0, "height": 100.0 }
},
"objects": [
// 子要素
]
}{
"type": "flexible",
"direction": "horizontal",
"objects": [
// 子要素(自動的にサイズが調整される)
]
}background_color: 背景色border_color: ボーダー色text_fill_color: テキスト塗りつぶし色text_outline_color: テキストアウトライン色
border_width: ボーダー幅border_style: ボーダースタイル(solid/dash)
text_style: テキスト描画モード(fill/stroke/fill_stroke)text_outline_style: アウトラインスタイル
- 単位: ミリメートル (mm)
- 座標系: 左上原点
- ページサイズ: A4サイズの場合 width: 210.0, height: 297.0
完全な設定例は以下のファイルを参照してください:
- 静的ページの例:
demo/static.json - 動的ページの例:
demo/dynamic.json
日本語表示には以下のフォントを推奨します:
https://github.com/minoryorg/Noto-Sans-CJK-JP
- 圧縮
- パスワード保護
JSON設定ファイルは schema/schema.json のスキーマに基づいて検証されます。不正な設定の場合はエラーメッセージが表示されます。