Class: HexaPDF::CLI::Watermark

Inherits:
Command
  • Object
show all
Defined in:
lib/hexapdf/cli/watermark.rb

Overview

Uses one or more pages of one PDF and underlays/overlays it/them onto another.

Instance Method Summary collapse

Methods included from Command::Extensions

#help, #help_banner

Constructor Details

#initializeWatermark

:nodoc:



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/hexapdf/cli/watermark.rb', line 45

def initialize #:nodoc:
  super('watermark', takes_commands: false)
  short_desc("Put one or more PDF pages onto another PDF")
  long_desc(<<~EOF)
    This command uses one ore more pages from a PDF file and applies them as background or
    stamp on another PDF file.

    If multiple pages are selected from the watermark PDF, the --repeat option can be used to
    specify how they should be applied: 'last' (the default) will only repeat the last
    watermark page whereas 'all' will cyclically repeat all watermark pages.
  EOF

  options.on("-w", "--watermark-file FILE", "The PDF used as watermark") do |watermark_file|
    @watermark_file = watermark_file
  end
  options.on("-i", "--pages PAGES", "The pages of the watermark file that should be used " \
             "(default: 1)") do |pages|
    @pages = pages
  end
  options.on("-r", "--repeat REPEAT_MODE", [:last, :all],
             "Specifies how the watermark pages should be repeated. Either last or " \
               "all (default: last)") do |repeat|
    @repeat = repeat
  end
  options.on("-t", "--type WATERMARK_TYPE", [:background, :stamp],
             "Specifies how the watermark is applied: background applies it below the page " \
               "contents and stamp applies it above. Default: background") do |type|
    @type = (type == :background ? :underlay : :overlay)
  end
  options.on("--password PASSWORD", "-p", String,
             "The password for decrypting the input PDF. Use - for reading from " \
               "standard input.") do |pwd|
    @password = (pwd == '-' ? read_password : pwd)
  end
  define_optimization_options
  define_encryption_options

  @watermark_file = nil
  @pages = "1"
  @repeat = :last
  @type = :underlay
  @password = nil
end

Instance Method Details

#execute(in_file, out_file) ⇒ Object

:nodoc:



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/hexapdf/cli/watermark.rb', line 89

def execute(in_file, out_file) #:nodoc:
  maybe_raise_on_existing_file(out_file)
  watermark = HexaPDF::Document.open(@watermark_file)
  indices = page_index_generator(watermark)
  xobject_map = {}
  with_document(in_file, password: @password, out_file: out_file) do |doc|
    doc.pages.each do |page|
      index = indices.next
      xobject = xobject_map[index] ||= doc.import(watermark.pages[index].to_form_xobject)
      pw = page.box.width.to_f
      ph = page.box.height.to_f
      xw = xobject.width.to_f
      xh = xobject.height.to_f
      canvas = page.canvas(type: @type)
      ratio = [pw / xw, ph / xh].min
      xw, xh = xw * ratio, xh * ratio
      x, y = (pw - xw) / 2, (ph - xh) / 2
      canvas.xobject(xobject, at: [x, y], width: xw, height: xh)
    end
  end
end