Class: PdfMerger

Inherits:
Object
  • Object
show all
Defined in:
lib/majorsilence_pdf/pdf_native.rb

Overview

Merges multiple PDF documents into one. Call close when done.

Usage:

merger = PdfMerger.new(fns)
merger.add_bytes(File.binread('a.pdf'))
merger.add_bytes(File.binread('b.pdf'))
merger.save('/tmp/merged.pdf')
merger.close

Instance Method Summary collapse

Constructor Details

#initialize(fns) ⇒ PdfMerger

Returns a new instance of PdfMerger.



421
422
423
424
425
426
427
# File 'lib/majorsilence_pdf/pdf_native.rb', line 421

def initialize(fns)
  @fns = fns
  h = fns[:pdf_merge_create].call
  raise "pdf_merge_create failed: #{PdfLibrary.last_error_str(fns)}" if h.nil? || h.zero?

  @handle = h
end

Instance Method Details

#add_bytes(data) ⇒ Object

Add PDF bytes to the merge queue.



430
431
432
433
434
435
436
# File 'lib/majorsilence_pdf/pdf_native.rb', line 430

def add_bytes(data)
  ptr = Fiddle::Pointer[data]
  ret = @fns[:pdf_merge_add_bytes].call(@handle, ptr, data.bytesize)
  raise "pdf_merge_add_bytes failed: #{PdfLibrary.last_error_str(@fns)}" unless ret.zero?

  self
end

#closeObject



456
457
458
459
460
461
# File 'lib/majorsilence_pdf/pdf_native.rb', line 456

def close
  return unless @handle

  @fns[:pdf_merge_close].call(@handle)
  @handle = nil
end

#save(path) ⇒ Object



438
439
440
441
# File 'lib/majorsilence_pdf/pdf_native.rb', line 438

def save(path)
  ret = @fns[:pdf_merge_save_file].call(@handle, c_str(path))
  raise "pdf_merge_save_file failed: #{PdfLibrary.last_error_str(@fns)}" unless ret.zero?
end

#save_to_memoryObject

Merge and return PDF bytes.



444
445
446
447
448
449
450
451
452
453
454
# File 'lib/majorsilence_pdf/pdf_native.rb', line 444

def save_to_memory
  tmp = Tempfile.new(['pdfnative', '.pdf'], binmode: true)
  tmp_path = tmp.path
  tmp.close
  begin
    save(tmp_path)
    File.binread(tmp_path)
  ensure
    File.delete(tmp_path) if File.exist?(tmp_path)
  end
end