PDF 帳票自動生成でページ数を切り替える(ページングする)方法

データの量によってページ数を切り替えて PDF 帳票を自動生成させるための対応

 

少し前の話ですが、立て続けに同じ質問をいただきました。

 

Questetra の PDF 帳票自動生成でデータの量によってページ数の切り替えができますか?
→できます!

 

実際に対応したケースを元に、どういう対応方法になるかを説明します。

  • ケース1:経費精算の明細行数でのページ数切替(テーブル型のデータ行数で切替)
  • ケース2:報告の文章量でのページ数切替(文字型複数行での行数および文字の量で切替)

 

※そもそも Questetra で PDF 帳票自動生成がどうすればできるのかについては、以下をご覧ください。
M228 自動工程 業務データを挿し込んだPDF帳票が自動生成されるように設定する

 

pdf%e3%83%9a%e3%83%bc%e3%82%b8%e3%83%b3%e3%82%b0

 


実現方法としてはおおよそ以下のような形になります。

  • 台紙 PDF を1ページ・2ページと各パターンで準備(そのためページが多くなるケースがあるものには不向きで、ページ数には上限がつきます)
  • プロセスモデルの流れとしては、スクリプトタスクでデータ量からページ数を判断し、ゲートウェイで分岐させて使う台紙 PDF を切替するようにする

 

pdf%e3%83%9a%e3%83%bc%e3%82%b8%e3%83%b3%e3%82%b0%e3%81%ae%e3%83%a2%e3%83%87%e3%83%ab

 


テーブル型を使っている場合は、項目フィールドが多いので、台紙 PDF の設定にちょっと手間がかかります。
一方スクリプトタスクでのページ数の判断は非常にシンプルです。
台紙 PDF は以下のサンプルが参考になります。
「立替金フロー、月初の自動起動がイイ、PDFの自動生成がイイ」
スクリプトサンプルは以下の通り(選択型データでページ数を持たせています)。

var table = data.get("1");

if (table) {
  if (table.size() <= 20) { //20行以内なら1ページ
    var selects = [ "1" ];
    retVal.put("2", selects);
  } else {
    var selects = [ "2" ];
    retVal.put("2", selects);
  }
} else { //テーブルが空のケースの考慮
  var selects = [ "1" ];
  retVal.put("2", selects);
}

 


ケース1のテーブル型の場合に比べて、台紙 PDF の設定はカンタンです。
一方、スクリプトタスクでのページ数の判断は、ロジックが少し複雑になります。1行あたりの文字数も考慮して行数をカウントして判断する必要があるからです。また、分割した後の文字型データを保持するデータ項目の追加も必要になります。
スクリプトサンプルは以下の通り(あまり厳密なロジックにはしていません)。

var text = data.get("1") + "";

//台紙PDFにあわせて2ページまでしか考慮しない
var cutText = new Array();
cutText[0] = "";
cutText[1] = "";

//文字データが空の場合の考慮
if (text != "null") {
  var lines = text.split(/\r\n|\r|\n/);

  var textCount = 0;
  var j = 0;

  for (i = 0; i < lines.length; i++) {
    //1行は50文字までとして切り上げて行数カウント
    var count = Math.ceil(lines[i].length / 50);

    //空行の考慮
    if (count == 0) {
      count = 1;
    }

    //1ページは30行までとして改ページ(1行が異常に長いケースは考慮せず)
    if (textCount + count > 30) {
      j++;
      textCount = count;
      cutText[j] = lines[i] + "\n";
    } else {
      textCount += count;
      cutText[j] += lines[i] + "\n";
    }
  }
}

retVal.put("2", cutText[0]);
retVal.put("3", cutText[1]);

 

もしご質問などございましたら、お問合せフォームからご連絡ください。

 

Kusaka Tsuyoshi の紹介

営業をやってますが、もともとエンジニアなので、プログラミングもやります。
Kusaka Tsuyoshi の投稿をすべて表示

あわせて読みたい
50.Questetra Tips の前の記事 ルールに従ったファイル名に自動変更する方法
50.Questetra Tips の次の記事 自らの API をたたいて処理を自動化する方法
Kusaka Tsuyoshi の他の記事 Googleスプレッドシート でプロセスを一括開始させる方法

アーカイブ

 RSS