From ab49af9bcb064b3aa5d93c7b0d47db025524d384 Mon Sep 17 00:00:00 2001 From: Alex Turchyn Date: Wed, 10 Jul 2024 01:42:10 +0300 Subject: [PATCH] add tool to merge pdf files --- app/controllers/api/tools_controller.rb | 18 ++++++++++++++++++ config/routes.rb | 3 +++ lib/pdf_utils.rb | 15 +++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 app/controllers/api/tools_controller.rb diff --git a/app/controllers/api/tools_controller.rb b/app/controllers/api/tools_controller.rb new file mode 100644 index 00000000..9eaa1486 --- /dev/null +++ b/app/controllers/api/tools_controller.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Api + class ToolsController < ApiBaseController + skip_authorization_check + + def merge + files = params[:files] || [] + + return render json: { error: 'Files are required' }, status: :unprocessable_entity if files.blank? + return render json: { error: 'At least 2 files are required' }, status: :unprocessable_entity if files.size < 2 + + render json: { + data: Base64.encode64(PdfUtils.merge(files.map { |base64| StringIO.new(Base64.decode64(base64)) }).string) + } + end + end +end diff --git a/config/routes.rb b/config/routes.rb index fdd24e9d..a91dd94b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -41,6 +41,9 @@ Rails.application.routes.draw do resources :clone, only: %i[create], controller: 'templates_clone' resources :submissions, only: %i[index create] end + resources :tools, only: %i[] do + post :merge, on: :collection + end end resources :verify_pdf_signature, only: %i[create] diff --git a/lib/pdf_utils.rb b/lib/pdf_utils.rb index 7cfaa487..e4c22400 100644 --- a/lib/pdf_utils.rb +++ b/lib/pdf_utils.rb @@ -26,4 +26,19 @@ module PdfUtils decrypted_io.tap(&:rewind).read end + + def merge(files) + merged_pdf = HexaPDF::Document.new + + files.each do |file| + pdf = HexaPDF::Document.new(io: file) + pdf.pages.each { |page| merged_pdf.pages << merged_pdf.import(page) } + end + + merged_content = StringIO.new + merged_pdf.write(merged_content) + merged_content.rewind + + merged_content + end end