メインコンテンツまでスキップ

式(Expression)

式は{}で囲まれた表現を評価する機能です。
最も単純な例は{1+1}で、これは2と評価されます。

pdfmeでは、式は単純な計算だけでなく、ユーザー入力を活用することもできます。

例えば、以下のようなテンプレートを考えてみましょう:

{
"schemas": [
[
{
"name": "field1",
"type": "text",
"content": "Hello world",
...
"readOnly": false,
},
{
"name": "field2",
"type": "text",
"content": "{field1} !", // 式!
...
"readOnly": true,
}
]
],
"basePdf": { "width": 210, "height": 297, "padding": [20, 10, 20, 10] },
"pdfmeVersion": "5.0.0"
}

field2の値はHello world !になります。式{field1} !は以下のように評価されます:

expression

これは、{field1}field1の値に置き換えられ、その後に!が追加されることを意味します。

ユースケース

以下のようなユースケースが考えられます:

フッターとヘッダーに日付やページ番号を表示する

例えば、PDFの作成日をヘッダーに表示したり、フッターにページ番号を表示したりすることができます。ヘッダーとフッターについてはこちらで詳しく説明されていますが、ヘッダーとフッターに使用されるstaticSchemaでも式を使用できます。

ユーザー入力を表示用に再利用する

ユーザーが入力した値を表示用に再利用できます。例えば、ユーザーが入力したfirstNamelastNameというフィールドがある場合、それらを連結して{firstName + " " + lastName}として表示できます。

これにより、ユーザーが類似の情報を複数回入力する必要がなくなり、使いやすさが向上します。

値を一箇所で管理する

式を使用することで、値を一箇所で管理できます。例えば、taxRateという値がある場合、taxRateを変更するだけで、それが使用されているすべての場所に反映され、変更が容易になります。

使用方法、仕様

概要とユースケースを理解した後、具体的な使用方法と仕様について説明します。

式の使用方法

式は、readOnlyプロパティがtrueに設定されている場合にschemaプロパティで使用できます。デザイナーから、EditableチェックボックスをオフにすることでreadOnlyを設定できます。

以下のGIFに示すように、Editableチェックボックスをオフにすることで式の使用を開始できます。

Change ReadOnly

つまり、式が使用されているフィールドはユーザーが編集できません。

式の制限とセキュリティ

  • アロー関数のみがサポートされています。
  • eval関数は使用できません。
  • prototypeは使用できません。
  • 以下のグローバルオブジェクトとそのメソッドのみが使用できます:
    • Math
    • String
    • Number
    • Boolean
    • Array
    • Object
    • Date
    • JSON
    • isNaN
    • parseFloat
    • parseInt
    • decodeURI
    • decodeURIComponent
    • encodeURI
    • encodeURIComponent

詳細な仕様については、この実装を参照してください。

式内で使用できる変数

  • ユーザー入力値
  • 他のreadOnlyフィールドの値
    • 別のreadOnlyフィールドの値に式が使用されている場合、式が評価された後の値が使用されます。
  • 組み込み変数
    • currentPage
    • totalPages
    • date (YYYY/MM/DD)
    • dateTime (YYYY/MM/DD HH:mm)

式の例

以下は使用できる式の例です:

  • 小計: '{orders.reduce((sum, item) => sum + parseFloat(item[1] || 0) * parseFloat(item[2] || 0), 0)}'
  • 税額: '{Number(subtotalInput) * Number(tax.rate) / 100}'
  • 合計: '${Number(subtotal) + Number(tax)}'