diff --git a/lib/pdf_utils.rb b/lib/pdf_utils.rb index 083ec47d..938f4e4d 100644 --- a/lib/pdf_utils.rb +++ b/lib/pdf_utils.rb @@ -15,17 +15,11 @@ module PdfUtils 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) + Pdfium::Document.open_bytes(data, password) do |doc| + doc.save(decrypted_io, flags: Pdfium::FPDF_REMOVE_SECURITY) + end decrypted_io.tap(&:rewind).read end diff --git a/lib/pdfium.rb b/lib/pdfium.rb index d7fad6ef..736e01b8 100644 --- a/lib/pdfium.rb +++ b/lib/pdfium.rb @@ -444,6 +444,7 @@ class Pdfium }.freeze class PdfiumError < StandardError; end + class PasswordError < PdfiumError; end def self.error_message(code) PDFIUM_ERRORS[code] || "Unknown error code: #{code}" @@ -512,7 +513,9 @@ class Pdfium return if error_code == FPDF_ERR_SUCCESS - raise PdfiumError, "#{context_message}: #{error_message(error_code)} (Code: #{error_code})" + error_class = error_code == FPDF_ERR_PASSWORD ? PasswordError : PdfiumError + + raise error_class, "#{context_message}: #{error_message(error_code)} (Code: #{error_code})" end # rubocop:disable Metrics