Docurain Labo

Docurainサービス開発日記

Docurainの紹介動画を追加しました

Docurainの魅力をわかりやすくお伝えするために動画を用意しました!

公式サイトからご覧いただけますが、以下にもフルバージョンを掲載しておきます。

ムービー中で繰り返し触れられているのがコスト削減効果ですが、これは帳票の生産性を従来製品に比べて大幅に向上させているとも言い換える事が出来ます。

エンジニアの皆様向けに少し補足すると、従来の帳票生成ツールというのは、まずデータを取得するデータソースを定義して、クエリを定義して、罫線やボックスをマウスでポチポチ配置して、データによる条件分岐をコード(イベントハンドラ)で実装して、テキストのはみ出しが無いか最大長のテキストデータでテストして…という、かなり手間のかかる作業フローに多くの時間が割かれていました。

それを、多くの人が使い慣れたExcel上でデザインし、かつ、高度な条件分岐や各種集計処理、改ページ制御などなどまですべてExcel上で完結できるとしたら…?どうでしょう?

Excelでの帳票テンプレートのデザインは特殊なアドオンなどは一切不要です。プログラミングの経験がある方ならば、前提知識が一切なくともテンプレートを見ただけで何となく使い方を理解できる、そんな可読性の高い優れた仕組みを採用しています。

「コスト1/5」は本当なのか?盛ってるんじゃないの?と思われますよね?私ならばそういう感想を持ちます…。

それはぜひ登録不要のテストページや登録無料、試用期限なしのアカウント取得を通じて試してみて判断して下さい!!

キーブレイクによる改ページができるようになりました

配列データ内の任意の項目(キー)が別の値になった場合に改ページしたいことがよくあります。例えば、請求明細の取引先が変わったら改ページ、のような感じです。 Docurainもこの要望を頂くことが多かったため、正式に「キーブレイク機能」として実装し、簡単に扱えるようにしました。

従来は任意の項目(キー)が別の値になったらページを分けたいという場合、該当項目の値ごとに分けた配列データとしてJSONを生成してください、というご案内をしていましたが、 キーブレイク機能により、単純な一次元配列のまま簡潔に記述することが出来ます。

早速試してみる

キーブレイク機能のサンプルのテンプレートとデータ(JSON)です。

ダウンロード f:id:yutay:20200602155129p:plain

[
  { "顧客名": "山田商店", "顧客ID": 100001, "商品": "みかん", "個数": 10, "単価": 100,  "請求額": 1000 }
  , { "顧客名": "山田商店", "顧客ID": 100001, "商品": "ぶどう", "個数": 15, "単価": 120,  "請求額": 1800 }
  , { "顧客名": "山田商店", "顧客ID": 100001, "商品": "バナナ", "個数": 5,  "単価": 200,  "請求額": 1000 }
  , /* 山田商店の明細がここに12個続く */
  , { "顧客名": "田中青果店", "顧客ID": 200001, "商品": "バナナ", "個数": 10, "単価": 100,  "請求額": 1000 }
  , { "顧客名": "田中青果店", "顧客ID": 200001, "商品": "レモン", "個数": 15, "単価": 120,  "請求額": 1800 }
  , { "顧客名": "田中青果店", "顧客ID": 200001, "商品": "メロン", "個数": 5,  "単価": 1200,  "請求額": 6000 }
  , /* 田中青果店の明細がここに7個続く) */
]

以下は↑のテンプレートとデータ(JSON)を使用してDocurainで出力したPDFです。
配列の各要素内の顧客名が別の値になったら改ページされていることがわかります。 f:id:yutay:20200602155152p:plain

データがどう変形されるか確認する

上記のサンプルデータのように一つの配列下に明細が並んでいるデータは、 $ENTITIES.chunk('顧客名') と記述することで 顧客名 をキーブレイクとして次のような二次元配列へと変換されます。

[
  [
    { "顧客名": "山田商店", "顧客ID": 100001, "商品": "みかん", "個数": 10, "単価": 100,  "請求額": 1000 }
    , { "顧客名": "山田商店", "顧客ID": 100001, "商品": "ぶどう", "個数": 15, "単価": 120,  "請求額": 1800 }
    , { "顧客名": "山田商店", "顧客ID": 100001, "商品": "バナナ", "個数": 5,  "単価": 200,  "請求額": 1000 }
    , /* 山田商店の明細がここに12個続く */
  ],
  [
    , { "顧客名": "田中青果店", "顧客ID": 200001, "商品": "いちご", "個数": 10, "単価": 100,  "請求額": 1000 }
    , { "顧客名": "田中青果店", "顧客ID": 200001, "商品": "すいか", "個数": 15, "単価": 120,  "請求額": 1800 }
    , { "顧客名": "田中青果店", "顧客ID": 200001, "商品": "メロン", "個数": 5,  "単価": 200,  "請求額": 1000 }
    , /* 田中青果店の明細がここに7個続く */
  ]
]

サンプルのテンプレートではこのトップレベルの配列を #foreach($dataGroup in $ENTITIES.chunk('顧客名')) のように繰り返しており、 上記のサンプルデータでは 顧客名 が "山田商店" の配列で1ページ目、"田中青果店"の配列で2ページ目が出力されることになります。

明細部の出力行数を制限

更に「1ページあたり10明細まで」のような制約を課したい場合は、以下のようにキーブレイクした配列を更に chunk(10) で分割します。 f:id:yutay:20200602155528p:plain

以下が上のテンプレートを使用してDocurainで出力したPDFです。(データは同じです)
顧客名が"山田商店"のデータは15個有りますが、1ページ目は10明細まで出力され、残りは2ページ目となっています。

f:id:yutay:20200602155414p:plain

#foreach($dataGroup in $ENTITIES.chunk('顧客名'))
  #foreach($dataOfPage in $dataGroup.chunk(10))
    ...
  #end
#end

と記述することで 顧客名 をキーブレイクとして顧客名ごとの二次元配列へ変形後、chunkで指定した10エントリごとの次のような配列に変形します。
(下記はイメージです。サンプル内ではforeachで繰り返すなかでchunk(10)により顧客ごとの配列をで10エントリごとの配列にしています)

[
  [
    [
      { "顧客名": "山田商店", "顧客ID": 100001, "商品": "みかん", "個数": 10, "単価": 100,  "請求額": 1000 }
      , { "顧客名": "山田商店", "顧客ID": 100001, "商品": "ぶどう", "個数": 15, "単価": 120,  "請求額": 1800 }
      , { "顧客名": "山田商店", "顧客ID": 100001, "商品": "バナナ", "個数": 5,  "単価": 200,  "請求額": 1000 }
      , ",...(山田商店の明細がここに7個続く)"
    ],
    [
      { "顧客名": "山田商店", "顧客ID": 100001, "商品": "みかん", "個数": 10, "単価": 100,  "請求額": 1000 }
      , { "顧客名": "山田商店", "顧客ID": 100001, "商品": "ぶどう", "個数": 15, "単価": 120,  "請求額": 1800 }
      , { "顧客名": "山田商店", "顧客ID": 100001, "商品": "バナナ", "個数": 5,  "単価": 200,  "請求額": 1000 }
      , ",...(山田商店の明細がここに2個続く)"
    ]
  ],
  [
    [
      { "顧客名": "田中青果店", "顧客ID": 200001, "商品": "いちご", "個数": 10, "単価": 100,  "請求額": 1000 }
      , { "顧客名": "田中青果店", "顧客ID": 200001, "商品": "すいか", "個数": 15, "単価": 120,  "請求額": 1800 }
      , { "顧客名": "田中青果店", "顧客ID": 200001, "商品": "メロン", "個数": 5,  "単価": 200,  "請求額": 1000 }
      , "...(田中青果店の明細がここに7個続く)"
    ]
  ]
]

今回使用したサンプルのテンプレートとデータ(JSON)こちらのページからも登録不要で試してみることが出来ます!

他にも様々な機能がありますので、ぜひアカウント無料登録してマニュアルを参照しお試しください。

チラシ・カタログ等の全面印刷PDFを作成できるようになりました

Docurain開発チームの矢森です。

チラシやパンフレット、カタログ、ポスターなどの全面印刷用(フチなし)のPDFが作成できるようになりました。 商業印刷設定に必要な仕上がりサイズや裁ち落とし領域が設定可能となり、つまりDocurainを簡易DTPソフトとして使用できます。

こちらが今回追加された商業印刷設定の機能を使用してDocurainにて出力したPDFです。 こちらからダウンロードできます。 f:id:yutay:20200522105419p:plain

Acrobat Readerにて確認すると裁ち落としサイズ、仕上がりサイズがガイドライン(青・緑)で表示されています。いわゆるデジタルトンボです。

実際に印刷会社様へデータを送って印刷をする際にはトンボが必要となることが多々あります。 このデジタルトンボが設定されていると、PDFのページサイズを変更し余白部分を作成後にデジタルトンボを元にトンボ(トリムマーク)を追加できます。 以下はページサイズを変更しトンボを追加したPDFです。 f:id:yutay:20200522105524p:plain

ページサイズを変更することでトンボを表示するエリアを追加し、トンボを追加しています。

PDF出力に使用したテンプレートは次の通りです。 実際のサンプルはこちらからダウンロードできます。 f:id:yutay:20200522105529p:plain

1,2行目でカスタムサイズを設定しています。 幅:216、高さ:303は仕上がりサイズのA4(210x297)に裁ち落とし領域を天地左右に3mmずつ設定するためのサイズです。

裁ち落とし領域を6mmにしたい場合は、

  • 天:6mm、地:6mm → 210 + 6 x 2 = 222
  • 左:6mm、右:6mm → 210 + 6 x 2 = 309

なので、

#set($paperWidth=222)
#set($paperHeight=309)

と設定します。

上記サンプルのA3〜A5のセルには余白調整や、裁ち落とし(塗り足し)領域の設定を記述しています。 各用紙サイズ(A3,A4,B5)で調整済みのテンプレートを既に用意済みです。よって実際にゼロから作成することは不要ですが、技術的に解説します。

以下は横・縦の余白調整のための値です。細かく確認・調整をして余白が出力されないようにします。

#set($bleedWidth = 2.0)    ## 横の余白調整値
#set($bleedHeight = 14.4)  ## 縦の余白調整値

以下は裁ち落とし(塗り足し)領域の幅・高さの値です。それぞれ3(mm)です。
(サンプルテンプレート内ではA5セルは非表示行となっていますので再表示で確認できます)

#set($trimWidth=($paperWidth.sub(210))/2)
#set($trimHeight=($paperHeight.sub(297))/2)

あとは#PDF_PROPERTY を使用して、各値をそれぞれ設定し完了です。

  • メディアサイズ(print.media.width/print.media.height)
  • 縦・横の余白調整値(print.bleed.x/print.bleed.y)
  • 裁ち落とし(塗り足し)領域の幅・高さ(print.trim.x/print.trim.y)

を指定する例は次の通りです。

#PDF_PROPERTY("
  print.media.width=$mediaWidth, print.media.height=$mediaHeight,
  print.bleed.x=$bleedWidth, print.bleed.y=$bleedHeight,
  print.trim.x=$trimWidth, print.trim.y=$trimHeight
")

今回使用したサンプルのテンプレートとデータ(JSON)もこちらからダウンロード可能です。 ぜひアカウント無料登録してお試しください。

A3,A4,B5の各サイズで調整済みのテンプレート(コンテンツ無し)を既に用意済みなので、 アカウント無料登録後に、コンソール画面のカスタム用紙出力ガイド内から必要なサイズのテンプレートをダウンロードして使ってみて下さい!

カスタムサイズの用紙を指定できるようになりました

商業印刷では裁ち落としのために標準サイズよりも数mm大きなサイズの用紙に印刷する必要がよくあります。

しかしDocurainから出力した帳票は、今までは標準的なサイズ(A判、B判など)でしか出力出来ませんでした。しかし今回のアップデートでPDF出力を行う場合に、標準の用紙サイズ以外のカスタムサイズを指定できるようになりました!

ちなみに、カスタム用紙サイズを出力できないというのはExcelの仕様によるものです。DocurainはExcelをテンプレートとして用いるため、必然的にExcelの仕様の制約を受けます。Excelではアプリ上でカスタム用紙サイズをサポートしていないんですよね…。WordやPower Pointでは出来るのですが。

そういった背景もあり、今回対応するカスタム用紙サイズ機能もPDF出力の場合のみの対応になります。

指定方法は、「PDFとExcelのセキュリティ関連機能が追加されました」で紹介した #PDF_PROPERTY を使用します。

具体的には、

#PDF_PROPERTY("print.media.width=310,print.media.height=220")

のように、幅と高さを指定します(単位はmm)。

今回作成したサンプル帳票はこちらからダウンロードできます。

サンプル帳票には上記で指定した #PDF_PROPERTY("print.media.width=310,print.media.height=220") がそのまま指定されています。A4(210 x 297)よりも1cmほど大きいサイズを指定してみました。※横向きの帳票なので縦横は逆になっています。

これでPDF形式で帳票を出力してみます。下記のような帳票(車検証)が出力されます。

f:id:withpop:20200409165701p:plain

見ただけでは指定したサイズになっているかどうか分かりませんね…。

Acrobat Readerから用紙サイズを確認してみます。

f:id:withpop:20200409165448p:plain

ページサイズが指定した通りになっていますね。

ここで、注意点がいくつかあります。

1つ目は、この機能は前述したように裁ち落としを含めた少し大きいサイズの用紙で印刷することを想定しています。Excelの印刷設定で指定した用紙よりも小さいサイズを指定することは出来ません(そのような指定は無視されます)。

2つ目は、コンテンツの位置です。PDF内のコンテンツ(テキストや罫線、画像など)は上下左右中央に位置するよう調整されます。つまり、縦横それぞれ10mmずつ大きいサイズを指定した場合は、上下左右にそれぞれ5mmずつの余白が出来ます。これを見越してレイアウトを行って下さい。

3つ目は、余白についてです。Excelの印刷設定でも余白(とヘッダー・フッター)のサイズは指定できますが、最終的に表示される余白はExcel上で指定した余白に用紙サイズが伸びた分が加算されます。これは若干分かりにくいので、Excel上で余白設定をすべてゼロで指定しておくことをおすすめします(こうすればサイズを大きくした分がそのまま余白となる)。

今回作成したサンプル帳票は、こちらのページからも登録不要で試してみることが出来ますので、気になったらぜひ試してみて下さい。

PDFとExcelのセキュリティ関連機能が追加されました

帳票開発の現場では、

  • システムから出力したあとに利用者が編集するのでExcelで出力したい
  • システムから出力したあとは編集させたくないのでPDFで出力したい

という正反対の2パターンの要望をよく聞きます。

DocurainはExcel、PDFどちらの形式でも出力が可能ですが、「編集させたくない」という用途ではちょっと機能不足な面がありました。

「編集させたくないのでPDFで出力したい」というのは、正確には誤りです。Adobe AcrobatなどのPDF編集ソフトウェアを使用すればPDFの編集は可能です。フリーソフトでもいくつか簡単なPDF編集が行えるものはありますね。ですから、「出力された帳票はExcelファイルを編集するのと同じような気軽さで編集して欲しくない」という用途ではこれでいいと思うのですが、「絶対に編集するのは禁止」という場合には対応できませんでした。

が、今回の機能追加でそのような要望にも対応できるようになりました。

Docurainで出力ファイルを保護する方法

テンプレートにセキュリティ設定を追記するだけです。

f:id:withpop:20200228092345p:plain

#BOOK_PASSWORD の第一引数は閲覧パスワード、第二引数は編集パスワードになります。Excel出力時もPDF出力時も有効です。編集パスワードだけを指定することもできます。 #PDF_PROPERTY はその名の通りPDFの属性設定で、

  • 「印刷」の可否
  • 「劣化印刷」の可否
  • 「文書の変更」の可否
  • 「文書アセンブリ」の可否
  • 「内容のコピー」の可否
  • 「アクセシビリティのための内容の抽出」の可否
  • 「注釈」の可否
  • 「フォームフィールドの入力」の可否
  • 暗号キー長

を指定できます。上記の例は印刷禁止、編集禁止ですね。

PDF出力してみる

今回使用するテンプレートとJSONはこちらです。

まずはPDFファイルで出力してみましょう。

f:id:withpop:20200228092930p:plain

Acrobatで開くとこのようにパスワードを要求されます。

f:id:withpop:20200228093027p:plain

Chromeで開くとこうなります。

パスワードを入力すると閲覧できます。

f:id:withpop:20200228093127p:plain

では続けてAcrobatで編集してみましょう。すると、またパスワードを要求されます。

f:id:withpop:20200228093226p:plain

編集用パスワードを入力すると編集できるようになります。

f:id:withpop:20200228093524p:plain

Acrobatから文書のセキュリティ情報を見てみました。指定したとおりに印刷が禁止されています。

f:id:withpop:20200228093716p:plain

メニュー上では「印刷」がグレーアウトして印刷できないようになっています。

f:id:withpop:20200228093901p:plain

Excel出力してみる

では次にExcel出力してみましょう。

f:id:withpop:20200228094158p:plain

出力したExcelファイルを開くとパスワードを要求されます。ここで設定した閲覧用パスワードを入力すると、

f:id:withpop:20200228094343p:plain

このように続けて編集用パスワードを要求されます。ここで「読み取り専用」で開くと、Excel上での編集は可能ですがファイルへの保存は出来なくなります。

まとめ

というわけで、今回の機能追加によりかなり細かく出力された帳票のセキュリティ設定が可能になりました。

これで、「出力された帳票を(Excelで)編集したい」「カジュアルな編集を防ぎたい」「絶対編集するのはダメ」すべてのパターンにDocurainは対応できます。

これらすべての要望を、ここまで簡単に対応できる帳票ソリューションはDocurain以外にありません。 もし気になった方は登録して触ってみてください。無償でトライアルできます!

日本の全帳票を出力するのは俺達だ!!〜1時間あたり4億ページを出力し続けるシステム

前回更新から時間が空いてしまいましたが、1ヶ月前くらいに新しい成果が出たのでご報告します。

我々の開発している帳票システム、Docurainですが、日々パフォーマンス向上・安定性向上・機能拡張に勤しんでおります。 パフォーマンスに関しては前回約5,000ページのPDFファイルをExcelファイルから9秒で出力しましたが、よりパフォーマンス向上を目的としてチューニングと試験を繰り返してきました。

我々の帳票生成エンジンは分散処理をすることが可能です。理論的には、処理するマシンの数に応じて青天井でパフォーマンスが伸びていきます。が、実際に数百というオーダーのサーバを束ねて運用した経験のある方なら分かってもらえると思いますが、実際は様々なボトルネックがあらゆるところに存在し、「分散処理できれば性能は青天井」などというのは夢物語であります。

そういうわけで我々は分散処理できてるからOK、ではなく、理論通りにサービスがスケールしていくこと、そこでクリティカルなエラーが発生しないことを実際に何度も試験しています。

というわけで前置きが長くなりましたが、この度の試験で実測値で

395Mpph

という結果を得ることができました。

pphというのは何かと申しますと、これは分かりやすく「帳票のパフォーマンス」を測定する指標が無いので「1時間あたりPDFを何ページ出力できるか」を表した単位を作り、社内で使用しています。「pph」は「Pages Per Hour」の略です。

なので395Mpphというのは1時間に3億9500万ページ、約4億ページ弱のPDFを出力できるということになります。繰り返しますが、これは 理論値ではなくて実測値 です。

日本国内でPDF形式の帳票が何ページ出力されているかはよくわからないのですが、1時間4億ページ弱も出力できたらもしかしたら日本の国内需要を満たしてしまうのでは…?と考えてしまいますね。いや、根拠は無いですが。でもまぁ私個人の気持ちとしてはゆくゆくは日本全部は非現実的としても、日本の帳票出力の何割かの出力を担えるようになりたいと思い、開発を続けています。

あと、これは十分にバックエンドのサーバがスケールした状態での結果なので常時この値が出るわけではありません。が、我々は高いパフォーマンスが必要とされているのならば、何としてでもそれを提供したいと思っています。

以上、Docurainは1時間あたり4億ページ弱のPDFを出力し続けますよ!という紹介でした。