# frozen_string_literal: true module PdfUtils DEFAULT_DPI = 72 US_LETTER_W = DEFAULT_DPI * 8.5 module_function def encrypted?(data, password: nil) HexaPDF::Document.new(io: StringIO.new(data), decryption_opts: { password: }) false rescue HexaPDF::EncryptionError true end def decrypt(data, password) encrypted_doc = HexaPDF::Document.new(io: StringIO.new(data), decryption_opts: { password: }) decrypted_doc = HexaPDF::Document.new encrypted_doc.pages.each do |page| decrypted_doc.pages << decrypted_doc.import(page) end decrypted_io = StringIO.new decrypted_doc.write(decrypted_io, validate: false) decrypted_io.tap(&:rewind).read end def merge(files) merged_pdf = HexaPDF::Document.new files.each do |file| pdf = HexaPDF::Document.new(io: file) pdf.pages.each { |page| merged_pdf.pages << merged_pdf.import(page) } end merged_content = StringIO.new merged_pdf.validate(auto_correct: true) merged_pdf.write(merged_content, validate: false) merged_content.rewind merged_content end end