Docurain Labo

Docurainサービス開発日記

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

配列データ内の任意の項目(キー)が別の値になった場合に改ページしたいことがよくあります。例えば、請求明細の取引先が変わったら改ページ、のような感じです。 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)もこちらからダウンロード可能です。 ぜひアカウント無料登録してお試しください。

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

商業印刷では裁ち落としのために標準サイズよりも数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:takahashikzn:20201001195027p: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を出力し続けますよ!という紹介でした。

6360ページのPDFを爆速で出力して経産省を援助する(CSVもあるよ)

こういうニュースを見ました。

news.careerconnection.jp

タイトルの通りでございますが、経産省3600ページのPDFでキャッシュレス還元対象店一覧を公開したとして、「読みにくい」「CSVかExcelにしろ」と文句を言われております。結構話題になったので、CSVとかExcelとかもそのうち公開されるんだろうなーって思ってたらこんなことになってました。

nlab.itmedia.co.jp

9月5日時点の加盟店登録申請は全国で約58万店。今後これを1ファイルで全て網羅すると、PDFファイルは1万ページの大台を超えてくるかもしれません。

すごい!少年漫画でよくある戦闘力のインフレみたいな感じですね。さすが、これでこそ我らが愛すべき日本国行政機関です。

まぁ本ブログにたどり着くような方々はおそらくITリテラシもお持ちでしょうから、こんな記事を見ると「これだから日本はIT後進国なんだ!さっさと検索機能を付けるとかマップ表示するとかしろ!!」と思うことでしょう。私もそれは思います。ちなみに記事執筆時点で確認した所、「9月中下旬には地図上に対象店舗を表示するウェブ機能やアプリを公開予定」と書いていますね。開発中のエンジニアの心労を察するに色々とアレですが…。

でも、こういうのって話題になってないだけで結構ありますよね。市町村のホームページとか、さすがに数千ページは無いにしても数十ページ、ずっとこういう店舗情報的なものがずらずらと並んでるPDFがあったりします。一方で厚労省の統計情報みたいなものはExcel形式でも配布されてますし、この差はなんなのかなーと昔から不思議でした。おそらくは、CSVやExcelといったファイルを扱えるのもそれなりのITリテラシがある人なので、こういうファイルを公開すると電話の問い合わせで


「お前のところでダウンロードしたエクセルが開けない」

「それは大変失礼しました、閲覧にはExcel 2007以降がお使いのPCにインストールされている必要がございます」

「なんだそれは、エクセルなら入っているぞ、バカにするな」

「申し訳ございません、エクセルの中でも2007というバージョン以降という制限がありますが、それに引っかかっているかも、と」

「なんだその2007とかいうのは。俺のパソコンにはそれが入っていないというのか。どうやったらわかるんだ」

「ええっと、まずはExcelを起動してですね…」

「だからそのファイルをダブルクリックしてもExcelが起動しないんだからしょうがないじゃないか」

「そうでしたね、ではスタートメニューから…」

「スタートメニューとは何だ」


という「誰でも簡単!パソコン教室電話サポートコーナー」みたいな地獄のやり取りを公務員の方々が対応するということになることは想像に容易いわけです。であるならば、PDFで公開しておけばスマホでもPCでもまず間違いなく見れるし、面倒くさいことを言われなそうという判断になっても仕方ないのかなーと思いましたが。一方で統計情報を参照したいなんて人は当然、Excelなんかも使いこなせてるでしょうから厚労省とかではExcelでも配布してるんでしょう。多分。全部想像ですが。でも私が上司で部下がこういう電話の対応に苦慮してたら、「いいよもう、PDFで公開しろよ。PDFに検索機能はあるんだから、それで十分じゃん」って言いますね。きっと。

話が逸れましたが、で、まぁ6360ページのPDFで、今後は1万とかになるかもしれないということですね。よく分からないですが、この経産省の中の人も何らかの事情があってPDFで公開する作業をしているのでしょう。そして、この地図表示するアプリとやらの開発状況によっては、暫くはこの方法を継続することになり、その都度PDFを何度も更新してアップロードするという作業が必要なわけで、ちょっと面倒ですよね。6360ページともなると、PDF出力するのも時間がかかりますし…。試しに、手元で5,000ページ位のExcelファイルを、Excelの機能でPDFへ変換した所、15分かかりました。毎回これをやるのはちょっと…。

…えっ、時間がかかる?本当に?

9秒でできますよ。そう、Docurainならね。

ExcelをテンプレートにしてJSONのデータを流し込み、帳票を作成するサービスのDocurainですが、処理速度にも気を配って開発しております。具体的には、こういった数千ページにも達する大量のPDFを出力する際は複数台のサーバーで分散処理が行えるようになっています。この分散処理を担当するサーバは負荷状況によって自動でスケールするようになっているので、理論的にはネットワーク容量の限界までどこまでも性能が向上していきます。(厳密には「分散した1個のタスクの完了+ネットワーク転送時間」以下には出来ませんが)

というわけでDocurainで同様の帳票を作成してみました。Excelのテンプレートとjsonのデータを利用して作成した出力結果は以下のようなものになります。

f:id:withpop:20190909113229p:plain

このテンプレートで経産省で公表された店舗データ(EC店舗除く)をすべて表示した所、5534ページのPDFとなりました。このとき、十分にスケールしたという状況を再現してのテストではありますが、先程説明した性能(9秒)が達成できました。

f:id:withpop:20190909111834p:plain

使用したテンプレート、JSONデータと出力データは以下です。CSVデータもこちらに含まれているので、必要な方は使ってください。JSONデータは50件に件数を減らしたものを同封しています。

データ一式

50件のデータならば登録不要でお試し頂けるこちらの体験ページでもJSONとExcelテンプレートからPDFを出力できます。

また、Docurainは単一リクエストの早さだけでなく大量のリクエストを同時に処理したときのスループットの早さも売りです。こちらも同様に今回のテンプレートで試してみた所、 30,546ページ/秒 という速度が出ました。すごい。

しかも、まださらに性能向上の余地があるので近々もっと良い結果を報告できるかも知れません。

ただ、いくつか注意事項があります。まず、この分散処理は有償オプションです。使用する場合は別途お申し込みが必要です。また、先程説明したとおりサービスは負荷状況によってスケールしていく仕組みなのでいつでもこの性能が出来るわけではありません。大量の帳票を出したい!という場合は詳しくはご相談ください。

ちなみにこういう何百何千ページにも達する帳票を印刷する必要が本当にあるのか?と思う方も多いと思いますが、我々は実際にそのような要望を複数の顧客から受けています。 「そんな大量のPDFを出力しても誰も見ないでしょ」という指摘が真っ当な場合もあるでしょう。一方で、最大で数千ページのPDFを出力できることが仕様として定められているシステムがある場合、実際にそういう使う方をするか否かとは無関係に、その機能が実際に動作するようにしなければなりません。例えばext4ファイルシステムにおける仕様上の最大ファイルサイズは16TiBですが、その時「実用上は16TiBのファイルなんてありえないから、1TiBが現実的な最大ということでもいいよね」という話はビジネスシーンでは通用しません。仕様とは約束事だからです。

そういうわけで、大量のページを出力するニーズが実際にあるので、Docurainは現実的なコストと時間でそれを実現する手段を提供しています。

詳しくは公式ページの情報もご参照ください。みんなの連絡待ってるぜ!!

docurain.jp