From b3bd808a3fb5d676764d48cb3dee48f3b149d79a Mon Sep 17 00:00:00 2001 From: Bernardo Anderson Date: Wed, 16 Sep 2026 16:32:17 -0500 Subject: [PATCH 1/5] CP-11621 - Render opaque white behind signed signature --- app/javascript/submission_form/area.vue | 2 +- app/views/submissions/_value.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/submission_form/area.vue b/app/javascript/submission_form/area.vue index 5aed2a7afb..878ede0c28 100644 --- a/app/javascript/submission_form/area.vue +++ b/app/javascript/submission_form/area.vue @@ -61,7 +61,7 @@
<% is_narrow = area['h']&.positive? && (area['w'].to_f / area['h']) > 6 %>
-
+
<% if (local_assigns[:with_signature_id] || field.dig('preferences', 'reason_field_uuid').present?) && attachment = attachments_index[value] %> From 116517344da72d30c350429c296d6800600ab907 Mon Sep 17 00:00:00 2001 From: Bernardo Anderson Date: Wed, 16 Sep 2026 16:32:27 -0500 Subject: [PATCH 2/5] CP-11621 - Add failing spec for opaque signature PDF background --- .../generate_result_attachments_spec.rb | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/spec/lib/submissions/generate_result_attachments_spec.rb b/spec/lib/submissions/generate_result_attachments_spec.rb index 2ca5205d03..a318fbab04 100644 --- a/spec/lib/submissions/generate_result_attachments_spec.rb +++ b/spec/lib/submissions/generate_result_attachments_spec.rb @@ -325,4 +325,51 @@ def assign_checkbox(value) end end end + + describe '.fill_submitter_fields opaque signature background' do + let(:field_uuid) { SecureRandom.uuid } + + def page_raw_content + page = pdfs_index[attachment_uuid].pages[0] + content = page.contents + content = content.data if content.respond_to?(:data) + content.to_s + end + + def page_draws_white_fill_rectangle? + content = page_raw_content + + white_fill = content.match?(/1(\.0+)?\s+g\b|1(\.0+)?\s+1(\.0+)?\s+1(\.0+)?\s+rg\b/) + + white_fill && content.match?(/\bre\b/) && content.match?(/\bf\b/) + end + + def assign_signature_with_opaque_background + blob = ActiveStorage::Blob.create_and_upload!( + io: File.open(Rails.root.join('spec/fixtures/sample-image.png')), + filename: 'signature.png', + content_type: 'image/png' + ) + submitter.attachments.attach(blob) + + assign_fields( + [{ + 'uuid' => field_uuid, + 'submitter_uuid' => submitter.uuid, + 'type' => 'signature', + 'preferences' => { 'opaque_background' => true }, + 'areas' => [base_area] + }], + { field_uuid => submitter.attachments.first.uuid } + ) + end + + it 'draws a white fill rectangle under the signature image' do + assign_signature_with_opaque_background + fill + + expect(image_xobject_count).to eq(1) + expect(page_draws_white_fill_rectangle?).to be(true) + end + end end From 740f19ae506737f76e9256e82ca85e3574c1da17 Mon Sep 17 00:00:00 2001 From: Bernardo Anderson Date: Wed, 16 Sep 2026 16:32:50 -0500 Subject: [PATCH 3/5] CP-11621 - Add opaque background toggle to signature field settings --- app/javascript/template_builder/field_settings.vue | 14 ++++++++++++++ app/javascript/template_builder/i18n.js | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/app/javascript/template_builder/field_settings.vue b/app/javascript/template_builder/field_settings.vue index 50f9477d7d..df3dff1b87 100644 --- a/app/javascript/template_builder/field_settings.vue +++ b/app/javascript/template_builder/field_settings.vue @@ -318,6 +318,20 @@ {{ t('with_logo') }} +
  • + +
  • Date: Wed, 16 Sep 2026 16:35:21 -0500 Subject: [PATCH 4/5] CP-11621 - Fill opaque white behind signature in result PDF --- .../generate_result_attachments.rb | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lib/submissions/generate_result_attachments.rb b/lib/submissions/generate_result_attachments.rb index 88d44f1f40..108d6d8d35 100644 --- a/lib/submissions/generate_result_attachments.rb +++ b/lib/submissions/generate_result_attachments.rb @@ -305,6 +305,10 @@ def fill_submitter_fields(submitter, account, pdfs_index, with_signature_id:, is io = StringIO.new(image.resize([scale * 4, 1].select(&:positive?).min).write_to_buffer('.png')) + if field['type'] == 'signature' && field.dig('preferences', 'opaque_background') + canvas.fill_color('white').rectangle(image_x, image_y, image_width, image_height).fill + end + canvas.image(io, at: [image_x, image_y], width: image_width, height: image_height) id_string = "ID: #{attachment.uuid}".upcase @@ -369,6 +373,14 @@ def fill_submitter_fields(submitter, account, pdfs_index, with_signature_id:, is height - (area['y'] * height) - TEXT_TOP_MARGIN - result.lines.sum(&:height) - image_height) + if field.dig('preferences', 'opaque_background') + image_x = (area['x'] * width) + (area['w'] * width / 2) - ((image.width * scale) / 2) + image_y = height - (area['y'] * height) - (image.height * scale / 2) - (image_height / 2) + + canvas.fill_color('white').rectangle(image_x, image_y, image.width * scale, + image.height * scale).fill + end + canvas.image( io, at: [ @@ -397,6 +409,14 @@ def fill_submitter_fields(submitter, account, pdfs_index, with_signature_id:, is io = StringIO.new(image.resize([scale * 4, 1].select(&:positive?).min).write_to_buffer('.png')) + if field['type'] == 'signature' && field.dig('preferences', 'opaque_background') + image_x = (area['x'] * width) + (area['w'] * width / 2) - ((image.width * scale) / 2) + image_y = height - (area['y'] * height) - (image.height * scale / 2) - (area['h'] * height / 2) + + canvas.fill_color('white').rectangle(image_x, image_y, image.width * scale, + image.height * scale).fill + end + canvas.image( io, at: [ From 98ddd83aceeadf53098b41be125878812ade2226 Mon Sep 17 00:00:00 2001 From: Bernardo Anderson Date: Wed, 16 Sep 2026 16:47:05 -0500 Subject: [PATCH 5/5] CP-11621 - Fix rubocop pathname offense in PDF spec --- spec/lib/submissions/generate_result_attachments_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/lib/submissions/generate_result_attachments_spec.rb b/spec/lib/submissions/generate_result_attachments_spec.rb index a318fbab04..46f3dfd614 100644 --- a/spec/lib/submissions/generate_result_attachments_spec.rb +++ b/spec/lib/submissions/generate_result_attachments_spec.rb @@ -346,7 +346,7 @@ def page_draws_white_fill_rectangle? def assign_signature_with_opaque_background blob = ActiveStorage::Blob.create_and_upload!( - io: File.open(Rails.root.join('spec/fixtures/sample-image.png')), + io: Rails.root.join('spec/fixtures/sample-image.png').open, filename: 'signature.png', content_type: 'image/png' )