カテゴリー別アーカイブ: PDF

チェックマークのみのフォントファイルと,それをPrawnから使う

書類や帳票などをプログラムで自動生成させるようにすると捗ります。

ところで,事務書類では「チェックマーク」が要求されることがたまにあります。
(環境によっては見えないかも知れませんが「✔」のことです(「ゝ」を時計回りに90度回転させたような記号)。)

このような用途に私はRubyとPrawnを使っていますが,PrawnはUnicodeに対応したTrueTypeフォントも非常に簡単に扱えるため,チェックマークが含まっているフォントファイルさえ用意できればあとはそのフォントをPDF::Document::font した上で PDF::Document::draw_text メソッドで簡単に出せます。
このようなフォントとしては,MigMix 1Pなどがあります。

MigMix 1Pは非常に素晴らしいフォントなのですが,帳票によっては雰囲気にそぐわなかったりするため,1枚の帳票の中で他のフォントとMigMix 1P(のチェックマーク)とを切り替えて使ったりしています。ただ,チェックマークのためだけにフォントファイルを同じディレクトリに置いたりするのもちょっとどうかなと思っています1

そこで,「チェックマーク1文字だけが入っているフォントファイル」をMigMix 1Pから作りました2
たぶん需要は私だけだと思いますが,一応以下に置いておきます。
ライセンスは MigMix 1P に準じて,IPAフォントライセンスでお願いします。
migmix-1p-checkmark.ttf (zip)

Prawnで使うときは以下のような感じです3

#!/usr/bin/ruby
require 'prawn'
require 'prawn/measurement_extensions'

Prawn::Document.generate("test-checkmark.pdf",
                         { :page_size => 'A4',
                           :page_layout => :portrait,
                           :margin => 0, }){
  font "migmix-1p-checkmark.ttf"

  # チェックマークが直接入力できる場合はこちら
  draw_text "✔", :at => [10.5.cm, 25.2.cm], :size => 10

  # チェックマークが直接入力できない場合はこちら
  # "✔".codepoints.map{|v| v.to_s(16)} #=> 2714
  draw_text 0x2714.chr("UTF-8"), :at => [10.5.cm, 24.2.cm], :size => 10
}

RubyでPDFのページ数を数える

Rubyスクリプトから,既存のPDFファイルの総ページ数をカウントしたいことがたまにあります。

方法はいくつか考えられます(多少強引なのも含めて)。

PDF::Readerを使う方法

たぶん一番スマート。

#!/usr/bin/env ruby
require 'pdf/reader'

fname = "test.pdf"
p PDF::Reader.new(fname).page_count

PDF::Readerはgemでインストールできます。

$ gem install pdf-reader

続きを読む

白紙のPDF

需要があるかは謎ですが,白紙のPDFを置いてみます。改造や再配布はご自由にどうぞ。

これらが必要になる場面としては例えば,「幾人かの原稿をまとめて一つのPDFにしたいのだけど,各人の1ページめは必ず奇数ページにこないといけない」ような状況を想定しています。花子さんの原稿が3枚で次に太郎さんの原稿を置く場合,間にこの白紙PDFを挟めば良いかと。pdftk でやるならこうですね。

pdftk hanako.pdf blanksheet-a4-portrait.pdf tarou.pdf cat output all.pdf

Acrobatを持っている場合は新規空白ページを作成する方法(Acrobat X)でも可能なようですが,スクリプトでだーっとやりたい場面が多いので。

なお,これらのPDFは,Ruby と libHaru を用いて以下のようなスクリプトで生成しました。

#!/usr/bin/env ruby
require "hpdf"

sizes = %w(A4 A3 A5 B4 B5 LETTER)
directions = %w(PORTRAIT LANDSCAPE)

directions.each do |direction|
  sizes.each do |size|
    pdf = HPDFDoc.new
    page = pdf.add_page
    page.set_size(eval("HPDFDoc::HPDF_PAGE_SIZE_#{size}"),
                  eval("HPDFDoc::HPDF_PAGE_#{direction}"))
    pdf.save_to_file("blanksheet-#{size.downcase}-#{direction.downcase}.pdf")
  end
end

(2017-05-15 追記)
上記スクリプトは libHaru を用いていましたが,libHaru を Ruby から使う場合は hpdf.so が Ruby のバージョンに依存してしまうのがちょっとつらいところです。

Prawn は Pure Ruby なのが良いですね。というわけで最近PDF生成関係のスクリプトを Prawn で書き直したりしています。A4ポートレートの白紙PDFをPrawnで生成するとしたらこんな感じでしょうか。

#!/usr/bin/env ruby
require "prawn"

Prawn::Document.new(:page_size   => 'A4',
                    :page_layout => :portrait).render_file("hakushi-a4.pdf")