diff --git a/app/models/account_config.rb b/app/models/account_config.rb index 8d41bca4..2db37d70 100644 --- a/app/models/account_config.rb +++ b/app/models/account_config.rb @@ -43,6 +43,7 @@ class AccountConfig < ApplicationRecord DOWNLOAD_LINKS_EXPIRE_KEY = 'download_links_expire' FORCE_SSO_AUTH_KEY = 'force_sso_auth' FLATTEN_RESULT_PDF_KEY = 'flatten_result_pdf' + ROTATE_INCREMENTAL_PDF_KEY = 'rotate_incremental_pdf' WITH_SIGNATURE_ID = 'with_signature_id' WITH_FILE_LINKS_KEY = 'with_file_links' WITH_SIGNATURE_ID_REASON_KEY = 'with_signature_id_reason' diff --git a/lib/submissions/generate_preview_attachments.rb b/lib/submissions/generate_preview_attachments.rb index a5e22632..cbfa373d 100644 --- a/lib/submissions/generate_preview_attachments.rb +++ b/lib/submissions/generate_preview_attachments.rb @@ -16,18 +16,21 @@ module Submissions AccountConfig::WITH_SIGNATURE_ID, AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY, AccountConfig::WITH_TIMESTAMP_SECONDS_KEY, + AccountConfig::ROTATE_INCREMENTAL_PDF_KEY, AccountConfig::WITH_FILE_LINKS_KEY, AccountConfig::WITH_SIGNATURE_ID_REASON_KEY]) with_signature_id = configs.find { |c| c.key == AccountConfig::WITH_SIGNATURE_ID }&.value == true with_file_links = configs.find { |c| c.key == AccountConfig::WITH_FILE_LINKS_KEY }&.value == true is_flatten = configs.find { |c| c.key == AccountConfig::FLATTEN_RESULT_PDF_KEY }&.value != false + is_rotate_incremental = configs.find { |c| c.key == AccountConfig::ROTATE_INCREMENTAL_PDF_KEY }&.value == true with_submitter_timezone = configs.find { |c| c.key == AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY }&.value == true with_timestamp_seconds = configs.find { |c| c.key == AccountConfig::WITH_TIMESTAMP_SECONDS_KEY }&.value == true with_signature_id_reason = configs.find { |c| c.key == AccountConfig::WITH_SIGNATURE_ID_REASON_KEY }&.value != false - pdfs_index = GenerateResultAttachments.build_pdfs_index(submission, flatten: is_flatten) + pdfs_index = GenerateResultAttachments.build_pdfs_index(submission, flatten: is_flatten, + incremental: is_rotate_incremental) submitters = if submitter submission.submitters.where(id: submitter.id) diff --git a/lib/submissions/generate_result_attachments.rb b/lib/submissions/generate_result_attachments.rb index b538f6bc..55d77f20 100644 --- a/lib/submissions/generate_result_attachments.rb +++ b/lib/submissions/generate_result_attachments.rb @@ -141,18 +141,21 @@ module Submissions AccountConfig::WITH_SIGNATURE_ID, AccountConfig::WITH_FILE_LINKS_KEY, AccountConfig::WITH_TIMESTAMP_SECONDS_KEY, + AccountConfig::ROTATE_INCREMENTAL_PDF_KEY, AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY, AccountConfig::WITH_SIGNATURE_ID_REASON_KEY]) with_signature_id = configs.find { |c| c.key == AccountConfig::WITH_SIGNATURE_ID }&.value == true is_flatten = configs.find { |c| c.key == AccountConfig::FLATTEN_RESULT_PDF_KEY }&.value != false + is_rotate_incremental = configs.find { |c| c.key == AccountConfig::ROTATE_INCREMENTAL_PDF_KEY }&.value == true with_timestamp_seconds = configs.find { |c| c.key == AccountConfig::WITH_TIMESTAMP_SECONDS_KEY }&.value == true with_submitter_timezone = configs.find { |c| c.key == AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY }&.value == true with_file_links = configs.find { |c| c.key == AccountConfig::WITH_FILE_LINKS_KEY }&.value == true with_signature_id_reason = configs.find { |c| c.key == AccountConfig::WITH_SIGNATURE_ID_REASON_KEY }&.value != false - pdfs_index = build_pdfs_index(submitter.submission, submitter:, flatten: is_flatten) + pdfs_index = build_pdfs_index(submitter.submission, submitter:, flatten: is_flatten, + incremental: is_rotate_incremental) if with_signature_id || submitter.account.testing? pdfs_index.each_value do |pdf| @@ -802,7 +805,7 @@ module Submissions Digest::UUID.uuid_v5(Digest::UUID::OID_NAMESPACE, attachments.map(&:uuid).sort.join(':')) end - def build_pdfs_index(submission, submitter: nil, flatten: true) + def build_pdfs_index(submission, submitter: nil, flatten: true, incremental: false) latest_submitter = find_last_submitter(submission, submitter:) documents = Submissions::EnsureResultGenerated.call(latest_submitter) if latest_submitter @@ -826,7 +829,7 @@ module Submissions HexaPDF::Document.new(io: StringIO.new(attachment.download)) end - pdf = maybe_rotate_pdf(pdf) + pdf = maybe_rotate_pdf(pdf, incremental:) maybe_flatten_pdf(pdf) if flatten @@ -845,7 +848,7 @@ module Submissions Rollbar.error(e) if defined?(Rollbar) end - def maybe_rotate_pdf(pdf) + def maybe_rotate_pdf(pdf, incremental: false) return pdf if pdf.pages.size > MAX_PAGE_ROTATE is_pages_rotated = pdf.pages.root[:Rotate].present? && pdf.pages.root[:Rotate] != 0 @@ -860,7 +863,7 @@ module Submissions io = StringIO.new - pdf.write(io, incremental: false, validate: false) + pdf.write(io, incremental:, validate: false) HexaPDF::Document.new(io:) rescue StandardError => e