diff --git a/lib/templates/process_document.rb b/lib/templates/process_document.rb index 4b216dba..158142ec 100644 --- a/lib/templates/process_document.rb +++ b/lib/templates/process_document.rb @@ -103,7 +103,15 @@ module Templates promises = range.map do |page_number| - Concurrent::Promise.execute(executor: pool) { build_and_upload_blob(doc, page_number) } + doc_page = doc.get_page(page_number) + + bytes, width, height = doc_page.render_to_bitmap(width: MAX_WIDTH) + + image = Vips::Image.new_from_memory(bytes, width, height, 4, :uchar) + + Concurrent::Promise.execute(executor: pool) { build_and_upload_blob(image, page_number) } + ensure + doc_page&.close end Concurrent::Promise.zip(*promises).value!.each do |blob| @@ -122,39 +130,27 @@ module Templates pool&.kill end - def build_and_upload_blob(doc, page_number, format = FORMAT) - doc_page = doc.get_page(page_number) - - data, width, height = doc_page.render_to_bitmap(width: MAX_WIDTH) - - page = Vips::Image.new_from_memory(data, width, height, 4, :uchar) - - page = page.copy(interpretation: :srgb) + def build_and_upload_blob(image, page_number, format = FORMAT) + image = image.copy(interpretation: :srgb) data = if format == FORMAT - bitdepth = 2**page.stats.to_a[1..3].pluck(2).uniq.size + bitdepth = 2**image.stats.to_a[1..3].pluck(2).uniq.size - page.write_to_buffer(format, compression: 6, filter: 0, bitdepth:, - palette: true, Q: Q, dither: 0) + image.write_to_buffer(format, compression: 6, filter: 0, bitdepth:, + palette: true, Q: Q, dither: 0) else - page.write_to_buffer(format, interlace: true, Q: JPEG_Q) + image.write_to_buffer(format, interlace: true, Q: JPEG_Q) end blob = ActiveStorage::Blob.new( filename: "#{page_number}#{format}", - metadata: { analyzed: true, identified: true, width: page.width, height: page.height } + metadata: { analyzed: true, identified: true, width: image.width, height: image.height } ) blob.upload(StringIO.new(data)) blob - rescue Vips::Error, Pdfium::PdfiumError => e - Rollbar.warning(e) if defined?(Rollbar) - - nil - ensure - doc_page&.close end def maybe_flatten_form(data, pdf) @@ -199,7 +195,15 @@ module Templates def generate_pdf_preview_from_file(attachment, file_path, page_number) doc = Pdfium::Document.open_file(file_path) - blob = build_and_upload_blob(doc, page_number, PREVIEW_FORMAT) + doc_page = doc.get_page(page_number) + + bytes, width, height = doc_page.render_to_bitmap(width: MAX_WIDTH) + + doc_page.close + + image = Vips::Image.new_from_memory(bytes, width, height, 4, :uchar) + + blob = build_and_upload_blob(image, page_number, PREVIEW_FORMAT) ApplicationRecord.no_touching do ActiveStorage::Attachment.create!(