mirror of https://github.com/docusealco/docuseal
parent
c4daf8ed49
commit
52ef0ae929
@ -0,0 +1 @@
|
|||||||
|
<a href="<%= annot['value'] %>" rel="noopener noreferrer nofollow" target="_blank" class="flex absolute" style="width: <%= annot['w'] * 100 %>%; height: <%= annot['h'] * 100 %>%; left: <%= annot['x'] * 100 %>%; top: <%= annot['y'] * 100 %>%"></a>
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Templates
|
||||||
|
module BuildAnnotations
|
||||||
|
module_function
|
||||||
|
|
||||||
|
def call(data)
|
||||||
|
pdf = PDF::Reader.new(StringIO.new(data))
|
||||||
|
|
||||||
|
pdf.pages.flat_map.with_index do |page, index|
|
||||||
|
annotations = page.objects.deref!(page.attributes[:Annots]) || []
|
||||||
|
annotations.filter_map do |annot|
|
||||||
|
next if annot[:A].blank? || annot[:A][:URI].blank?
|
||||||
|
next unless annot[:Subtype] == :Link
|
||||||
|
next if !annot[:A][:URI].starts_with?('https://') && !annot[:A][:URI].starts_with?('http://')
|
||||||
|
|
||||||
|
build_external_link_hash(page, annot).merge('page' => index)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_external_link_hash(page, annot)
|
||||||
|
left, bottom, right, top = annot[:Rect]
|
||||||
|
|
||||||
|
{
|
||||||
|
'type' => 'external_link',
|
||||||
|
'value' => annot[:A][:URI],
|
||||||
|
'x' => left / page.width,
|
||||||
|
'y' => (page.height - top) / page.height,
|
||||||
|
'w' => (right - left) / page.width,
|
||||||
|
'h' => (top - bottom) / page.height
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Templates
|
||||||
|
module CreateAttachments
|
||||||
|
PDF_CONTENT_TYPE = 'application/pdf'
|
||||||
|
|
||||||
|
module_function
|
||||||
|
|
||||||
|
def call(template, params)
|
||||||
|
find_or_create_blobs(params).map do |blob|
|
||||||
|
document = template.documents.create!(blob:)
|
||||||
|
|
||||||
|
document_data = blob.download
|
||||||
|
|
||||||
|
if blob.content_type == PDF_CONTENT_TYPE && blob.metadata['pdf'].nil?
|
||||||
|
blob.metadata['pdf'] = { 'annotations' => Templates::BuildAnnotations.call(document_data) }
|
||||||
|
end
|
||||||
|
|
||||||
|
blob.save!
|
||||||
|
|
||||||
|
Templates::ProcessDocument.call(document, document_data)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_or_create_blobs(params)
|
||||||
|
blobs = params[:blobs]&.map do |attrs|
|
||||||
|
ActiveStorage::Blob.find_signed(attrs[:signed_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
blobs || params[:files].map do |file|
|
||||||
|
data = file.read
|
||||||
|
|
||||||
|
if file.content_type == PDF_CONTENT_TYPE
|
||||||
|
metadata = { 'identified' => true, 'analyzed' => true,
|
||||||
|
'pdf' => { 'annotations' => Templates::BuildAnnotations.call(data) } }
|
||||||
|
end
|
||||||
|
|
||||||
|
ActiveStorage::Blob.create_and_upload!(
|
||||||
|
io: StringIO.new(data),
|
||||||
|
filename: file.original_filename,
|
||||||
|
metadata:,
|
||||||
|
content_type: file.content_type
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in new issue