pdf ファイルからイメージファイルを取り出す(ruby, poppler)
ruby で pdfファイル内のテキスト、図の情報を取り出すのをどうするか。
簡単なのは poppler みたいなので、試して見る。
poppler 自体は他の gem のインストール時に勝手に入っているので問題なし。
ただし日本語を含むものはエラーが出るので poppler-data が必要のようだ。
Windows上のRubyで日本語PDFを読むためにpoppler-dataをインストールする方法 - アイデアの甕 を参考にさせてもらった。
Poppler の下の方にある、poppler-data のリンク
(本日現在で https://poppler.freedesktop.org/poppler-data-0.4.7.tar.gz )を解答したフォルダを
poppler にリネームして、poppler-gem の下に置けば良い。
こちらの環境では次のフォルダの下ということにになる。
C:\Programs\ruby\lib\ruby\gems\2.3.0\gems\poppler-3.0.8-x86-mingw32\vendor\local\share
テキストの取り出しは至って簡単。
イメージの取り出しは、pdf に格納されているままということではなく、write_to_png で png ファイルとして書き出すことになる。
image_mapping メソッドがページ内のイメージ数の取得に使えそうだが、[]を返すので、nil になるまでループを回すしかなさそう。
require 'poppler' if ARGV.empty? puts 'usage: rb get_image.rb file [files...]' exit end ARGV.each_with_index do |file, file_num| file = file.encode 'utf-8' doc = Poppler::Document.new file doc.pages.each_with_index do |page, page_num| puts "file: #{file}, page: #{page_num}" image_num = 0 loop do img = page.get_image image_num break unless img filename = "#{File.basename(file, '.*')}_#{page_num}_#{image_num}.png" img.write_to_png filename image_num += 1 end end end
Rubyの組み込みクラスの一覧を表示してみる
組み込みクラスの一覧を表示してみたいと思い立った。
考えたのは
- Objectの定数一覧取得
- それぞれの定数からクラスを得る
- そのクラスがClassであれば、組み込みクラス
[8] pry(main)> puts Object.constants.select { |x| Kernel.const_get(x).class == Class } Object Module Class BasicObject NilClass Data TrueClass FalseClass Encoding String Symbol Exception SystemExit SignalException Interrupt StandardError TypeError ArgumentError IndexError KeyError RangeError ScriptError SyntaxError LoadError NotImplementedError NameError NoMethodError RuntimeError SecurityError NoMemoryError EncodingError SystemCallError UncaughtThrowError ZeroDivisionError FloatDomainError Numeric Integer Fixnum Float Bignum Array Hash Struct RegexpError Regexp MatchData Range IOError EOFError IO File Dir Time Random Proc LocalJumpError SystemStackError Method UnboundMethod Binding Enumerator StopIteration RubyVM Thread ThreadGroup ThreadError ClosedQueueError Mutex Queue SizedQueue ConditionVariable Fiber FiberError Rational Complex TracePoint StringIO Monitor Delegator SimpleDelegator PrettyPrint PP Pry Slop Tempfile Pathname Insertion SymbolHash OpenStruct OptionParser OptParse Logger StringScanner ScanError => nil
うまくいっている模様。*Errorは例外クラスと
Errorは例外クラス。
普段見慣れないものもかなりある。
Windows版Rubyでp メソッドが文字化けする件の回避(-Uオプション)
いわゆるprintfデバッグに相当する pメソッドなのだが、漢字が正しく表示されない。
例えば
class Tel def initialize(number, name) @number = number @name = name end end kyoto = Tel.new('075', '京都市') p kyoto
を実行すると、ruby 1.9からだったと思うが、
> ruby tel.rb #<Tel:0x2dcb764 @number="075", @name="\u4EAC\u90FD\u5E02">
のように悲しい結果になる。
試行錯誤の結果、どうやらEncoding.default_internal の問題の模様。
実際に
def show_enc %i(default_external default_internal).each do |enc| puts "Encoding.#{enc} => #{Encoding.send(enc).inspect}" end end class Tel def initialize(number, name) @number = number @name = name end end kyoto = Tel.new('075', '京都市') p kyoto show_enc
とすると
> ruby tel.rb #<Tel:0x2dbb79c @number="075", @name="\u4EAC\u90FD\u5E02"> Encoding.default_external => #<Encoding:Windows-31J> Encoding.default_internal => nil
となっている。
そこで、-U オプションを付けてやると
> ruby -U tel.rb #<Tel:0x2f1ab10 @number="075", @name="京都市"> Encoding.default_external => #<Encoding:Windows-31J> Encoding.default_internal => #<Encoding:UTF-8>
と幸せになれるという次第。
環境変数RUBYOPTに-Uを設定しておくと手間もかからない。
ただし、Rubyinstallerのruby.exeだと何故かエラーになることがある。
環境にもよるようだが、ASRだと今のところ問題なし。
陽気なギャングが地球を回す - 伊坂幸太郎
久しぶりの伊坂幸太郎。
各節の最初にある辞書がなかなかおもしろい。
- 作者: 伊坂幸太郎
- 出版社/メーカー: 祥伝社
- 発売日: 2003/02
- メディア: 新書
- 購入: 5人 クリック: 33回
- この商品を含むブログ (354件) を見る
マンガでJavaScriptがわかると思っているのかお前は
良いなこれ。
次が楽しみ。是非続けてほしい。