Power Automate を使用した SharePoint リストからの PDF 生成: Handlebars テンプレートと HTML から PDF への請求書ワークフロー

PDF4me ドキュメント生成 シングル これは、Handlebars HTMLテンプレートとJSONペイロードをレンダリングして完成したHTMLドキュメントを作成するPower Automateアクションです。このドキュメントは、ペアになっている「HTMLをPDFに変換」アクションによってA4サイズにページ分割されます。SharePointリストに新しい行が追加されるとフローが開始され、ComposeがJSONを組み立て、Dropboxが請求書番号にちなんだ名前の請求書PDFを保存します。プレミアムコネクタもコードも不要です。
どの財務チームもPower Automateで同じ壁にぶつかる。 ファイル変換 このアクションにはプレミアムライセンスが必要で、HTMLテンプレートには手を加えません。Adobe PDF Servicesには費用がかかります。Encodianにも費用がかかります。matthewdevaneyの人気の回避策はHTMLを完全にスキップし、Power Appsにロックします。以下のパターンは、SERPの上位10位の誰もエンドツーエンドで表示していないものです。SharePointリストの列セットがJSONペイロードになり、実際の ハンドルバーテンプレート ファイルの場所 /Shared Documents/また、無料プランのコネクタ料金では、2つのPDF4meアクションがレンダリングとページネーションを実行します。
Handlebarsテンプレートのレンダリング:PDF4meと代替サービスの比較
Power Automateのアーキテクトが請求書PDF用のコネクタを選ぶ前に必ず行う比較:
| Approach vs PDF4me | ハンドルバーの型取り? | HTMLからPDFへのページネーションツール? | コネクタ層 | 注記 |
|---|---|---|---|---|
| PDF4me(このブログ) | はい、ドキュメントを1つ生成します | はい、HTMLをPDFに変換します | 標準 | 2つの単機能アクション、プレミアムライセンスは不要 |
| Adobe PDFサービス | いいえ | はい | プレミアム | ユーザーごとの料金体系、テンプレートエンジンなし、HTMLのみ |
| エンコーダー | ネイティブテンプレート機能なし | はい | プレミアム | 人気はあるが、呼び出しごとに料金が発生する |
| matthewdevaney Power Apps ルート | Wordテンプレートのみ | 該当なし | 標準 | HTMLを完全にスキップし、Power Appsのフロントエンドに限定します。 |
ネイティブ Convert File | いいえ | Word/Excelのみ対応、HTMLは不可 | プレミアム | HTML請求書を全くレンダリングできません |
SharePointの請求書リストが情報源です。その横にHandlebarsのHTMLテンプレートが1つ保存されています。新しい行が追加されるたびに、ComposeがJSONを作成し、PDF4meのGenerate Document (Single)がテンプレートにデータを入力、PDF4meのConvert HTML to PDFがページ分割を行い、Dropboxが完成した請求書をその行のタイトル名で保存します。6つのアクション、すべて標準レベルのコネクタ、そして行ごとに1つのブランド付きPDFが作成されます。
なぜ?という問いに対する質疑応答
フロー内にHTMLをハードコーディングするのではなく、HandlebarsテンプレートをSharePointに保存する理由は何ですか? テンプレートは編集可能なファイルとなり、財務担当者やデザイン担当者はブラウザ上で更新できます。ロゴを変更したり、合計金額の行を微調整したり、VAT行を追加したりすれば、次の請求書にすぐに反映されます。ワークフローを再開する必要は一切ありません。
PDF4meのアクションが1つではなく2つ必要なのはなぜですか? 「ドキュメント生成(シングル)」はテンプレートエンジンであり、ページネーション機能ではありません。JSONをHTMLにマージしてHTMLを返します。「HTMLからPDFへの変換」はページネーション機能であり、生成されたHTMLを読み込み、A4ページサイズ、余白、背景印刷を適用してPDFデータを返します。役割を分離することで、各アクションの目的が明確になり、ページネーションを実行する前にレンダリングされたHTMLをプレビューできます。
なぜ途中で作曲するのか? Handlebarsテンプレートはネスト構造(請求書、顧客、アイテム配列、合計)になっています。SharePointでは12個のフラットな列が提供されます。Composeは「JSONを組み立てる」ステップであり、フラットな列をテンプレートが反復処理するネストされたペイロードに整形します。Composeでこの処理を行うことで、Generate Document (Single)は、構成全体に散らばった12個の動的コンテンツのピルではなく、1つのクリーンな入力として認識します。
出力先としてDropboxを使うのはなぜですか?SharePointに戻さないのはなぜですか? Dropboxはデモ用のストレージです。最終ステップには、SharePointのファイル作成、OneDriveのファイル作成、Google Driveのファイル作成、またはSFTPアップロードなど、どのファイルコネクタでも使用できます。「HTMLをPDFに変換」のボディは単純なバイナリデータであり、出力先は書き換えではなく、データの交換です。
得られるもの
入力: SharePoint リスト Invoices (列:タイトル、請求書日付、支払期日、顧客名、顧客住所、顧客メールアドレス、通貨、小計、税率、税額、合計金額、メモ)と、単一のHandlebarsテンプレートが /Shared Documents/invoice_template.html。 出力: Dropbox に A4 PDF を 1 行ずつ保存し、名前を {Title}.pdf (INV-1005はINV-1005.pdfになります。)
必要なもの
- パワーオートマタ。 Power Automateを開く以下で使用されている SharePoint、Dropbox、および PDF4me コネクタはすべて標準プランであり、プレミアムプランは必要ありません。
- PDF4me APIキー。 APIキーを取得してくださいPDF4meアクションを初めて追加する際に接続してください。
- SharePointサイト リスト名
Invoicesまた、Handlebarsテンプレートが保存されるドキュメントライブラリ(名前は任意)が必要です。 - Dropboxアカウント (または任意のファイル保存先:SharePoint、OneDrive、Google Drive、SFTPはすべて変更なしでスロットに表示されます。)
- Handlebarsの請求書テンプレートアップロード準備完了
/Shared Documents/。 invoice_template.html. その中のすべてのHandlebarsパスは、以下のマッピングテーブルと一致します。 - 署名済み請求書のサンプル(PDF)まさにINV-1005で生成されたフローと同じものです。 invoice-sample.pdf。
まずはサンプルを入手してください。 Handlebarsテンプレートをダウンロードしてアップロードしてください /Shared Documents/ フローを構築する前に、ステップ3で参照するファイルを指定しておく必要があります。サンプル出力PDFには、「成功」の状態が具体的に示されています。
フローの概要
- アイテムが作成されると (SharePoint トリガー)
Invoicesリスト)。 - 作曲する ネストされたJSONペイロード(請求書/顧客/アイテム/合計/メモ)。
- パスを使用してファイルコンテンツを取得します のために
/Shared Documents/invoice_template.html。 - PDF - ドキュメント生成(単一) テンプレート本文とJSON、出力タイプはHTML。
- HTMLをPDFに変換する A4縦向き、縮尺0.8、余白40px、背景印刷あり。
- ファイルを作成する Dropbox内
/、 ファイル名{Title}.pdf。
フローの概要全体

エンドツーエンドの実行。11秒かかるHTMLからPDFへの変換処理はページネーションによるもので、それ以外はすべて0.5秒未満です。
ステップ1:新しいSharePoint請求書でPower Automateフローをトリガーするにはどうすればよいですか?
これまでの流れ: 流れはここから始まる。
SharePointトリガーを、請求書の行が格納されているサイトとリストに設定します。すると、各列が下流で動的なコンテンツになります。
- 追加 SharePoint > アイテムが作成されると 引き金として。
- 設定する:
- サイトアドレス: SharePoint サイトを選択します (サンプルでは:
PDF4me Sharepoints - https://ynoox1.sharepoint.com/sites/PDF4meSharepoints) - リスト名:
Invoices。
- サイトアドレス: SharePoint サイトを選択します (サンプルでは:
- 保存して、トリガーにリストスキーマを検出させます。下のスクリーンショットの行(INV-1002、INV-1003、INV-1005)は、Handlebarsテンプレートが使用する正確な12列を示しています。
請求書一覧

SharePointリストが信頼できる情報源です。ここにある各列は、Handlebarsペイロードの1つのフィールドに対応しています。
トリガー設定

トリガーとなるのはたった2つのフィールドだけです。それ以外の要素はすべて行から取得されます。
ヒント。 財務チームが既に請求書をExcelまたはDataverseに保存している場合は、そのままにしておいてください。トリガーを切り替えて Excel - 行が追加されたとき または データバース - 行が追加されたとき残りの流れは変わりません。
ステップ2:SharePointの行からHandlebarsのJSONペイロードを構築するにはどうすればよいですか?
これまでの流れ: SharePointトリガー。
Compose は 12 個のフラットな SharePoint 列を、Handlebars テンプレートが反復処理するネストされた JSON に整形します。テンプレートは、 invoice、 customer、 items 配列、 totals、そして notes 弦。
- 追加 作曲する。
- で 入力以下の JSON を貼り付け、対応する SharePoint の動的コンテンツ ピルを各値の引用符の間にドロップして、数値と日付が文字列として表示されるようにします。
{
"invoice": {
"number": "Title",
"date": "InvoiceDate",
"dueDate": "DueDate"
},
"customer": {
"name": "CustomerName",
"address": "CustomerAddress",
"email": "CustomerEmail"
},
"items": [
{ "description": "Item1Description", "quantity": "Item1Qty", "unitPrice": "Item1UnitPrice", "lineTotal": "Item1Amount", "currency": "Currency" },
{ "description": "Item2Description", "quantity": "Item2Qty", "unitPrice": "Item2UnitPrice", "lineTotal": "Item2Amount", "currency": "Currency" },
{ "description": "Item3Description", "quantity": "Item3Qty", "unitPrice": "Item3UnitPrice", "lineTotal": "Item3Amount", "currency": "Currency" },
{ "description": "Item4Description", "quantity": "Item4Qty", "unitPrice": "Item4UnitPrice", "lineTotal": "Item4Amount", "currency": "Currency" },
{ "description": "Item5Description", "quantity": "Item5Qty", "unitPrice": "Item5UnitPrice", "lineTotal": "Item5Amount", "currency": "Currency" }
],
"totals": {
"currency": "Currency",
"subTotal": "Subtotal",
"taxRate": "TaxRate",
"taxAmount": "TaxAmount",
"grandTotal": "GrandTotal"
},
"notes": "Notes"
}
構成設定

コードビューで作成します。各JSON値は2つの引用符で囲まれたSharePointのピルなので、数値と日付はHandlebarsテンプレートでレンダリングできる文字列として渡されます。
ヒント。 アイテム配列のサイズを、SharePoint に追加した列数 (この例では 5 つ) に一致する固定サイズに保ちます。行にアイテムが 3 つしかない場合は、SharePoint の Item4/Item5 を空白のままにして、 {{#if description}} Handlebarsテンプレートの行を囲むようにガードを設定し、空の行がスキップされるようにします。
参考資料:SharePoint列からHandlebarsへのパス
SharePointの列と、それがテンプレート内のどこに配置されるかの正確なマッピングを示します。スキーマを拡張する際は、この表をブックマークしておいてください。
| SharePoint 列 | ハンドルバーパス | タイプ | テンプレートで使用 |
|---|---|---|---|
Title | invoice.number | 文章 | 請求書番号の見出しとDropboxファイル名 |
InvoiceDate | invoice.date | 日付 | 請求書ヘッダー |
DueDate | invoice.dueDate | 日付 | 請求書ヘッダー |
CustomerName | customer.name | 文章 | 請求書ブロック |
CustomerAddress | customer.address | 文章 | 請求書ブロック |
CustomerEmail | customer.email | 文章 | 請求書ブロック |
Item{N}Description | items[N-1].description | 文章 | 明細行 |
Item{N}Qty | items[N-1].quantity | 番号 | 明細行 |
Item{N}UnitPrice | items[N-1].unitPrice | 番号 | 明細行 |
Item{N}Amount | items[N-1].lineTotal | 番号 | 明細行 |
Currency | totals.currency そしてそれぞれ items[].currency | 文章 | 通貨記号 |
Subtotal | totals.subTotal | 番号 | 合計ブロック |
TaxRate | totals.taxRate | 番号 | 合計ブロック |
TaxAmount | totals.taxAmount | 番号 | 合計ブロック |
GrandTotal | totals.grandTotal | 番号 | 合計ブロック |
Notes | notes | 文章 | フッター |
ステップ3:SharePointからHandlebarsテンプレートファイルを読み込むにはどうすればよいですか?
これまでの流れ: SharePointトリガーとComposeの組み合わせ。
テンプレートをプレーンテキストとして保存します .html サイトのドキュメントライブラリにあるファイル。パスを使用してファイルコンテンツを取得するアクションは、その生のバイト列を読み取るため、ドキュメント生成(単一)アクションはそれをテンプレート本文として使用できます。
テンプレート自体
テンプレートは通常のHTMLにインラインCSSを加えたもので、データが格納される場所にHandlebars式が記述されています。実際の処理は2つの構成要素によって行われます。 {{#each items}} 行項目ごとに表の行が繰り返され、 {{#if description}} 内部のガードは、使用されていないItem4列とItem5列によって残された空白をスキップします。
<tbody>
{{#each items}}
{{#if description}}
<tr>
<td>{{description}}</td>
<td class="num">{{quantity}}</td>
<td class="num">{{currency}}{{unitPrice}}</td>
<td class="num">{{currency}}{{lineTotal}}</td>
</tr>
{{/if}}
{{/each}}
</tbody>
それ以外のものはすべて直接的な代替品です。 {{invoice.number}} ヘッダーでは、 {{customer.*}} 請求先ブロック、 {{totals.*}} 合計表では、 {{notes}} フッターに。
テンプレートをダウンロードしてください。 アップロード先 /Shared Documents/ として invoice_template.html次に、上部にある販売者名、住所、VAT番号を編集します。これらは意図的に固定されているため、初回実行前に変更する必要があるのはこの部分だけです。
- 追加 SharePoint > パスを使用してファイルコンテンツを取得します。
- 設定する:
- サイトアドレス: トリガーと同じサイト。
- ファイルパス:
/Shared Documents/invoice_template.html。 - コンテンツタイプを推測する:
Yes(デフォルト設定のままにしてください。)
パスを使用してファイルコンテンツを取得します

テンプレートは /Shared Documents/ 絶対パスで取得されます。SharePointファイルなので、バージョン履歴は自動的に取得されます。
ヒント。 テンプレートが OneDrive または Dropbox に保存されている場合は、この操作をストレージの同等の操作である「ファイル コンテンツの取得」に置き換えてください。 Body それらのいずれかの出力が、次のステップでテンプレートファイルデータに渡される。
ステップ4:PDF - ドキュメント生成(単一)は、Handlebarsテンプレートにどのように入力されますか?
これまでの流れ: SharePointトリガー、Compose、およびパスを使用したファイルコンテンツの取得機能。
ドキュメント生成(シングル)はテンプレートエンジンです。Handlebars ソースを読み込みます({{invoice.number}}、 {{#each items}}...{{/each}}JSONペイロードから値を代入し、レンダリングされたHTMLを返します。ページネーションは行いません。それは次のステップの役割です。
- 追加 PDF4me PDF > PDF - ドキュメント生成(単一)。
- 設定する:
- テンプレートファイルの種類:
Html (Handlebars Syntax)。 - テンプレートファイル名:
invoice_template.html。 - テンプレートファイルデータ: 動的なコンテンツ、
BodySharePointの「ファイルコンテンツの取得」ステップから。 - 文書データタイプ:
Json。 - 文書データテキスト: 動的なコンテンツ、
Body構成ステップから。 - 出力タイプ:
Html。 - PDFテンプレートを編集可能にする:
No。
- テンプレートファイルの種類:
ドキュメント生成(単一)設定

出力タイプは Html、 ない Pdf. ドキュメント生成 (単一) は、レンダリングされた HTML を次のステップに渡すため、ページネーションは独立したテスト可能な問題として残ります。
ヒント。 ドキュメント生成(シングル)は、Word および PDF テンプレートもサポートしています。デザインチームがあなたに .docx 請求書のモックアップ、テンプレートファイルタイプを Word 出力タイプを次のように変更します Pdf 変換ステップを完全にスキップするには、CSSの制御とブラウザプレビューの反復処理が必要な場合にHandlebarsを使用する方法が最適です。
ステップ5:レンダリングされたHTMLをA4サイズのPDFにページ分割するにはどうすればよいですか?
これまでの流れ: SharePointトリガー、Compose、パスを使用したファイルコンテンツの取得、PDF - ドキュメントの生成(単一)。
HTMLをPDFに変換する機能は、ページネーションエンジンです。Generate Document (Single)によって生成されたHTMLを読み込み、ページサイズと余白を適用して、PDFバイトを返します。
- 追加 PDF4me PDF > HTMLをPDFに変換する。
- 設定する:
- ファイルの内容: 動的なコンテンツ、
Body「ドキュメント生成(単一)」ステップから。 - HTMLファイル名:
invoice.html。 - ページレイアウト:
Portrait。 - ページサイズ:
A4。 - 規模:
0.8(5項目の請求書が1ページに収まります。) - 上/下/左/右の余白:
40pxそれぞれ。 - プリント背景:
Yes(合計ブロックの背景色を表示します。)
- ファイルの内容: 動的なコンテンツ、
HTMLをPDFに変換する設定

スケール0.8では、5行の請求書がA4用紙1枚に収まります。項目数が少なく、フォントサイズを大きくしたい場合は、0.9または1.0に上げてください。
ヒント。 Print Background: Yes 最終的に色付きになる設定は <td> セルとCSSグラデーションが表示されます。ブラウザはデフォルトで印刷時に背景色を削除します。PDFで合計行が白く表示される場合は、これが原因です。
ステップ6:請求書のPDFファイルを、分かりやすい名前でDropboxに保存するにはどうすればよいですか?
これまでの流れ: SharePoint トリガー、作成、パスを使用したファイルコンテンツの取得、PDF - ドキュメントの生成 (単一)、HTML から PDF への変換。
最終ステップでは、PDFファイルを請求書番号に関連付けられた名前のDropboxフォルダに保存します。
- 追加 Dropbox > ファイルを作成する。
- 設定する:
- フォルダパス:
/(または次のようなサブフォルダ)/invoices/) - ファイル名: 動的なコンテンツ、
TitleSharePointトリガーから、リテラル文字列が続きます.pdf. INV-1005 はINV-1005.pdf。 - ファイルの内容: 動的なコンテンツ、
Body「HTMLをPDFに変換する」ステップから。
- フォルダパス:
ファイル構成を作成する

請求書番号をファイル名に付けることで、Dropboxフォルダは自動的に検索可能で重複のない請求書アーカイブになります。
ヒント。 2 つの行が同じタイトルを共有する可能性がある場合は、 _ そしてタイムスタンプ: concat(triggerBody()?['Title'], '_', ticks(utcNow()), '.pdf')そうでない場合、Dropbox は以前のファイルを同じ名前で自動的に上書きします。
フローを実行して検証する
- 保存 右上の流れ。
- 新しい行を追加する
InvoicesSharePoint リスト。タイトルを認識できるものに設定します (INV-1005)すべての列にデータを入力して、テンプレートに実際のデータが含まれるようにします。 - 流れを開く 実行履歴 そして、最新の実行結果を選択してください。フローの概要画面のスクリーンショットと同様に、すべてのカードが緑色になっているはずです。「HTMLをPDFに変換」カードが最も遅い(約11秒)のは、そこでページネーションが行われるためです。
- Dropboxを開いて確認してください
INV-1005.pdf(またはタイトル)はルートディレクトリにあります。ダウンロードして開き、サンプルと比較してください。
実際に何を作ったのですか? SharePointネイティブの請求書ジェネレーター。編集可能なHTMLテンプレートを備え、標準レベルのコネクタアクション6つで完結します。同じパターン(行+テンプレート+レンダリング+ページ分割+保存)は、見積書、納品書、発注書、保証書、または行ごとにブランドが付けられたPDFなど、あらゆる文書に使用できます。SharePointをDataverseまたはExcelに、DropboxをOneDriveに置き換えても、PDF4meのアクションはそのまま使用できます。
再構築せずに追加できる一般的なバリエーション
Body そしてそれをSharePointに宛てて送信する CustomerEmail カラム。Shared Documents/Signed Invoices/ そのため、ソースリストの横に保存されます。よくある質問
Power Automateを使用してSharePointリストアイテムからPDFを作成する方法は?
SharePoint を使用する When an item is created トリガーとして、 Compose 行のフラットな列をネストされた JSON ペイロードに整形するアクション、 Get file content using path HTMLテンプレートを読み込むためのアクション /Shared Documents/PDF4me Generate Document (Single) JSONをテンプレートにマージし、PDF4me Convert HTML to PDF 結果をページ分割します。出力は任意のファイルコネクタ(Dropbox、OneDrive、SharePoint)に保存します。この一連のアクションはすべて標準コネクタティアで実行されるため、Power Automate Premium ライセンスは不要です。
Power AutomateでPDFを生成できますか?
はい。ネイティブの Power Automate は HTML テンプレートから PDF を単独でレンダリングすることはできませんが、 PDF4me コネクタは、それを可能にする2つのアクションを追加します。 Generate Document (Single) テンプレートのレンダリングと Convert HTML to PDF ページネーション機能を提供します。どちらも標準プランで、無料でインストールできます。これらを組み合わせることで、SharePoint、Dataverse、Excelの任意の行を、データと同じ場所に保存されている編集可能なHTMLテンプレートを使用して、ブランド化されたPDFに変換できます。
Power AutomateでHTMLからPDFを作成する方法は?
追加する PDF4me HTMLをPDFに変換する フローのスコープ内に HTML がある場所ならどこでもアクションを実行します (Compose 出力、Get file content Body、Compose 式、webhook ペイロード)。ページ サイズを設定します (A4)、レイアウト (Portrait) 余白 (40px)、そして設定する Print Background: Yes そのため、CSS の背景は保持されます。アクションの Body 出力とは、ストレージアクションに渡すPDFバイナリのことです。これは、上記のステップ5で使用したアクションと同じです。
Power Automateはプレミアム版なしでHTMLをPDFに変換できますか?
はい。PDF4meコネクタの「HTMLをPDFに変換」アクションは標準コネクタティアに属しているため、ネイティブのプレミアムライセンスアップグレードなしで、どのPower Automateプランにもインストールして使用できます。 Convert File Adobe PDF Servicesコネクタには、PDF4me APIキーが必要です(無料プランあり)。このキーは、アクションを初めて追加する際に貼り付けます。
Power AutomateでテンプレートからPDFを生成する方法は?
使用 PDF4me ドキュメント生成(単一) と Template File Type: Html (Handlebars Syntax) (HTMLテンプレートの場合)または Word (のために .docx テンプレート)。テンプレートバイトを Template File Data そしてJSONペイロードを Document Data Text。 セット Output Type: Html 後でページネーションする必要がある場合(このブログのように)、または Pdf PDF を 1 ステップで取得します。このアクションは、以下の完全な Handlebars 構文をサポートしています。 {{#each}} そして {{#if}} 明細項目と条件付きブロックの場合。
トラブルシューティング
{{invoice.number}} PDFに文字通り記載されていますテンプレートのプレースホルダーが置換されなかったということは、ドキュメントデータテキストが空であるか、JSON形式が正しくないことを意味します。実行履歴で「Compose」ステップの出力を開き、Handlebarsが探している正確なキーパス(大文字小文字を区別)を持つ有効なJSONオブジェクトであることを確認してください。
セット Print Background: Yes HTML を PDF に変換する際、Chromium の印刷エンジンは背景色を削除します。 <td> そして <div> デフォルトでは無効になっています。このスイッチをオンにすると、これらの機能が再び有効になります。
下げる Scale HTML から PDF への変換を 0.8 から 0.7 に変更します。または、 page-break-inside: avoid で <table> テンプレート内で、ページネーションは行間ではなく行内で行われるようにする。
2列が同じものを共有 Titleファイル名の式を次のように変更します。 concat(triggerBody()?['Title'], '_', ticks(utcNow()), '.pdf') そのため、実行ごとに固有のファイル名が生成されます。
次のステップ
同じ6つのステップ(行、テンプレート、レンダリング、ページネーション、名前、ストア)のパターンで、HTMLで記述できる行ごとのブランド付きPDFを処理できます。