2016年2月13日土曜日

OS X : PDFの作成

サンプルアプリケーションを作成して、以下のような PDF ファイルをユーザーホームに作成します。
作成されたPDFファイルをプレビューで表示:

では、作業手順を説明します。

新規プロジェクトの作成

Xcode で、メニューバー> File > New > Project... を選択します。
OS X/Application の Cocoa Application テンプレートを選択して新規プロジェクトを作成します。
参照:Xcode 7.2 の使い方/プロジェクトの作成

ストーリーボードでシーンにボタンを追加

このアプリの UI は1つのビューと、そのビューにPDF作成のトリガーとなるボタンが1つだけある簡単なものとします。
プロジェクト作成で自動的に作成されたビューコントローラのビューにオブジェクト・ライブラリからボタンを追加します。

プロジェクトに PDF グループを作成して、以下の3つのクラスを作成します:
ボタンと、上記3ファイルを追加した状態:

PDFページ生成クラス

Quartz パッケージの PDFPage のサブクラスとして、PdfWriter クラスを作成します。
親クラスの PDFPage の機能と使い方に集中するために、このクラスには最低限の機能しかもたせていません。
PDF/PdfWriter.swift:
  • 52-76行:fテキスト描画( )
    ページの左上(0,0)を基準にして、指定座標(x,y)に、色/スタイル/フォントなどを指定して、テキストを出力します。
    • 63,64行:String オブジェクトの drawInRect を使ってテキストを出力します。

PDFテーブルページ作成クラス

PdfWrite のサブクラスとしてテーブルページを生成するための PdfTablePage クラスを作成します
PDF/PdfTablePage.swift:
  • 59-87行:drawWithBox( ):
    PDFPage の drawWithBox をオーバーライドします。
    PDFPage はインスタンスが生成されると、この関数によりページを生成します。
    • 62行:行番号の初期値を設定します。0はページの一番上、ヘッダ行を表します。
      y座標は行番号から計算されます。
    • 67-73行:pdfWriter.fテキスト描画( ) を使って、ヘッダを表示して、行番号を次の行に設定します。
    • 76-78行:self.fテーブル行描画( ) により、テーブルの各行を出力します。
    この関数内でネイティブの描画コードを使って、テキストやイメージや図形を描画することで、PDFページに描画することができます。
  • 24-48行:fテーブル行描画( ):
    後述する PDFテーブル行オブジェクトの列リスト情報からテーブルの一行を出力します。
    • 29-47行:列リストの要素数だけ列の出力を繰り返します。各要素は後述する PDFテーブルセル構造体を保持しています。
      最終的に、PDFテーブルセルの情報から pdfWirter.fテキスト描画( )に渡すパラーメータを解決して列を出力します。

PDF定義クラス

上述の PdfWriter, PdfTablePage で使用する定数や構造体の定義を行います。
PDF/PdfDef.swift:

出力データの作成

通常のアプリケーションでは、データベースや、ファイルから読み込んだデータに基づいてレポート(PDFファイル)を作成すると思います。このサンプルでは、成績データをもとに成績一覧レポートを作成することにします。
ここでは簡単にするために、ViewController で出力データの定義をハードコードしています。
PDF/ViewCOntroller.swift:
  • 6-20行:生成データを表す構造体を定義します。
  • 25-27行:テーブルのヘッダ、フッタ、データを持つ PDFテーブル行の配列(zテーブルヘッダ, zテーブルフッタ, zテーブルデータ)を定義します。
  • 31行:ビューがロードされたら、データ設定() 関数を実行して、zテーブルヘッダ、zテーブルフッタ、zテーブルデータにデータを設定します。
  • 60-179行:データ設定() 関数:
    サンプルデータとして、100件の S成績データを生成して、それをもとに、ヘッダ、フッタ、データ行を作成します。

追加したボタンの押下時のアクション処理

  • 184行:まず PDFDocument のインスタンスを生成します。
  • 193-223行:zデータテーブル(PDFテーブル行のインスタンスを要素に持つ配列)の先頭要素から最終要素までテーブル行の出力を繰り返します
    • 195行:ページの行数から該当ページの最終データ行のデータ番号を計算します。
    • 198-202行:該当ページが最終ページの場合はテーブルフッタ(平均点の行)を作成します。
    • 205-207行:該当ページの全出力行を作成します(ヘッダ+データ+フッタ)。フッタは最終ページのみ作成されます。
    • 213-215行:PdfTablePage のインスタンスを作成します。これにより、該当ページのテーブル行が出力されます。
    • 218行:作成したページを184行で作成した PDFDocument インスタンスに追加します。
  • 226,227行:作成した PDFドキュメントをユーザーのホームディレクトリに出力します。

0 件のコメント:

コメントを投稿