Files
plottservice/lib/services/pdf_analyzer.rb
David Böhm 616bd0cbe7 Added pdf analyzer
Analyzer should be moved to ActiveStorage::Analyzer
First there are many bugs with ActiveStorage that needs to be fixed:
Files are not deleted if job is destroyed (dependent: :purge is set)
If a new file is uploaded the old file is not deleted
(has_one_attechment)
2024-08-08 13:56:36 +02:00

81 lines
1.8 KiB
Ruby

module Services
# Class to analyze PDF to extract number of pages from a0 to a3 and costum qm
class PdfAnalyzer
require 'pdf/reader'
require 'bigdecimal'
attr_reader :costum_qm, :pages_a0, :pages_a1, :pages_a2, :pages_a3
def initialize(file)
@reader = PDF::Reader.new(file)
@pages_a0 = 0
@pages_a1 = 0
@pages_a2 = 0
@pages_a3 = 0
@costum_qm = 0
@page_width = 0
@page_height = 0
end
def analyze
@reader.pages.each do |page|
format = extract_format(page)
case format
when 'a0'
@pages_a0 += 1
when 'a1'
@pages_a1 += 1
when 'a2'
@pages_a2 += 1
when 'a3'
@pages_a3 += 1
else
@costum_qm += calculate_qm
end
end
end
private
def calculate_qm
(@page_width / 1000) * (@page_height / 1000)
end
def extract_format(page)
# debugger
extract_size(page)
return 'a0' if @page_width.round == 841 && @page_height.round == 1189
return 'a1' if @page_width.round == 594 && @page_height.round == 841
return 'a2' if @page_width.round == 420 && @page_height.round == 594
return 'a3' if @page_width.round == 297 && @page_height.round == 420
'costum'
end
def extract_size(page)
# debugger
bbox = page.attributes[:MediaBox] # CropBox
width = bbox[2] - bbox[0]
height = bbox[3] - bbox[1]
width_in_mm = pt2mm(width)
height_in_mm = pt2mm(height)
width_in_mm, height_in_mm = height_in_mm, width_in_mm if width_in_mm > height_in_mm
@page_width = width_in_mm
@page_height = height_in_mm
nil
end
def pt2mm(pt)
(pt2in(pt) * BigDecimal('25.4')).round(2)
end
def pt2in(pt)
(pt / BigDecimal('72')).round(2)
end
end
end