Files
docuseal/lib/submissions/generate_combined_attachment.rb
T

88 lines
2.5 KiB
Ruby
Raw Normal View History

2024-05-25 20:57:36 +03:00
# frozen_string_literal: true
module Submissions
module GenerateCombinedAttachment
module_function
def call(submitter)
pdf = build_combined_pdf(submitter)
submission = submitter.submission
account = submission.account
pkcs = Accounts.load_signing_pkcs(account)
tsa_url = Accounts.load_timeserver_url(account)
io = StringIO.new
pdf.trailer.info[:Creator] = "#{Docuseal.product_name} (#{Docuseal::PRODUCT_URL})"
2025-07-10 12:13:27 +03:00
if Docuseal.pdf_format == 'pdf/a-3b'
pdf.task(:pdfa, level: '3b')
pdf.config['font.map'] = GenerateResultAttachments::PDFA_FONT_MAP
end
2024-12-17 23:25:04 +02:00
if pkcs
sign_params = {
reason: Submissions::GenerateResultAttachments.single_sign_reason(submitter),
**Submissions::GenerateResultAttachments.build_signing_params(submitter, pkcs, tsa_url)
}
2025-03-13 14:21:53 +02:00
sign_pdf(io, pdf, sign_params)
2025-04-22 15:52:03 +03:00
Submissions::GenerateResultAttachments.maybe_enable_ltv(io, sign_params)
2024-12-17 23:25:04 +02:00
else
2025-03-13 14:21:53 +02:00
pdf.write(io, incremental: true, validate: true)
2024-12-17 23:25:04 +02:00
end
2024-05-25 20:57:36 +03:00
ActiveStorage::Attachment.create!(
blob: ActiveStorage::Blob.create_and_upload!(
2025-05-31 15:15:25 +03:00
io: io.tap(&:rewind), filename: "#{submission.name || submission.template.name}.pdf"
2024-05-25 20:57:36 +03:00
),
name: 'combined_document',
record: submission
)
end
2025-03-13 14:21:53 +02:00
def sign_pdf(io, pdf, sign_params)
pdf.sign(io, **sign_params)
2025-09-18 08:30:58 +03:00
rescue HexaPDF::MalformedPDFError, NoMethodError => e
2025-03-13 14:21:53 +02:00
Rollbar.error(e) if defined?(Rollbar)
pdf.sign(io, write_options: { incremental: false }, **sign_params)
rescue HexaPDF::Error => e
Rollbar.error(e) if defined?(Rollbar)
pdf.validate(auto_correct: true)
pdf.sign(io, write_options: { validate: false }, **sign_params)
end
2024-05-25 20:57:36 +03:00
def build_combined_pdf(submitter)
pdfs_index = Submissions::GenerateResultAttachments.generate_pdfs(submitter)
2024-10-01 13:44:57 +03:00
audit_trail = I18n.with_locale(submitter.account.locale) do
Submissions::GenerateAuditTrail.build_audit_trail(submitter.submission)
end
2024-05-25 20:57:36 +03:00
audit_trail.dispatch_message(:complete_objects)
result = HexaPDF::Document.new
submitter.submission.template_schema.each do |item|
pdf = pdfs_index[item['attachment_uuid']]
2024-12-07 01:35:59 +02:00
next unless pdf
2024-05-25 20:57:36 +03:00
pdf.dispatch_message(:complete_objects)
pdf.pages.each { |page| result.pages << result.import(page) }
end
audit_trail.pages.each { |page| result.pages << result.import(page) }
result
end
end
end