LASSIC Media らしくメディア
アプリのPDF帳票生成、端末内とサーバーどちらで実装
LASSIC IT事業部|元請(プライムベンダー)としてシステム保守・運用を受託
この記事のポイント
- 本稿はAI-OCRのような帳票の読み取りではなく、アプリ側でPDFや帳票を生成・出力する実装を扱います。
- PDF帳票の生成には、端末内生成とサーバー生成の2方式があります。端末内生成はiOSのPDFKit・UIGraphicsPDFRendererやAndroidのPdfDocumentを使う方法です。
- 端末内生成とサーバー生成は、レイアウト再現性・オフライン可否・セキュリティ・保守性の観点で得意分野が異なり、外注時にはこの判断軸の共有が欠かせません。
目次
- アプリのPDF帳票生成とは、端末内かサーバーかで実装方式が分かれる機能
- 端末内生成の仕組み——iOSのPDFKit・UIGraphicsPDFRendererとAndroidのPdfDocument
- サーバー生成の仕組み——テンプレートからPDFを作成しアプリに渡す構成
- レイアウト再現性・フォント・多言語対応で見る違い
- オフライン可否・セキュリティ・保守性で見る違い
- 生成したPDFの共有・印刷——UIActivityViewControllerとAndroid印刷フレームワーク
- 内製と外注の分かれ目——必要スキルと外注時に確認すべき要件
- まとめ:アプリのPDF帳票生成で押さえる3つの判断軸
- よくある質問
アプリのPDF帳票生成とは、端末内かサーバーかで実装方式が分かれる機能
アプリのPDF帳票生成とは、請求書や領収書、作業報告書といった帳票をアプリ内でPDF化し、閲覧・共有・印刷できるようにする実装を指します*1*4。本稿が扱うのは帳票を「作る」側の実装であり、紙の帳票をスキャンして電子化する「読み取る」側の話ではありません。読み取り・電子化のテーマは別稿で扱っています。
端末内生成は、iOSやAndroidが用意する描画APIを使い、アプリの中でPDFファイルを組み立てる方式です*2*4。サーバー生成は、サーバー側でPDFを作成し、アプリはAPI経由でダウンロードして表示・保存する方式です。どちらの方式が向くかは、扱う帳票の機密度や利用環境によって変わってきます。
端末内生成の仕組み——iOSのPDFKit・UIGraphicsPDFRendererとAndroidのPdfDocument
iOS——PDFKitで扱い、UIGraphicsPDFRendererで生成する
iOSにはPDFを扱うフレームワークとしてPDFKit(PDFの表示・操作を担うApple公式フレームワーク)が用意されています*1。ただしPDFKitの主な役割はPDFの表示・編集・操作であり、既存PDFへの注釈追加や画像からのページ作成が中心です*1。
帳票のレイアウトを描画してPDFを新規に作り出す用途では、UIGraphicsPDFRendererを使います*2。これはCore Graphicsのコンテキストを直接扱わずにPDFファイルを生成できるAPIです*2。pdfData(actions:)でPDFをデータとして生成でき、writePDF(to:withActions:)でファイルへ直接書き出せます*2。ページ内のbeginPage呼び出しを繰り返すことで、複数ページの帳票にも対応できる仕組みです*2。
なお同等の仕組みは、UIGraphicsBeginPDFContextToFileなど旧来のCore Graphics APIでも実現できました*3。旧APIの既定ページサイズは612×792ポイント(レターサイズ)でしたが*3、現在はUIGraphicsPDFRendererを使う実装が主流です*2。
Android——PdfDocumentでキャンバスに描画してPDF化する
Androidでは、android.graphics.pdf.PdfDocument(Android SDKが提供するPDF生成用クラス)を使います。startPageでページを開始しCanvasを取得、そのCanvasに帳票の内容を描画してfinishPageで確定するという流れです*4。全ページの描画が終わったら、writeTo(OutputStream)でファイルへ書き出しcloseで解放します*4。
iOS・Android双方とも「描画APIでキャンバスに帳票を組み立て、PDFとして書き出す」という発想は共通しています。とはいえAPIの呼び出し方や座標系はOSごとに異なるため、共通ロジックとして一本化することは容易ではありません。
サーバー生成の仕組み——テンプレートからPDFを作成しアプリに渡す構成
サーバー生成は、アプリからAPIを呼び出し、サーバー側でPDFを組み立ててアプリに返す構成です。帳票のレイアウトをHTMLやテンプレートエンジンで管理し、注文情報や利用者情報を差し込んでPDF化する実装が一般的です。
アプリ側の役割は、生成済みPDFをダウンロードして画面に表示するか、端末に保存することに絞られます。帳票フォーマットの見た目や項目を変更したいときも、サーバー側のテンプレートを更新するだけで、iOS・Android両方に同時に反映できます。
会計システムや基幹システムと帳票データを連携させる場合も、サーバー側にPDF生成処理を置いておくと、他システムとの連携ロジックをまとめやすくなります。
レイアウト再現性・フォント・多言語対応で見る違い
端末内生成とサーバー生成の違いは、レイアウト再現性・フォント対応・オフライン可否・保守性・セキュリティ・コスト構造の6つの観点で整理できます。まず主要な3観点を表で比較します。
| 比較軸 | 端末内生成 | サーバー生成 |
|---|---|---|
| レイアウト再現性 | OSの描画APIで直接描画するため、意図したレイアウトをそのまま再現しやすい。 ただしOSごとに実装コードが分かれる。 |
HTMLやテンプレートエンジンで一元的に生成でき、複数端末でも同じ見た目を再現しやすい。 サーバー側の描画エンジンの表現力に依存する。 |
| フォント・多言語対応 | 端末にインストールされたフォントに依存する。 多言語帳票では必要なフォントをアプリに同梱する必要がある。 |
サーバー側で任意のフォントファイルを一元管理できる。 多言語対応のフォント切り替えを集中管理しやすい。 |
| オフライン可否 | 通信を使わずに帳票を生成できる。 電波の届かない現場でも発行できる。 |
PDF生成にAPI呼び出しが必要になる。 オフライン環境では帳票を発行できない。 |
オフライン可否・セキュリティ・保守性で見る違い
残る3つの観点は、保守運用とセキュリティに関わります。まずフォーマット変更への対応スピードを見ます。
| 比較軸 | 端末内生成 | サーバー生成 |
|---|---|---|
| 保守性・更新 | 帳票フォーマットの変更にアプリの更新配布が必要になる。 ストア審査を経るため反映までに時間がかかりやすい。 |
テンプレートをサーバー側で更新すれば反映できる。 アプリの改修や再配布は原則不要になる。 |
| セキュリティ(機密帳票) | 生成したデータが端末内に留まり、通信経路に帳票データを流さずに済む。 端末自体の紛失・盗難対策は別途必要になる。 |
帳票データが通信経路を通過するため、暗号化通信と認可設計を確認する必要がある。 サーバー側のアクセス制御・保存データの管理も対象になる。 |
| コスト構造 | iOS・Androidそれぞれで実装するため、プラットフォーム別の開発コストが発生する。 サーバー側の帳票生成基盤は不要になる。 |
帳票生成ロジックを一箇所にまとめられる。 一方でサーバーの稼働・スケーリングにかかる運用コストが継続的に発生する。 |
契約書や見積書のように機密性の高い帳票をサーバー経由で生成する設計を誤ると、通信経路や保存先でデータが漏えいするリスクがあります*8。個人情報や取引条件を含む帳票では、暗号化通信や保存データの扱いを事前に取り決めておく必要があります。
生成したPDFの共有・印刷——UIActivityViewControllerとAndroid印刷フレームワーク
PDFを生成した後は、共有や印刷につなげる導線も欠かせません。iOSでは、UIActivityViewController(共有シートを表示する標準UIコンポーネント)を使います*5。生成したPDFをメールやメッセージ、他アプリへ渡せます*5。iPadではポップオーバーで、iPhoneではモーダルで提示することが求められています*5。
Androidには、API level 19以降で利用できる印刷フレームワークが用意されています*6。PrintManagerで印刷ジョブを開始し、PrintDocumentAdapterに処理を委ねます*7。onLayoutでページ数を計算し、onWriteでPrintedPdfDocumentを使ってページをPDF化します*7。
両OSともPDFの座標をポイント(1/72インチ)単位で扱う点は共通しています*3*7。この単位はデスクトップ向けのDTP(Desktop Publishing)からPDF仕様に受け継がれたものです。iOS・Androidどちらの実装でも、同じ考え方で座標を組み立てられます。
内製と外注の分かれ目——必要スキルと外注時に確認すべき要件
端末内生成をゼロから実装するには、複数の専門知識が求められます*2*4。具体的には、iOS側のUIGraphicsPDFRenderer、Android側のPdfDocument、フォント・多言語対応、共有・印刷までの実装知識です。サーバー生成を選ぶ場合も、テンプレートエンジンの選定からAPI設計、通信の暗号化まで含めた検討が求められます。
専門パートナーに委託する場合と内製で対応する場合の違いは、この一貫した設計力の差です。内製では既存のアプリ開発担当者が通常業務と並行して対応することになり、iOS・Android双方の実装や検証に割ける時間が限られる場合があります。専門パートナーであれば、帳票のフォーマット要件からセキュリティ設計までを一括して相談できます。
。扱う帳票の機密度や利用環境(オフライン前提かどうか)を整理してから、内製・外注の切り分けを検討することが実務的です。
まとめ:アプリのPDF帳票生成で押さえる3つの判断軸
本稿ではアプリのPDF帳票生成について、端末内生成とサーバー生成の仕組みと違いを、Apple・Android公式情報をもとに整理しました。要点は3つに集約できます。第一に、端末内生成はiOSのUIGraphicsPDFRenderer、AndroidのPdfDocumentを使う方式です*2*4。オフラインでも帳票を生成できる点が特徴です。第二に、サーバー生成はテンプレートを一元管理できる一方、通信環境が前提になり、機密帳票では通信経路のセキュリティ設計が欠かせません。第三に、判断は帳票の機密度・利用環境・保守スピードのどれを優先するかで分かれ、外注時にはこの判断軸を委託先と共有することが大切です。
よくある質問
アプリのPDF帳票生成は、端末内とサーバーのどちらを選べばよいですか。
オフライン環境での利用が前提の帳票や、通信経路にデータを流したくない機密性の高い帳票は端末内生成が向いています*2*4。反対に、複数端末で同じフォーマットを一元管理したい場合や、フォーマット変更を頻繁に行う帳票はサーバー生成が向いています。
iOSとAndroidでPDF生成の実装を共通化できますか。
iOSのUIGraphicsPDFRendererとAndroidのPdfDocumentは、それぞれ異なるAPIとして提供されています*2*4。そのため描画ロジックをOSごとに実装する前提で計画することが実務的です。共通化を重視する場合は、サーバー生成に切り替えるという選択肢もあります。
生成したPDF帳票を端末から共有・印刷する方法はありますか。
iOSではUIActivityViewControllerを使うと、生成したPDFをメールや他アプリへ共有できます*5。Androidでは印刷フレームワークのPrintManagerとPrintDocumentAdapterを使い、印刷ジョブとしてPDFを出力できます*6*7。
サーバー生成の場合、通信環境が悪いと帳票を発行できませんか。
サーバー生成はPDF生成のためにAPI呼び出しが必要なため、通信ができない環境では帳票を発行できません。オフラインでの発行が業務要件に含まれる場合は、端末内生成を選ぶか、両方式を組み合わせる設計を検討する必要があります。
PDF帳票生成の実装を外注する場合、何を確認すればよいですか。
iOS・Android双方のネイティブAPIでの実装経験と、フォント・多言語対応の実績をまず確認します。加えて、機密帳票を扱う場合はセキュリティ設計への対応範囲を委託先とすり合わせることが大切です。契約前に、オフライン要件や保守体制まで含めて要件を共有しておくと、実装後の手戻りを抑えやすくなります。
著者:テレリモ総研編集部 鈴木 亮佑
ご不明な点はお問い合わせフォームからもご連絡いただけます。
- *1 出典:Apple「PDFKit」(Apple Developer Documentation)(https://developer.apple.com/documentation/pdfkit)
- *2 出典:Apple「UIGraphicsPDFRenderer」(Apple Developer Documentation)(https://developer.apple.com/documentation/uikit/uigraphicspdfrenderer)
- *3 出典:Apple「Generating PDF Content」(Drawing and Printing Guide for iOS、Apple Developer Archive)(https://developer.apple.com/library/archive/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GeneratingPDF/GeneratingPDF.html)
- *4 出典:Android Developers「PdfDocument」(API reference)(https://developer.android.com/reference/android/graphics/pdf/PdfDocument)
- *5 出典:Apple「UIActivityViewController」(Apple Developer Documentation)(https://developer.apple.com/documentation/uikit/uiactivityviewcontroller)
- *6 出典:Android Developers「Printing files」(Training・App data and files)(https://developer.android.com/training/printing)
- *7 出典:Android Developers「Printing custom documents」(Training・App data and files)(https://developer.android.com/training/printing/custom-docs)
- *8 出典:Apple「UIGraphicsPDFRenderer」「PDFKit」および Android Developers「PdfDocument」「Printing custom documents」の各解説内容に基づく実装上の留意点(機密データの通信経路・保存に関する一般的なセキュリティ設計指針として本稿が整理)