diff --git a/enterprise/app/jobs/captain/documents/pdf_extraction_job.rb b/enterprise/app/jobs/captain/documents/pdf_extraction_job.rb index fb013c400..1b9634612 100644 --- a/enterprise/app/jobs/captain/documents/pdf_extraction_job.rb +++ b/enterprise/app/jobs/captain/documents/pdf_extraction_job.rb @@ -1,6 +1,6 @@ class Captain::Documents::PdfExtractionJob < ApplicationJob - retry_on ActiveStorage::FileNotFoundError, attempts: 3, wait: 2.seconds, on: :perform - retry_on Faraday::BadRequestError, attempts: 3, wait: 2.seconds, on: :perform + retry_on ActiveStorage::FileNotFoundError, attempts: 3, wait: 2.seconds + retry_on Faraday::BadRequestError, attempts: 3, wait: 2.seconds queue_as :low diff --git a/enterprise/app/services/captain/tools/pdf_extraction_service.rb b/enterprise/app/services/captain/tools/pdf_extraction_service.rb index 33dabac97..291839274 100644 --- a/enterprise/app/services/captain/tools/pdf_extraction_service.rb +++ b/enterprise/app/services/captain/tools/pdf_extraction_service.rb @@ -41,10 +41,27 @@ class Captain::Tools::PdfExtractionService log_extraction_success(chunked_content) success_response(chunked_content) + rescue StandardError => e + Rails.logger.error "PDF extraction failed: #{e.message}" + failure_response([e.message]) end def log_extraction_success(chunked_content) total_chars = chunked_content.sum { |chunk| chunk[:content].length } Rails.logger.info "PDF extraction completed: #{chunked_content.length} chunks, #{total_chars} characters" end + + def success_response(content) + { + success: true, + content: content + } + end + + def failure_response(errors) + { + success: false, + errors: errors + } + end end \ No newline at end of file diff --git a/enterprise/app/services/captain/tools/pdf_extraction_service/source_handler.rb b/enterprise/app/services/captain/tools/pdf_extraction_service/source_handler.rb index ce1a26a5b..39f2ebd4d 100644 --- a/enterprise/app/services/captain/tools/pdf_extraction_service/source_handler.rb +++ b/enterprise/app/services/captain/tools/pdf_extraction_service/source_handler.rb @@ -27,9 +27,9 @@ module Captain::Tools::PdfExtractionService::SourceHandler temp_file = Down.download( pdf_source, - max_size: MAX_PDF_SIZE, - open_timeout: DOWNLOAD_TIMEOUT, - read_timeout: DOWNLOAD_TIMEOUT + max_size: self.class::MAX_PDF_SIZE, + open_timeout: self.class::DOWNLOAD_TIMEOUT, + read_timeout: self.class::DOWNLOAD_TIMEOUT ) begin diff --git a/enterprise/app/services/captain/tools/pdf_extraction_service/text_processor.rb b/enterprise/app/services/captain/tools/pdf_extraction_service/text_processor.rb index a0c84b715..709a1977b 100644 --- a/enterprise/app/services/captain/tools/pdf_extraction_service/text_processor.rb +++ b/enterprise/app/services/captain/tools/pdf_extraction_service/text_processor.rb @@ -12,6 +12,12 @@ module Captain::Tools::PdfExtractionService::TextProcessor end text_content + rescue PDF::Reader::MalformedPDFError => e + Rails.logger.error "Malformed PDF error: #{e.message}" + raise StandardError, 'Invalid or corrupted PDF file' + rescue StandardError => e + Rails.logger.error "PDF extraction error: #{e.message}" + raise StandardError, "Failed to extract text from PDF: #{e.message}" end def extract_page_content(page, index) diff --git a/spec/enterprise/services/captain/tools/pdf_extraction_service_spec.rb b/spec/enterprise/services/captain/tools/pdf_extraction_service_spec.rb index 5d6ad6264..0a483aeea 100644 --- a/spec/enterprise/services/captain/tools/pdf_extraction_service_spec.rb +++ b/spec/enterprise/services/captain/tools/pdf_extraction_service_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' RSpec.describe Captain::Tools::PdfExtractionService do let(:service) { described_class.new(pdf_source) } - let(:sample_pdf_path) { Rails.root.join('spec/fixtures/files/sample.pdf') } + let(:sample_pdf_path) { Rails.root.join('spec/fixtures/files/valid_test.pdf') } describe '#initialize' do context 'with valid PDF path' do @@ -69,12 +69,16 @@ RSpec.describe Captain::Tools::PdfExtractionService do end context 'with malformed PDF' do - let(:pdf_source) { Rails.root.join('spec/fixtures/files/sample.txt').to_s } + let(:pdf_source) { sample_pdf_path.to_s } it 'handles malformed PDF gracefully' do + # Mock PDF::Reader to raise a MalformedPDFError + allow(PDF::Reader).to receive(:open).and_raise(PDF::Reader::MalformedPDFError, 'PDF does not contain EOF marker') + result = service.perform expect(result[:success]).to be false expect(result[:errors]).to be_an(Array) + expect(result[:errors]).to include('Invalid or corrupted PDF file') end end