Haru free PDF library でメタ情報やアウトラインを操作

今回は PDF のメタ情報や、ページのアウトラインを設定します。

パスワードの設定

PDF にパスワードを設定し、情報の公開を制限します。パスワードはオーナーおよびユーザ向けの2種類が設定可能で、オーナーのパスワードは必須になります。オーナーとユーザの違いは、パーミッション(後述)の変更ができるかどうかです。

pdf = HPDFDoc.new
# オーナー、ユーザのパスワードを設定
pdf.set_password("owner", "user")

パーミッションの変更

上で書いたパーミッションを変更します。この場合のパーミッションは、ファイルシステム的なそれではなく PDF に独自に付与される権限をさします。ユーザのパスワードでログインした場合、ここで指定した操作のみ許可されます。

利用可能なパーミッションの定数は以下の通り。

定数 操作
HPDF_ENABLE_READ 読み込み
HPDF_ENABLE_PRINT 印刷
HPDF_ENABLE_EDIT_ALL すべてのコンテンツの編集
HPDF_ENABLE_COPY テキストや画像のコピー
HPDF_ENABLE_EDIT 注釈とフォームの内容の編集
pdf.set_permission(HPDFDoc::HPDF_ENABLE_READ)

ここで注意なのですが、以下のように二つのパーミッションを指定する事はできないようです。

# コピーと印刷をさせたい
pdf.set_permission(HPDFDoc::HPDF_ENABLE_COPY)
pdf.set_permission(HPDFDoc::HPDF_ENABLE_PRINT)

set_permission を使わなければデフォルトですべての権限が付与されているので、単にパスワードで内容を保護したいだけの場合はこのメソッドは必要ありません。

メタ情報の付与

PDF にメタな情報を与えます。通常の情報をセットする set_info_attr 及び、時刻に関する情報を付与する set_info_date_attr を用います。

まずは set_info_attr から。

pdf = HPDFDoc.new
# 引数:情報種別の定数、値
pdf.set_info_attr(HPDFDoc::HPDF_INFO_AUTHOR, "John Doe")

情報の定数は以下のようになります。

  • HPDF_INFO_AUTHOR
  • HPDF_INFO_CREATOR
  • HPDF_INFO_TITLE
  • HPDF_INFO_SUBJECT
  • HPDF_INFO_KEYWORDS

ほとんど見たままですが AUTHOR と CREATOR の差はいまいち分かりません。Mac のプレビューについているインスペクタによると AUTHOR は作成者で CREATOR は内容の作成という解釈らしいです。

続いて、時刻に関する情報をセットします。

t = Time.now
pdf.set_info_date_attr(HPDFDoc::HPDF_INFO_CREATION_DATE, t.year, t.month, t.mday, t.hour, t.min, t.sec, '+', 9, 0)

それぞれの引数の意味と値は前から順に以下の通り。

意味
設定する値の定数 HPDF_INFO_CREATION_DATE, HPDF_INFO_MOD_DATE
数値
1〜12
1〜月に依存
0〜23
0〜59
0〜59
ローカル時と標準時の時差 " ", +, −, or Z
時差の値、時 0〜23, 時差表現が " " の場合無視
時差の値、分 0〜59, 同上

ここで時差の値は、たとえば日本なら +9:00 になるので上のコードのような表現になります。ただ、きちんと引数を指定したはずなのに『The eighth argument must be either of '+', '-', 'Z', ' '.』と叱られてしまうため、動作はチェックできていません。動いた方がいれば連絡をお願いします。

その他のメタ情報

パスワードをかける際の暗号化方式を指定するメソッドや、圧縮形式の指定ができるようです。あまり使う事のない機能だと思うので、メソッドだけ紹介しておきます。

ページモードの設定

PDF の表示にサムネイルやアウトライン(後述)を使うか、またフルスクリーンモードを使うかどうかの設定ができます。指定できる定数は以下。

意味
HPDF_PAGE_MODE_USE_NONE 通常の表示
HPDF_PAGE_MODE_USE_OUTLINE アウトラインを表示
HPDF_PAGE_MODE_USE_THUMBS サムネイルを表示
HPDF_PAGE_MODE_FULL_SCREEN フルスクリーンモードで表示

指定はこのように行います。

pdf = HPDFDoc.new

pdf.set_page_mode(HPDFDoc::HPDF_PAGE_MODE_USE_THUMBS)

ページレイアウトの設定

PDF のページごとの表示レイアウトを指定します。これも定数で指定します。

意味
HPDF_PAGE_LAYOUT_SINGLE 1ページだけ表示
HPDF_PAGE_LAYOUT_ONE_COLUMN 1カラムで表示
HPDF_PAGE_LAYOUT_TWO_COLUMN_LEFT 2カラムで表示、奇数番のページが左
HPDF_PAGE_LAYOUT_TWO_COLUMN_RIGHT 2カラムで表示、奇数番のページが右
pdf = HPDFDoc.new

pdf.set_page_layout(HPDF_PAGE_LAYOUT_SINGLE)

試してみましたが、エラーにはならないものの表示は変わらず。Adobe のリーダを使っていないので、環境によっては正しく見えるものと思われます。

アウトラインの作成

アウトラインとは何かというと、Adobe のリーダなどで右側に出ている目次のような部分(下図参照)の事です。

アウトラインの作成には create_outline メソッドを用います。以下、サンプルで示します。

pdf = HPDFDoc.new

# アウトライン表示を指定
pdf.set_page_mode(HPDFDoc::HPDF_PAGE_MODE_USE_OUTLINE)
# 見出しに日本語を使うので、その指定
pdf.use_jp_encodings
# 文字コードに EUC-JP(横書き)を指定
encoder = pdf.get_encoder("EUC-H")

root = pdf.create_outline(nil, "大見出し", encoder)
branch1 = pdf.create_outline(root, "中見出し1", encoder)
leaf1 = pdf.create_outline(branch1, "小見出し1", encoder)
leaf1 = pdf.create_outline(branch1, "小見出し2", encoder)
branch2 = pdf.create_outline(root, "中見出し2", encoder)
leaf3 = pdf.create_outline(branch2, "小見出し3", encoder)
leaf4 = pdf.create_outline(branch2, "小見出し4", encoder)

図のような階層化したアウトラインを作ってみました。create_outline の引数はそれぞれアウトラインの親ノード(nil の場合ルート)、アウトラインのタイトル、エンコードの指定です。当然ですが、エンコード指定を間違えると容赦なく文字化けするので注意。

また、アウトラインクリック時にどのページにリンクさせるかは、以下のように指定します。

# ページの追加
page = pdf.add_page
# ページにリンク先を作成
dst = page.create_destination
# アウトラインを作成
outline = pdf.create_outline(nil, "Outline", nil)
# リンクを設定
outline.set_destination(dst)

create_destination で位置を定義し、set_destination でその位置をアウトラインにセットしています。ページの途中に見出しが作れるかどうかは今のところ不明。