В настоящее время я работаю над анализом телефонных номеров в форме PDF.Я использую самоцвет pdf-form
, который также использует pdftk
.Номера телефонов возвращаются в формате JSON при запросе службы форм, которую я использую FormStack .
. Я создал DICTIONARY
, чтобы сопоставить идентификатор поля в PDF-форме сидентификатор поля в ответе JSON FormStack.Таким образом, я мог бы перебирать их.
DICTIONARY = {
'Applicant Name' => '66563757', #Name
'DATE OF BIRTH mmddyyyy' => '66563844', #Date of Birth
##
'TELEPHONE NUMBER area code 1'=> '66563943', #Primary Phone - Area code (000)
'TELEPHONE NUMBER first 3 1' => '66563943', #Primary Phone - (000) 000
'TELEPHONE NUMBER Last 4 1' => '66563943', #Primary Phone - (000) 000-0000
'CELLPHONE NUMBER area code 1'=> '66563947', #Secondary Phone - Area code (000)
'CELLPHONE NUMBER first 3 1' => '66563947', #Secondary Phone - (000) 000
'CELLPHONE NUMBER Last 4 1' => '66563947', #Secondary Phone - (000) 000-0000
'TELEPHONE NUMBER area code 2'=> '66564485', #Phone - Area code (000)
'TELEPHONE NUMBER first 3 2' => '66564485', #Phone - first 3 - (000) 000
'TELEPHONE NUMBER Last 4 2' => '66564485', #Phone - last 4 - (000) 000-0000
}
Как видите, телефонные номера разбиты на первые 3-значный код города, вторые 3 цифры и последние 4. Я создал библиотеку для разбора этогономера телефонов в поле формы PDF.Значения в хэше DICTIONARY
являются полями в цифровой форме в FormStack. USER_DATA
- это то, что передается в initialize(user_submission_data)
, который является данными пользователя, когда он заполняет форму.
class PdfScrie < FillablePdfForm
def initialize(user_submission_data)
@user_submission_data = user_submission_data
super()
end
private
DICTIONARY = {
}
APPLICANT_ADDRESS_FORM_FIELD_ID = "66563934"
TENANT_REPRESENTATIVE_ADDRESS_FORM_FIELD_ID = "66564487"
TELEPHONE_NUMBER_1_id = "66563943"
CELLPHONE_NUMBER_1_id = "66563947"
ADDRESS_FIELD_IDS = [
APPLICANT_ADDRESS_FORM_FIELD_ID,
TENANT_REPRESENTATIVE_ADDRESS_FORM_FIELD_ID,
].freeze
PHONE_NUMBER_FIELD_IDS = [
TELEPHONE_NUMBER_1_id,
CELLPHONE_NUMBER_1_id
].freeze
def fill_out
form_fields.each do |field|
id = DICTIONARY[field]
@user_submission_data
.select {|fd| fd[:field] == id}
.each do |field_data|
if address_field?(field_data[:field])
break_address_into_state_city_zipcode(field_data[:value], field)
elsif phone_number?(field_data[:field])
parse_phone_number(field_data[:value])
fill(field, @phone_number_sections.shift)
else
fill(field, field_data[:value])
end
end
end
end
def address_field?(field)
ADDRESS_FIELD_IDS.include?(field.to_s)
end
def break_address_into_state_city_zipcode(address, field)
address_by_section = FormStack::Form.parse_formstack_nested_attrs(address)
address_by_section.each do |section,value|
fill(field, value) if form_field_has_section?(field, section)
end
end
def form_field_has_section?(form_field_name, address_section)
form_field_name.include? address_section.upcase
end
def parse_phone_number(phone_number)
@phone_number_sections ||= phone_number.gsub(/\D+/, "").match(/(...)(...)(....)/).captures
end
def phone_number?(field)
PHONE_NUMBER_FIELD_IDS.include?(field.to_s)
end
end
Однако, при переборе только по PHONE_NUMBER_FIELD_IDS
первый номер телефона анализируется.Когда я запускаю метод binding.pry
fill_out
, я вижу, что на самом деле это число, которое я хочу проанализировать.
[2] pry(#<PdfScrie>)> parse_phone_number(field_data[:value])
=> ["201", "785", "9896"]
[3] pry(#<PdfScrie>)> fill(field, @phone_number_sections.shift)
=> "201"
Однако CELLPHONE_NUMBER_1_id
не анализируется, и я могуне понимаю, почему это не так.
Это метод fill
, который используется другой библиотекой и преобразует ее в PDF.
def fill(key, value)
attributes[ key.to_s ] = value
end
def pdftk
@pdftk ||= PdfForms.new()
end