class HexaPDF::CLI::Optimize

Optimizes the size of a PDF file.

def execute(in_file, out_file) #:nodoc:

:nodoc:
def execute(in_file, out_file) #:nodoc:
  maybe_raise_on_existing_file(out_file)
  with_document(in_file, password: @password, out_file: out_file) do |doc|
    optimize_page_tree(doc)
    apply_optimization_options(doc)
  end
end

def initialize #:nodoc:

:nodoc:
def initialize #:nodoc:
  super('optimize', takes_commands: false)
  short_desc("Optimize the size of a PDF file")
  long_desc(<<~EOF)
    This command uses several optimization strategies to reduce the file size of the PDF file.
    By default, all strategies except page compression are used since page compression may
    take a very long time without much benefit.
  EOF
  @password = nil
  @out_options.compact = true
  @out_options.xref_streams = :generate
  @out_options.object_streams = :generate
  @out_options.streams = :compress
  @out_options.optimize_fonts = true
  options.on("--password PASSWORD", "-p", String,
             "The password for decryption. Use - for reading from standard input.") do |pwd|
    @password = (pwd == '-' ? read_password : pwd)
  end
  options.separator("")
  options.separator("Optimization options")
  define_optimization_options
end

def optimize_page_tree(doc)

Optimizes the page tree by flattening it and deleting unsed objects.
def optimize_page_tree(doc)
  page_tree = doc.add({Type: :Pages})
  retained = {page_tree.data => true}
  doc.pages.each do |page|
    page.value.update(page.copy_inherited_values)
    page_tree.add_page(page)
    retained[page.data] = true
  end
  doc.catalog[:Pages] = page_tree
  doc.each do |obj, revision|
    next unless obj.kind_of?(HexaPDF::Dictionary)
    if (obj.type == :Pages || obj.type == :Page) && !retained.key?(obj.data)
      revision.delete(obj)
    end
  end
end