poppler 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +369 -0
 - data/README +37 -0
 - data/Rakefile +72 -0
 - data/extconf.rb +49 -0
 - data/sample/number-pdf.rb +32 -0
 - data/sample/pdf2.rb +107 -0
 - data/sample/pdf2svg.rb +26 -0
 - data/sample/pdf2text.rb +16 -0
 - data/sample/pdfdiv.rb +36 -0
 - data/src/lib/poppler.rb +108 -0
 - data/src/rbpoppler-action.c +222 -0
 - data/src/rbpoppler-annotation.c +307 -0
 - data/src/rbpoppler-attachment.c +116 -0
 - data/src/rbpoppler-document.c +492 -0
 - data/src/rbpoppler-form-field.c +291 -0
 - data/src/rbpoppler-page.c +773 -0
 - data/src/rbpoppler-private.h +56 -0
 - data/src/rbpoppler.c +90 -0
 - data/src/rbpoppler.h +60 -0
 - data/src/rbpopplerversion.h +24 -0
 - data/test/poppler-test-utils.rb +47 -0
 - data/test/run-test.rb +27 -0
 - data/test/test_annotation.rb +84 -0
 - data/test/test_color.rb +26 -0
 - data/test/test_constants.rb +30 -0
 - data/test/test_document.rb +41 -0
 - data/test/test_page.rb +78 -0
 - metadata +122 -0
 
    
        data/extconf.rb
    ADDED
    
    | 
         @@ -0,0 +1,49 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 2 
     | 
    
         
            +
            extconf.rb for Ruby/Poppler extention library
         
     | 
| 
      
 3 
     | 
    
         
            +
            =end
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            PACKAGE_NAME = "poppler"
         
     | 
| 
      
 6 
     | 
    
         
            +
            PACKAGE_ID = "poppler-glib"
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            begin
         
     | 
| 
      
 9 
     | 
    
         
            +
              require 'mkmf-gnome2'
         
     | 
| 
      
 10 
     | 
    
         
            +
              USE_GLIB_GEM = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              TOPDIR = File.expand_path(File.dirname(__FILE__) )
         
     | 
| 
      
 12 
     | 
    
         
            +
              SRCDIR = TOPDIR + '/src'
         
     | 
| 
      
 13 
     | 
    
         
            +
              require 'glib2'
         
     | 
| 
      
 14 
     | 
    
         
            +
              require 'gdk_pixbuf2'
         
     | 
| 
      
 15 
     | 
    
         
            +
              require 'gtk2/base'
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            rescue LoadError => e
         
     | 
| 
      
 18 
     | 
    
         
            +
              TOPDIR = File.expand_path(File.dirname(__FILE__) + '/..')
         
     | 
| 
      
 19 
     | 
    
         
            +
              MKMF_GNOME2_DIR = TOPDIR + '/glib/src/lib'
         
     | 
| 
      
 20 
     | 
    
         
            +
              SRCDIR = TOPDIR + '/poppler/src'
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              $LOAD_PATH.unshift MKMF_GNOME2_DIR
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              require 'mkmf-gnome2'
         
     | 
| 
      
 25 
     | 
    
         
            +
            end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            PKGConfig.have_package(PACKAGE_ID, 0, 8, 0) or exit 1
         
     | 
| 
      
 28 
     | 
    
         
            +
            setup_win32(PACKAGE_NAME)
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            check_cairo
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            if USE_GLIB_GEM
         
     | 
| 
      
 33 
     | 
    
         
            +
              path = File.expand_path(ENV['GEM_HOME'] + "/gems/glib2-#{GLib::BINDING_VERSION.join('.')}/src")
         
     | 
| 
      
 34 
     | 
    
         
            +
              add_depend_package("glib2", path, '/')
         
     | 
| 
      
 35 
     | 
    
         
            +
              path = File.expand_path(ENV['GEM_HOME'] + "/gems/gdkpixbuf-#{GLib::BINDING_VERSION.join('.')}/src")
         
     | 
| 
      
 36 
     | 
    
         
            +
              add_depend_package("gdk_pixbuf2", path, '/')
         
     | 
| 
      
 37 
     | 
    
         
            +
              path = File.expand_path(ENV['GEM_HOME'] + "/gems/gtk2-#{GLib::BINDING_VERSION.join('.')}/src")
         
     | 
| 
      
 38 
     | 
    
         
            +
              add_depend_package("gtk2", path, '/')
         
     | 
| 
      
 39 
     | 
    
         
            +
            else
         
     | 
| 
      
 40 
     | 
    
         
            +
              add_depend_package("glib2", "glib/src", TOPDIR)
         
     | 
| 
      
 41 
     | 
    
         
            +
              add_depend_package("gtk2", "gtk/src", TOPDIR)
         
     | 
| 
      
 42 
     | 
    
         
            +
              add_depend_package("gdk_pixbuf2", "gdkpixbuf", TOPDIR)
         
     | 
| 
      
 43 
     | 
    
         
            +
            end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
            make_version_header("POPPLER", PACKAGE_ID)
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            create_pkg_config_file("Ruby/Poppler", PACKAGE_ID)
         
     | 
| 
      
 48 
     | 
    
         
            +
            create_makefile_at_srcdir(PACKAGE_NAME, SRCDIR, "-DRUBY_POPPLER_COMPILATION")
         
     | 
| 
      
 49 
     | 
    
         
            +
            create_top_makefile
         
     | 
| 
         @@ -0,0 +1,32 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'poppler'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            input = ARGV.first
         
     | 
| 
      
 6 
     | 
    
         
            +
            output = input.sub(/\.pdf$/, "-numbered.pdf")
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            doc = Poppler::Document.new(input)
         
     | 
| 
      
 9 
     | 
    
         
            +
            first_page = doc[0]
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            Cairo::PDFSurface.new(output, *first_page.size) do |surface|
         
     | 
| 
      
 12 
     | 
    
         
            +
              context = Cairo::Context.new(surface)
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              doc.each_with_index do |page, i|
         
     | 
| 
      
 15 
     | 
    
         
            +
                width, height = page.size
         
     | 
| 
      
 16 
     | 
    
         
            +
                surface.set_size(width, height)
         
     | 
| 
      
 17 
     | 
    
         
            +
                context.save do
         
     | 
| 
      
 18 
     | 
    
         
            +
                  context.render_poppler_page(page)
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
                context.save do
         
     | 
| 
      
 21 
     | 
    
         
            +
                  layout = context.create_pango_layout
         
     | 
| 
      
 22 
     | 
    
         
            +
                  layout.text = i.to_s
         
     | 
| 
      
 23 
     | 
    
         
            +
                  layout.width = width * Pango::SCALE
         
     | 
| 
      
 24 
     | 
    
         
            +
                  layout.alignment = Pango::Layout::ALIGN_CENTER
         
     | 
| 
      
 25 
     | 
    
         
            +
                  layout.font_description = Pango::FontDescription.new("Sans 288")
         
     | 
| 
      
 26 
     | 
    
         
            +
                  context.move_to(0, (height - layout.pixel_size[1]) / 2.0)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  context.set_source_rgba(0.1, 0.1, 0.1, 0.5)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  context.show_pango_layout(layout)
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
                context.show_page
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
            end
         
     | 
    
        data/sample/pdf2.rb
    ADDED
    
    | 
         @@ -0,0 +1,107 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'tempfile'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "poppler"
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            if ARGV.size < 2
         
     | 
| 
      
 7 
     | 
    
         
            +
              puts "usage: #{$0} input.pdf output [scale_ratio] [rotate_angle]"
         
     | 
| 
      
 8 
     | 
    
         
            +
              exit(-1)
         
     | 
| 
      
 9 
     | 
    
         
            +
            end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            input, output, scale, rotate = ARGV
         
     | 
| 
      
 12 
     | 
    
         
            +
            scale = (scale || 1.0).to_f
         
     | 
| 
      
 13 
     | 
    
         
            +
            rotate = (rotate || 0).to_i % 360
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            ext_name = File.extname(output)[1..-1]
         
     | 
| 
      
 16 
     | 
    
         
            +
            if ext_name
         
     | 
| 
      
 17 
     | 
    
         
            +
              output_type = ext_name.downcase
         
     | 
| 
      
 18 
     | 
    
         
            +
              output_type = "jpeg" if /jpg/ =~ output_type
         
     | 
| 
      
 19 
     | 
    
         
            +
            else
         
     | 
| 
      
 20 
     | 
    
         
            +
              output_type = "png"
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            def compute_size(width, height, rotate)
         
     | 
| 
      
 24 
     | 
    
         
            +
              width = width.to_f
         
     | 
| 
      
 25 
     | 
    
         
            +
              height = height.to_f
         
     | 
| 
      
 26 
     | 
    
         
            +
              radius = 0
         
     | 
| 
      
 27 
     | 
    
         
            +
              unless rotate.zero?
         
     | 
| 
      
 28 
     | 
    
         
            +
                radius = rotate / 180.0 * Math::PI
         
     | 
| 
      
 29 
     | 
    
         
            +
                if (90 < rotate and rotate < 180) or
         
     | 
| 
      
 30 
     | 
    
         
            +
                    (270 < rotate and rotate < 360)
         
     | 
| 
      
 31 
     | 
    
         
            +
                  radius -= Math::PI / 2
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
              inner_angle1 = Math.atan(width / height)
         
     | 
| 
      
 35 
     | 
    
         
            +
              inner_angle2 = Math.atan(height / width)
         
     | 
| 
      
 36 
     | 
    
         
            +
              diagonal = Math.sqrt(width ** 2 + height ** 2)
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              angle1 = radius + inner_angle1
         
     | 
| 
      
 39 
     | 
    
         
            +
              angle2 = radius + inner_angle2
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
              bottom1 = diagonal * Math.cos(angle1)
         
     | 
| 
      
 42 
     | 
    
         
            +
              length1 = (bottom1 * Math.tan(angle1)).abs.to_i
         
     | 
| 
      
 43 
     | 
    
         
            +
              bottom2 = diagonal * Math.cos(angle2)
         
     | 
| 
      
 44 
     | 
    
         
            +
              length2 = (bottom2 * Math.tan(angle2)).abs.to_i
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              if (0 <= rotate and rotate <= 90) or
         
     | 
| 
      
 47 
     | 
    
         
            +
                  (180 <= rotate and rotate <= 270)
         
     | 
| 
      
 48 
     | 
    
         
            +
                [length1, length2]
         
     | 
| 
      
 49 
     | 
    
         
            +
              else
         
     | 
| 
      
 50 
     | 
    
         
            +
                [length2, length1]
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
            end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
            def to_pixbuf_with_cairo(input, scale, rotate)
         
     | 
| 
      
 55 
     | 
    
         
            +
              doc = Poppler::Document.new(input)
         
     | 
| 
      
 56 
     | 
    
         
            +
              page = doc[0]
         
     | 
| 
      
 57 
     | 
    
         
            +
              width, height = page.size.collect {|x| x * scale}
         
     | 
| 
      
 58 
     | 
    
         
            +
              surface_width, surface_height = compute_size(width, height, rotate)
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
              surface = Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32,
         
     | 
| 
      
 61 
     | 
    
         
            +
                                                surface_width, surface_height)
         
     | 
| 
      
 62 
     | 
    
         
            +
              cr = Cairo::Context.new(surface)
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
              half_width = surface_width / 2.0
         
     | 
| 
      
 65 
     | 
    
         
            +
              half_height = surface_height / 2.0
         
     | 
| 
      
 66 
     | 
    
         
            +
              cr.translate(half_width, half_height)
         
     | 
| 
      
 67 
     | 
    
         
            +
              cr.rotate(rotate / 180.0 * Math::PI)
         
     | 
| 
      
 68 
     | 
    
         
            +
              cr.translate(-half_width, -half_height)
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
              cr.translate((surface_width - width) / 2.0,
         
     | 
| 
      
 71 
     | 
    
         
            +
                           (surface_height - height) / 2.0)
         
     | 
| 
      
 72 
     | 
    
         
            +
              cr.set_source_rgb(1, 1, 1)
         
     | 
| 
      
 73 
     | 
    
         
            +
              cr.rectangle(0, 0, width, height)
         
     | 
| 
      
 74 
     | 
    
         
            +
              cr.fill
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
              cr.scale(scale, scale)
         
     | 
| 
      
 77 
     | 
    
         
            +
              cr.render_poppler_page(page)
         
     | 
| 
      
 78 
     | 
    
         
            +
              temp = Tempfile.new("pdf2")
         
     | 
| 
      
 79 
     | 
    
         
            +
              cr.target.write_to_png(temp.path)
         
     | 
| 
      
 80 
     | 
    
         
            +
              cr.target.finish
         
     | 
| 
      
 81 
     | 
    
         
            +
              Gdk::Pixbuf.new(temp.path)
         
     | 
| 
      
 82 
     | 
    
         
            +
            end
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
            def to_pixbuf(input, scale, rotate)
         
     | 
| 
      
 85 
     | 
    
         
            +
              doc = Poppler::Document.new(input)
         
     | 
| 
      
 86 
     | 
    
         
            +
              page = doc[0]
         
     | 
| 
      
 87 
     | 
    
         
            +
              width, height = page.size.collect {|x| x * scale}
         
     | 
| 
      
 88 
     | 
    
         
            +
              pixbuf_width, pixbuf_height = compute_size(width, height, rotate)
         
     | 
| 
      
 89 
     | 
    
         
            +
              pixbuf = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8,
         
     | 
| 
      
 90 
     | 
    
         
            +
                                       pixbuf_width, pixbuf_height)
         
     | 
| 
      
 91 
     | 
    
         
            +
              page.render(0, 0, width, height, scale, rotate, pixbuf)
         
     | 
| 
      
 92 
     | 
    
         
            +
              pixbuf
         
     | 
| 
      
 93 
     | 
    
         
            +
            end
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
            if Poppler.cairo_available?
         
     | 
| 
      
 96 
     | 
    
         
            +
              puts "using cairo..."
         
     | 
| 
      
 97 
     | 
    
         
            +
              pixbuf = to_pixbuf_with_cairo(input, scale, rotate)
         
     | 
| 
      
 98 
     | 
    
         
            +
            else
         
     | 
| 
      
 99 
     | 
    
         
            +
              pixbuf = to_pixbuf(input, scale, rotate)
         
     | 
| 
      
 100 
     | 
    
         
            +
            end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
            if pixbuf.nil?
         
     | 
| 
      
 103 
     | 
    
         
            +
              puts "Is it a PDF file?: #{input}"
         
     | 
| 
      
 104 
     | 
    
         
            +
              exit(-1)
         
     | 
| 
      
 105 
     | 
    
         
            +
            end
         
     | 
| 
      
 106 
     | 
    
         
            +
            puts "saving to #{output}(#{pixbuf.width}x#{pixbuf.height})..."
         
     | 
| 
      
 107 
     | 
    
         
            +
            pixbuf.save(output, output_type)
         
     | 
    
        data/sample/pdf2svg.rb
    ADDED
    
    | 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "poppler"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            if ARGV.size < 1
         
     | 
| 
      
 6 
     | 
    
         
            +
              puts "usage: #{$0} input.pdf"
         
     | 
| 
      
 7 
     | 
    
         
            +
              exit(-1)
         
     | 
| 
      
 8 
     | 
    
         
            +
            end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            input, = ARGV
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            output = input.sub(/\..+$/, ".svg")
         
     | 
| 
      
 13 
     | 
    
         
            +
            output = "#{output}.svg" if input == output
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            doc = Poppler::Document.new(input)
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            width, height = doc.pages[0].size
         
     | 
| 
      
 18 
     | 
    
         
            +
            Cairo::SVGSurface.new(output, width, height) do |surface|
         
     | 
| 
      
 19 
     | 
    
         
            +
              surface.restrict_to_version("1_2")
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
              context = Cairo::Context.new(surface)
         
     | 
| 
      
 22 
     | 
    
         
            +
              doc.each do |page|
         
     | 
| 
      
 23 
     | 
    
         
            +
                page.render(context)
         
     | 
| 
      
 24 
     | 
    
         
            +
                context.show_page
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
    
        data/sample/pdf2text.rb
    ADDED
    
    | 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "poppler"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            if ARGV.size < 1
         
     | 
| 
      
 6 
     | 
    
         
            +
              puts "usage: #{$0} input.pdf"
         
     | 
| 
      
 7 
     | 
    
         
            +
              exit(-1)
         
     | 
| 
      
 8 
     | 
    
         
            +
            end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            input = ARGV.shift
         
     | 
| 
      
 11 
     | 
    
         
            +
            input_uri = "file://#{File.expand_path(input)}"
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            doc = Poppler::Document.new(input_uri)
         
     | 
| 
      
 14 
     | 
    
         
            +
            doc.each do |page|
         
     | 
| 
      
 15 
     | 
    
         
            +
              puts page.get_text
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
    
        data/sample/pdfdiv.rb
    ADDED
    
    | 
         @@ -0,0 +1,36 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "poppler"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            if ARGV.size != 2
         
     | 
| 
      
 6 
     | 
    
         
            +
              puts "usage: #{$0} input.pdf output.pdf"
         
     | 
| 
      
 7 
     | 
    
         
            +
              exit(-1)
         
     | 
| 
      
 8 
     | 
    
         
            +
            end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            input, output = ARGV
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            doc = Poppler::Document.new(input)
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            width, height = doc.pages[0].size
         
     | 
| 
      
 15 
     | 
    
         
            +
            Cairo::PDFSurface.new(output, width / 2, height) do |surface|
         
     | 
| 
      
 16 
     | 
    
         
            +
              context = Cairo::Context.new(surface)
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              doc.each do |page|
         
     | 
| 
      
 19 
     | 
    
         
            +
                width, height = page.size
         
     | 
| 
      
 20 
     | 
    
         
            +
                half_width = width / 2
         
     | 
| 
      
 21 
     | 
    
         
            +
                context.save do
         
     | 
| 
      
 22 
     | 
    
         
            +
                  context.rectangle(0, 0, half_width, height)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  context.clip
         
     | 
| 
      
 24 
     | 
    
         
            +
                  page.render(context)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  context.show_page
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                context.save do
         
     | 
| 
      
 29 
     | 
    
         
            +
                  context.translate(-half_width, 0)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  context.rectangle(half_width, 0, half_width, height)
         
     | 
| 
      
 31 
     | 
    
         
            +
                  context.clip
         
     | 
| 
      
 32 
     | 
    
         
            +
                  page.render(context)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  context.show_page
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
            end
         
     | 
    
        data/src/lib/poppler.rb
    ADDED
    
    | 
         @@ -0,0 +1,108 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Copyright(C) 2006-2009 Ruby-GNOME2 Project.
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
      
 3 
     | 
    
         
            +
            # This library is free software: you can redistribute it and/or modify
         
     | 
| 
      
 4 
     | 
    
         
            +
            # it under the terms of the GNU Lesser General Public License as published by
         
     | 
| 
      
 5 
     | 
    
         
            +
            # the Free Software Foundation, either version 2.1 of the License.
         
     | 
| 
      
 6 
     | 
    
         
            +
            #
         
     | 
| 
      
 7 
     | 
    
         
            +
            # Foobar is distributed in the hope that it will be useful,
         
     | 
| 
      
 8 
     | 
    
         
            +
            # but WITHOUT ANY WARRANTY; without even the implied warranty of
         
     | 
| 
      
 9 
     | 
    
         
            +
            # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
         
     | 
| 
      
 10 
     | 
    
         
            +
            # GNU Lesser General Public License for more details.
         
     | 
| 
      
 11 
     | 
    
         
            +
            #
         
     | 
| 
      
 12 
     | 
    
         
            +
            # You should have received a copy of the GNU Lesser General Public License
         
     | 
| 
      
 13 
     | 
    
         
            +
            # along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            require "tempfile"
         
     | 
| 
      
 16 
     | 
    
         
            +
            require "date"
         
     | 
| 
      
 17 
     | 
    
         
            +
            require "glib2"
         
     | 
| 
      
 18 
     | 
    
         
            +
            require "gdk_pixbuf2"
         
     | 
| 
      
 19 
     | 
    
         
            +
            begin
         
     | 
| 
      
 20 
     | 
    
         
            +
              require "gtk2/base"
         
     | 
| 
      
 21 
     | 
    
         
            +
            rescue LoadError
         
     | 
| 
      
 22 
     | 
    
         
            +
            rescue
         
     | 
| 
      
 23 
     | 
    
         
            +
              if defined?(Gtk::InitError) and $!.class == Gtk::InitError
         
     | 
| 
      
 24 
     | 
    
         
            +
                # ignore
         
     | 
| 
      
 25 
     | 
    
         
            +
              else
         
     | 
| 
      
 26 
     | 
    
         
            +
                raise
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
      
 29 
     | 
    
         
            +
            begin
         
     | 
| 
      
 30 
     | 
    
         
            +
              require "cairo"
         
     | 
| 
      
 31 
     | 
    
         
            +
            rescue LoadError
         
     | 
| 
      
 32 
     | 
    
         
            +
            end
         
     | 
| 
      
 33 
     | 
    
         
            +
            require "poppler.so"
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            module Poppler
         
     | 
| 
      
 36 
     | 
    
         
            +
              LOG_DOMAIN = "Poppler"
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              VERSION = version.split(".").collect {|x| x.to_i}
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              class Document
         
     | 
| 
      
 41 
     | 
    
         
            +
                private
         
     | 
| 
      
 42 
     | 
    
         
            +
                def pdf_data?(data)
         
     | 
| 
      
 43 
     | 
    
         
            +
                  /\A%PDF-1\.\d/ =~ data
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                def ensure_uri(uri)
         
     | 
| 
      
 47 
     | 
    
         
            +
                  if pdf_data?(uri)
         
     | 
| 
      
 48 
     | 
    
         
            +
                    @pdf = Tempfile.new("ruby-poppler-pdf")
         
     | 
| 
      
 49 
     | 
    
         
            +
                    @pdf.binmode
         
     | 
| 
      
 50 
     | 
    
         
            +
                    @pdf.print(uri)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    @pdf.close
         
     | 
| 
      
 52 
     | 
    
         
            +
                    uri = @pdf.path
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  if GLib.path_is_absolute?(uri)
         
     | 
| 
      
 56 
     | 
    
         
            +
                    GLib.filename_to_uri(uri)
         
     | 
| 
      
 57 
     | 
    
         
            +
                  elsif /\A[a-zA-Z][a-zA-Z\d\-+.]*:/.match(uri)
         
     | 
| 
      
 58 
     | 
    
         
            +
                    uri
         
     | 
| 
      
 59 
     | 
    
         
            +
                  else
         
     | 
| 
      
 60 
     | 
    
         
            +
                    GLib.filename_to_uri(File.expand_path(uri))
         
     | 
| 
      
 61 
     | 
    
         
            +
                  end
         
     | 
| 
      
 62 
     | 
    
         
            +
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
              end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
              if defined?(TextField)
         
     | 
| 
      
 66 
     | 
    
         
            +
                class TextField
         
     | 
| 
      
 67 
     | 
    
         
            +
                  def multiline?
         
     | 
| 
      
 68 
     | 
    
         
            +
                    type == FormTextType::MULTILINE
         
     | 
| 
      
 69 
     | 
    
         
            +
                  end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                  def file_select?
         
     | 
| 
      
 72 
     | 
    
         
            +
                    type == FormTextType::FILE_SELECT
         
     | 
| 
      
 73 
     | 
    
         
            +
                  end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                  def normal?
         
     | 
| 
      
 76 
     | 
    
         
            +
                    type == FormTextType::NORMAL
         
     | 
| 
      
 77 
     | 
    
         
            +
                  end
         
     | 
| 
      
 78 
     | 
    
         
            +
                end
         
     | 
| 
      
 79 
     | 
    
         
            +
              end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
              if defined?(ChoiceField)
         
     | 
| 
      
 82 
     | 
    
         
            +
                class ChoiceField
         
     | 
| 
      
 83 
     | 
    
         
            +
                  def combo?
         
     | 
| 
      
 84 
     | 
    
         
            +
                    type == FormChioceType::COMBO
         
     | 
| 
      
 85 
     | 
    
         
            +
                  end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
                  def list?
         
     | 
| 
      
 88 
     | 
    
         
            +
                    type == FormChoiceType::LIST
         
     | 
| 
      
 89 
     | 
    
         
            +
                  end
         
     | 
| 
      
 90 
     | 
    
         
            +
                end
         
     | 
| 
      
 91 
     | 
    
         
            +
              end
         
     | 
| 
      
 92 
     | 
    
         
            +
            end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
            if Poppler.cairo_available?
         
     | 
| 
      
 95 
     | 
    
         
            +
              module Cairo
         
     | 
| 
      
 96 
     | 
    
         
            +
                class Context
         
     | 
| 
      
 97 
     | 
    
         
            +
                  def render_poppler_page(page, *args, &block)
         
     | 
| 
      
 98 
     | 
    
         
            +
                    page.render(self, *args, &block)
         
     | 
| 
      
 99 
     | 
    
         
            +
                  end
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
                  def render_poppler_page_selection(page, *args, &block)
         
     | 
| 
      
 102 
     | 
    
         
            +
                    page.render_selection(self, *args, &block)
         
     | 
| 
      
 103 
     | 
    
         
            +
                  end
         
     | 
| 
      
 104 
     | 
    
         
            +
                end
         
     | 
| 
      
 105 
     | 
    
         
            +
              end
         
     | 
| 
      
 106 
     | 
    
         
            +
            end
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
            GLib::Log.set_log_domain(Poppler::LOG_DOMAIN)
         
     | 
| 
         @@ -0,0 +1,222 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
         
     | 
| 
      
 2 
     | 
    
         
            +
            /**********************************************************************
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              rbpoppler-action.c -
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              Copyright (C) 2006-2008 Ruby-GNOME2 Project Team
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            **********************************************************************/
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            #include "rbpoppler-private.h"
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            #define RVAL2DEST(obj) ((PopplerDest *)RVAL2BOXED(obj, POPPLER_TYPE_DEST))
         
     | 
| 
      
 13 
     | 
    
         
            +
            #define DEST2RVAL(obj) (BOXED2RVAL(obj, POPPLER_TYPE_DEST))
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            #define DEST_TYPE2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_DEST_TYPE))
         
     | 
| 
      
 16 
     | 
    
         
            +
            #define ACTION_TYPE2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_ACTION_TYPE))
         
     | 
| 
      
 17 
     | 
    
         
            +
            #define RVAL2ACTION_TYPE(obj) (RVAL2GENUM(obj, POPPLER_TYPE_ACTION_TYPE))
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            /* PopplerAction */
         
     | 
| 
      
 21 
     | 
    
         
            +
            static VALUE actions[POPPLER_ACTION_MOVIE + 1];
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            VALUE
         
     | 
| 
      
 24 
     | 
    
         
            +
            rb_poppler_ruby_object_from_action(PopplerAction *action)
         
     | 
| 
      
 25 
     | 
    
         
            +
            {
         
     | 
| 
      
 26 
     | 
    
         
            +
                VALUE obj;
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                if (!action)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    return Qnil;
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                obj = BOXED2RVAL(action, POPPLER_TYPE_ACTION);
         
     | 
| 
      
 32 
     | 
    
         
            +
                RBASIC(obj)->klass = actions[action->type];
         
     | 
| 
      
 33 
     | 
    
         
            +
                return obj;
         
     | 
| 
      
 34 
     | 
    
         
            +
            }
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            PopplerAction *
         
     | 
| 
      
 37 
     | 
    
         
            +
            rb_poppler_action_from_ruby_object(VALUE action)
         
     | 
| 
      
 38 
     | 
    
         
            +
            {
         
     | 
| 
      
 39 
     | 
    
         
            +
                return NIL_P(action) ? NULL : RVAL2BOXED(action, POPPLER_TYPE_ACTION);
         
     | 
| 
      
 40 
     | 
    
         
            +
            }
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            #define ACTION_ATTR_STR(type, name)				\
         
     | 
| 
      
 43 
     | 
    
         
            +
            static VALUE							\
         
     | 
| 
      
 44 
     | 
    
         
            +
            action_ ## type ## _ ## name (VALUE self)			\
         
     | 
| 
      
 45 
     | 
    
         
            +
            {								\
         
     | 
| 
      
 46 
     | 
    
         
            +
                return CSTR2RVAL(RVAL2POPPLER_ACTION(self)->type.name);     \
         
     | 
| 
      
 47 
     | 
    
         
            +
            }
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
            #define ACTION_ATTR_DEST(type, name)				\
         
     | 
| 
      
 50 
     | 
    
         
            +
            static VALUE							\
         
     | 
| 
      
 51 
     | 
    
         
            +
            action_ ## type ## _ ## name (VALUE self)			\
         
     | 
| 
      
 52 
     | 
    
         
            +
            {								\
         
     | 
| 
      
 53 
     | 
    
         
            +
                return DEST2RVAL(RVAL2POPPLER_ACTION(self)->type.name);     \
         
     | 
| 
      
 54 
     | 
    
         
            +
            }
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            #define DEFINE_ACCESSOR(prefix, target, name) \
         
     | 
| 
      
 57 
     | 
    
         
            +
                rb_define_method(target, G_STRINGIFY(name), prefix ## _ ## name, 0);
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            #define DEFINE_ACTION_ACCESSOR(target, type, name) \
         
     | 
| 
      
 60 
     | 
    
         
            +
                DEFINE_ACCESSOR(action_ ## type, target, name)
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            /* PopplerActionAny */
         
     | 
| 
      
 63 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 64 
     | 
    
         
            +
            action_any_type(VALUE self)
         
     | 
| 
      
 65 
     | 
    
         
            +
            {
         
     | 
| 
      
 66 
     | 
    
         
            +
                return ACTION_TYPE2RVAL(RVAL2POPPLER_ACTION(self)->type);
         
     | 
| 
      
 67 
     | 
    
         
            +
            }
         
     | 
| 
      
 68 
     | 
    
         
            +
            ACTION_ATTR_STR(any, title);
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
            /* PopplerActionGotoDest */
         
     | 
| 
      
 71 
     | 
    
         
            +
            ACTION_ATTR_DEST(goto_dest, dest);
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            /* PopplerActionGotoRemote */
         
     | 
| 
      
 74 
     | 
    
         
            +
            ACTION_ATTR_STR(goto_remote, file_name);
         
     | 
| 
      
 75 
     | 
    
         
            +
            ACTION_ATTR_DEST(goto_remote, dest);
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
            /* PopplerActionLaunch */
         
     | 
| 
      
 78 
     | 
    
         
            +
            ACTION_ATTR_STR(launch, file_name);
         
     | 
| 
      
 79 
     | 
    
         
            +
            ACTION_ATTR_STR(launch, params);
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            /* PopplerActionUri */
         
     | 
| 
      
 82 
     | 
    
         
            +
            ACTION_ATTR_STR(uri, uri);
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
            /* PopplerActionNamed */
         
     | 
| 
      
 85 
     | 
    
         
            +
            ACTION_ATTR_STR(named, named_dest);
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
            /* PopplerActionMovie */
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
            /* PopplerDest */
         
     | 
| 
      
 91 
     | 
    
         
            +
            #ifdef RB_POPPLER_TYPE_DEST_NOT_DEFINED
         
     | 
| 
      
 92 
     | 
    
         
            +
            GType
         
     | 
| 
      
 93 
     | 
    
         
            +
            poppler_dest_get_type (void)
         
     | 
| 
      
 94 
     | 
    
         
            +
            {
         
     | 
| 
      
 95 
     | 
    
         
            +
              static GType our_type = 0;
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
              if (our_type == 0)
         
     | 
| 
      
 98 
     | 
    
         
            +
                our_type = g_boxed_type_register_static ("PopplerDest",
         
     | 
| 
      
 99 
     | 
    
         
            +
            					     (GBoxedCopyFunc) poppler_dest_copy,
         
     | 
| 
      
 100 
     | 
    
         
            +
            					     (GBoxedFreeFunc) poppler_dest_free);
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
              return our_type;
         
     | 
| 
      
 103 
     | 
    
         
            +
            }
         
     | 
| 
      
 104 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 107 
     | 
    
         
            +
            dest_get_type(VALUE self)
         
     | 
| 
      
 108 
     | 
    
         
            +
            {
         
     | 
| 
      
 109 
     | 
    
         
            +
                return DEST_TYPE2RVAL(RVAL2DEST(self)->type);
         
     | 
| 
      
 110 
     | 
    
         
            +
            }
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
            #define DEST_ATTR_INT(name)                     \
         
     | 
| 
      
 113 
     | 
    
         
            +
            static VALUE                                    \
         
     | 
| 
      
 114 
     | 
    
         
            +
            dest_ ## name (VALUE self)                      \
         
     | 
| 
      
 115 
     | 
    
         
            +
            {                                               \
         
     | 
| 
      
 116 
     | 
    
         
            +
                return INT2NUM(RVAL2DEST(self)->name);      \
         
     | 
| 
      
 117 
     | 
    
         
            +
            }
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
            #define DEST_ATTR_UINT(name)                    \
         
     | 
| 
      
 120 
     | 
    
         
            +
            static VALUE                                    \
         
     | 
| 
      
 121 
     | 
    
         
            +
            dest_ ## name (VALUE self)                      \
         
     | 
| 
      
 122 
     | 
    
         
            +
            {                                               \
         
     | 
| 
      
 123 
     | 
    
         
            +
                return UINT2NUM(RVAL2DEST(self)->name);     \
         
     | 
| 
      
 124 
     | 
    
         
            +
            }
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
            #define DEST_ATTR_DOUBLE(name)                  \
         
     | 
| 
      
 127 
     | 
    
         
            +
            static VALUE                                    \
         
     | 
| 
      
 128 
     | 
    
         
            +
            dest_ ## name (VALUE self)                      \
         
     | 
| 
      
 129 
     | 
    
         
            +
            {                                               \
         
     | 
| 
      
 130 
     | 
    
         
            +
                return rb_float_new(RVAL2DEST(self)->name); \
         
     | 
| 
      
 131 
     | 
    
         
            +
            }
         
     | 
| 
      
 132 
     | 
    
         
            +
             
     | 
| 
      
 133 
     | 
    
         
            +
            #define DEST_ATTR_STR(name)                     \
         
     | 
| 
      
 134 
     | 
    
         
            +
            static VALUE                                    \
         
     | 
| 
      
 135 
     | 
    
         
            +
            dest_ ## name (VALUE self)                      \
         
     | 
| 
      
 136 
     | 
    
         
            +
            {                                               \
         
     | 
| 
      
 137 
     | 
    
         
            +
                return CSTR2RVAL(RVAL2DEST(self)->name);    \
         
     | 
| 
      
 138 
     | 
    
         
            +
            }
         
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
      
 140 
     | 
    
         
            +
            #define DEFINE_DEST_ACCESSOR(target, name) \
         
     | 
| 
      
 141 
     | 
    
         
            +
                DEFINE_ACCESSOR(dest, target, name)
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
      
 144 
     | 
    
         
            +
            DEST_ATTR_INT(page_num)
         
     | 
| 
      
 145 
     | 
    
         
            +
            DEST_ATTR_DOUBLE(left)
         
     | 
| 
      
 146 
     | 
    
         
            +
            DEST_ATTR_DOUBLE(bottom)
         
     | 
| 
      
 147 
     | 
    
         
            +
            DEST_ATTR_DOUBLE(right)
         
     | 
| 
      
 148 
     | 
    
         
            +
            DEST_ATTR_DOUBLE(top)
         
     | 
| 
      
 149 
     | 
    
         
            +
            DEST_ATTR_DOUBLE(zoom)
         
     | 
| 
      
 150 
     | 
    
         
            +
            DEST_ATTR_STR(named_dest)
         
     | 
| 
      
 151 
     | 
    
         
            +
            DEST_ATTR_UINT(change_left)
         
     | 
| 
      
 152 
     | 
    
         
            +
            DEST_ATTR_UINT(change_top)
         
     | 
| 
      
 153 
     | 
    
         
            +
            DEST_ATTR_UINT(change_zoom)
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
            void
         
     | 
| 
      
 156 
     | 
    
         
            +
            Init_poppler_action(VALUE mPoppler)
         
     | 
| 
      
 157 
     | 
    
         
            +
            {
         
     | 
| 
      
 158 
     | 
    
         
            +
                VALUE cDest,  cAction, cActionAny, cActionGotoDest, cActionGotoRemote;
         
     | 
| 
      
 159 
     | 
    
         
            +
                VALUE cActionLaunch, cActionUri, cActionNamed, cActionMovie;
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
                cAction = G_DEF_CLASS(POPPLER_TYPE_ACTION, "Action", mPoppler);
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
      
 163 
     | 
    
         
            +
                cActionAny = rb_define_class_under(mPoppler, "ActionAny", cAction);
         
     | 
| 
      
 164 
     | 
    
         
            +
                rb_define_method(cActionAny, "type", action_any_type, 0);
         
     | 
| 
      
 165 
     | 
    
         
            +
                DEFINE_ACTION_ACCESSOR(cActionAny, any, title);
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
      
 167 
     | 
    
         
            +
                cActionGotoDest = rb_define_class_under(mPoppler, "ActionGotoDest",
         
     | 
| 
      
 168 
     | 
    
         
            +
                                                        cActionAny);
         
     | 
| 
      
 169 
     | 
    
         
            +
                DEFINE_ACTION_ACCESSOR(cActionGotoDest, goto_dest, dest);
         
     | 
| 
      
 170 
     | 
    
         
            +
             
     | 
| 
      
 171 
     | 
    
         
            +
                cActionGotoRemote = rb_define_class_under(mPoppler, "ActionGotoRemote",
         
     | 
| 
      
 172 
     | 
    
         
            +
                                                          cActionAny);
         
     | 
| 
      
 173 
     | 
    
         
            +
                DEFINE_ACTION_ACCESSOR(cActionGotoRemote, goto_remote, file_name);
         
     | 
| 
      
 174 
     | 
    
         
            +
                DEFINE_ACTION_ACCESSOR(cActionGotoRemote, goto_remote, dest);
         
     | 
| 
      
 175 
     | 
    
         
            +
             
     | 
| 
      
 176 
     | 
    
         
            +
                cActionLaunch = rb_define_class_under(mPoppler, "ActionLaunch", cActionAny);
         
     | 
| 
      
 177 
     | 
    
         
            +
                DEFINE_ACTION_ACCESSOR(cActionLaunch, launch, file_name);
         
     | 
| 
      
 178 
     | 
    
         
            +
                DEFINE_ACTION_ACCESSOR(cActionLaunch, launch, params);
         
     | 
| 
      
 179 
     | 
    
         
            +
             
     | 
| 
      
 180 
     | 
    
         
            +
                cActionUri = rb_define_class_under(mPoppler, "ActionUri", cActionAny);
         
     | 
| 
      
 181 
     | 
    
         
            +
                DEFINE_ACTION_ACCESSOR(cActionUri, uri, uri);
         
     | 
| 
      
 182 
     | 
    
         
            +
             
     | 
| 
      
 183 
     | 
    
         
            +
                cActionNamed = rb_define_class_under(mPoppler, "ActionNamed", cActionAny);
         
     | 
| 
      
 184 
     | 
    
         
            +
                DEFINE_ACTION_ACCESSOR(cActionNamed, named, named_dest);
         
     | 
| 
      
 185 
     | 
    
         
            +
             
     | 
| 
      
 186 
     | 
    
         
            +
                cActionMovie = rb_define_class_under(mPoppler, "ActionMovie", cActionAny);
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
      
 188 
     | 
    
         
            +
                actions[POPPLER_ACTION_UNKNOWN] = cActionAny;
         
     | 
| 
      
 189 
     | 
    
         
            +
                actions[POPPLER_ACTION_GOTO_DEST] = cActionGotoDest;
         
     | 
| 
      
 190 
     | 
    
         
            +
                actions[POPPLER_ACTION_GOTO_REMOTE] = cActionGotoRemote;
         
     | 
| 
      
 191 
     | 
    
         
            +
                actions[POPPLER_ACTION_LAUNCH] = cActionLaunch;
         
     | 
| 
      
 192 
     | 
    
         
            +
                actions[POPPLER_ACTION_URI] = cActionUri;
         
     | 
| 
      
 193 
     | 
    
         
            +
                actions[POPPLER_ACTION_NAMED] = cActionNamed;
         
     | 
| 
      
 194 
     | 
    
         
            +
                actions[POPPLER_ACTION_MOVIE] = cActionMovie;
         
     | 
| 
      
 195 
     | 
    
         
            +
             
     | 
| 
      
 196 
     | 
    
         
            +
                G_DEF_SETTERS(cAction);
         
     | 
| 
      
 197 
     | 
    
         
            +
                G_DEF_SETTERS(cActionAny);
         
     | 
| 
      
 198 
     | 
    
         
            +
                G_DEF_SETTERS(cActionGotoDest);
         
     | 
| 
      
 199 
     | 
    
         
            +
                G_DEF_SETTERS(cActionGotoRemote);
         
     | 
| 
      
 200 
     | 
    
         
            +
                G_DEF_SETTERS(cActionLaunch);
         
     | 
| 
      
 201 
     | 
    
         
            +
                G_DEF_SETTERS(cActionUri);
         
     | 
| 
      
 202 
     | 
    
         
            +
                G_DEF_SETTERS(cActionNamed);
         
     | 
| 
      
 203 
     | 
    
         
            +
                G_DEF_SETTERS(cActionMovie);
         
     | 
| 
      
 204 
     | 
    
         
            +
             
     | 
| 
      
 205 
     | 
    
         
            +
                G_DEF_CLASS(POPPLER_TYPE_ACTION_TYPE, "ActionType", mPoppler);
         
     | 
| 
      
 206 
     | 
    
         
            +
                G_DEF_CLASS(POPPLER_TYPE_DEST_TYPE, "DestType", mPoppler);
         
     | 
| 
      
 207 
     | 
    
         
            +
             
     | 
| 
      
 208 
     | 
    
         
            +
                cDest = G_DEF_CLASS(POPPLER_TYPE_DEST, "Dest", mPoppler);
         
     | 
| 
      
 209 
     | 
    
         
            +
             
     | 
| 
      
 210 
     | 
    
         
            +
                rb_define_method(cDest, "type", dest_get_type, 0);
         
     | 
| 
      
 211 
     | 
    
         
            +
                DEFINE_DEST_ACCESSOR(cDest, page_num);
         
     | 
| 
      
 212 
     | 
    
         
            +
                DEFINE_DEST_ACCESSOR(cDest, left);
         
     | 
| 
      
 213 
     | 
    
         
            +
                DEFINE_DEST_ACCESSOR(cDest, bottom);
         
     | 
| 
      
 214 
     | 
    
         
            +
                DEFINE_DEST_ACCESSOR(cDest, right);
         
     | 
| 
      
 215 
     | 
    
         
            +
                DEFINE_DEST_ACCESSOR(cDest, top);
         
     | 
| 
      
 216 
     | 
    
         
            +
                DEFINE_DEST_ACCESSOR(cDest, zoom);
         
     | 
| 
      
 217 
     | 
    
         
            +
                DEFINE_DEST_ACCESSOR(cDest, named_dest);
         
     | 
| 
      
 218 
     | 
    
         
            +
                DEFINE_DEST_ACCESSOR(cDest, change_left);
         
     | 
| 
      
 219 
     | 
    
         
            +
                DEFINE_DEST_ACCESSOR(cDest, change_top);
         
     | 
| 
      
 220 
     | 
    
         
            +
                DEFINE_DEST_ACCESSOR(cDest, change_zoom);
         
     | 
| 
      
 221 
     | 
    
         
            +
                G_DEF_SETTERS(cDest);
         
     | 
| 
      
 222 
     | 
    
         
            +
            }
         
     |