Module: PdfLibrary

Defined in:
lib/majorsilence_pdf/pdf_native.rb

Class Method Summary collapse

Class Method Details

.last_error_str(fns) ⇒ Object



144
145
146
147
148
149
# File 'lib/majorsilence_pdf/pdf_native.rb', line 144

def self.last_error_str(fns)
  ptr = fns[:pdf_last_error].call
  return 'unknown error' if ptr.nil? || ptr.zero?

  Fiddle::Pointer.new(ptr).to_s
end

.load(lib_path) ⇒ Object

Load the pdfnative shared library and initialize the engine. Returns a Hash of bound Fiddle::Function objects. Call this once per process before creating any PdfDocument instances.



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/majorsilence_pdf/pdf_native.rb', line 73

def self.load(lib_path)
  lib_path = File.expand_path(lib_path)
  lib_dir  = File.dirname(lib_path)

  ENV['PDFNATIVE_LIB_DIR'] = lib_dir

  # Pre-load all shared libraries in the directory with RTLD_GLOBAL so that
  # .NET 10+ runtime components are globally visible.
  ext = RUBY_PLATFORM =~ /darwin/ ? '*.dylib' : '*.so'
  Dir.glob(File.join(lib_dir, ext)).sort.each do |f|
    begin Fiddle.dlopen(f) rescue Fiddle::DLError; end
  end

  handle = Fiddle.dlopen(lib_path)

  fns = {
    pdf_init: Fiddle::Function.new(handle['pdf_init'], [], Fiddle::TYPE_INT),

    pdf_doc_create:       Fiddle::Function.new(handle['pdf_doc_create'],       [],                                                         Fiddle::TYPE_VOIDP),
    pdf_doc_set_title:    Fiddle::Function.new(handle['pdf_doc_set_title'],    [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP],                    Fiddle::TYPE_INT),
    pdf_doc_set_author:   Fiddle::Function.new(handle['pdf_doc_set_author'],   [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP],                    Fiddle::TYPE_INT),
    pdf_doc_set_subject:  Fiddle::Function.new(handle['pdf_doc_set_subject'],  [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP],                    Fiddle::TYPE_INT),
    pdf_doc_set_creator:  Fiddle::Function.new(handle['pdf_doc_set_creator'],  [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP],                    Fiddle::TYPE_INT),
    pdf_doc_set_security: Fiddle::Function.new(handle['pdf_doc_set_security'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT, Fiddle::TYPE_INT], Fiddle::TYPE_INT),
    pdf_doc_add_page:     Fiddle::Function.new(handle['pdf_doc_add_page'],     [Fiddle::TYPE_VOIDP, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT], Fiddle::TYPE_VOIDP),
    pdf_doc_save_file:    Fiddle::Function.new(handle['pdf_doc_save_file'],    [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP],                    Fiddle::TYPE_INT),
    pdf_doc_close:        Fiddle::Function.new(handle['pdf_doc_close'],        [Fiddle::TYPE_VOIDP],                                        Fiddle::TYPE_VOID),

    pdf_canvas_draw_text:    Fiddle::Function.new(handle['pdf_canvas_draw_text'],    [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT),
    pdf_canvas_draw_textbox: Fiddle::Function.new(handle['pdf_canvas_draw_textbox'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_VOIDP, Fiddle::TYPE_FLOAT], Fiddle::TYPE_INT),
    pdf_canvas_draw_line:    Fiddle::Function.new(handle['pdf_canvas_draw_line'],    [Fiddle::TYPE_VOIDP, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_FLOAT], Fiddle::TYPE_INT),
    pdf_canvas_draw_rect:    Fiddle::Function.new(handle['pdf_canvas_draw_rect'],    [Fiddle::TYPE_VOIDP, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_INT], Fiddle::TYPE_INT),
    pdf_canvas_draw_ellipse: Fiddle::Function.new(handle['pdf_canvas_draw_ellipse'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_INT], Fiddle::TYPE_INT),
    pdf_canvas_draw_table:   Fiddle::Function.new(handle['pdf_canvas_draw_table'],   [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT],                    Fiddle::TYPE_INT),
    pdf_canvas_add_link:     Fiddle::Function.new(handle['pdf_canvas_add_link'],     [Fiddle::TYPE_VOIDP, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_FLOAT, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT),
    pdf_canvas_close:        Fiddle::Function.new(handle['pdf_canvas_close'],        [Fiddle::TYPE_VOIDP],                                                                                Fiddle::TYPE_VOID),

    pdf_style_create:         Fiddle::Function.new(handle['pdf_style_create'],         [],                                              Fiddle::TYPE_VOIDP),
    pdf_style_set_font_family:Fiddle::Function.new(handle['pdf_style_set_font_family'],[Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP],         Fiddle::TYPE_INT),
    pdf_style_set_font_file:  Fiddle::Function.new(handle['pdf_style_set_font_file'],  [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP],         Fiddle::TYPE_INT),
    pdf_style_set_size:       Fiddle::Function.new(handle['pdf_style_set_size'],       [Fiddle::TYPE_VOIDP, Fiddle::TYPE_FLOAT],          Fiddle::TYPE_INT),
    pdf_style_set_color:      Fiddle::Function.new(handle['pdf_style_set_color'],      [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT], Fiddle::TYPE_INT),
    pdf_style_set_bold:       Fiddle::Function.new(handle['pdf_style_set_bold'],       [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT],            Fiddle::TYPE_INT),
    pdf_style_set_italic:     Fiddle::Function.new(handle['pdf_style_set_italic'],     [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT],            Fiddle::TYPE_INT),
    pdf_style_set_alignment:  Fiddle::Function.new(handle['pdf_style_set_alignment'],  [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT],            Fiddle::TYPE_INT),
    pdf_style_set_decoration: Fiddle::Function.new(handle['pdf_style_set_decoration'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT],            Fiddle::TYPE_INT),
    pdf_style_close:          Fiddle::Function.new(handle['pdf_style_close'],          [Fiddle::TYPE_VOIDP],                              Fiddle::TYPE_VOID),

    pdf_table_create:         Fiddle::Function.new(handle['pdf_table_create'],         [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT],            Fiddle::TYPE_VOIDP),
    pdf_table_set_header_bg:  Fiddle::Function.new(handle['pdf_table_set_header_bg'],  [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT], Fiddle::TYPE_INT),
    pdf_table_set_alternate_bg:Fiddle::Function.new(handle['pdf_table_set_alternate_bg'],[Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT], Fiddle::TYPE_INT),
    pdf_table_set_border:     Fiddle::Function.new(handle['pdf_table_set_border'],     [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_FLOAT], Fiddle::TYPE_INT),
    pdf_table_set_cell_padding:Fiddle::Function.new(handle['pdf_table_set_cell_padding'],[Fiddle::TYPE_VOIDP, Fiddle::TYPE_FLOAT],         Fiddle::TYPE_INT),
    pdf_table_stage_cell:     Fiddle::Function.new(handle['pdf_table_stage_cell'],     [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP],          Fiddle::TYPE_INT),
    pdf_table_commit_row:     Fiddle::Function.new(handle['pdf_table_commit_row'],     [Fiddle::TYPE_VOIDP],                              Fiddle::TYPE_INT),
    pdf_table_close:          Fiddle::Function.new(handle['pdf_table_close'],          [Fiddle::TYPE_VOIDP],                              Fiddle::TYPE_VOID),

    pdf_merge_create:    Fiddle::Function.new(handle['pdf_merge_create'],    [],                                               Fiddle::TYPE_VOIDP),
    pdf_merge_add_bytes: Fiddle::Function.new(handle['pdf_merge_add_bytes'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT], Fiddle::TYPE_INT),
    pdf_merge_save_file: Fiddle::Function.new(handle['pdf_merge_save_file'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP],          Fiddle::TYPE_INT),
    pdf_merge_close:     Fiddle::Function.new(handle['pdf_merge_close'],     [Fiddle::TYPE_VOIDP],                              Fiddle::TYPE_VOID),

    pdf_last_error: Fiddle::Function.new(handle['pdf_last_error'], [], Fiddle::TYPE_VOIDP),
  }

  ret = fns[:pdf_init].call
  raise "pdf_init failed: #{last_error_str(fns)}" unless ret.zero?

  fns
end