From 1aa3213cf74750dea860c519ddafb74ed0430f45 Mon Sep 17 00:00:00 2001 From: Mike <865014+michelpmcdonald@users.noreply.github.com> Date: Thu, 19 Dec 2024 17:27:31 -0500 Subject: [PATCH] Check all the PDFs pages for oversized page dimensions --- lib/pdf_info.rb | 18 ++++++++++++++++-- lib/pdf_utilities/pdf_validator.rb | 17 +++++++++-------- .../vba_documents/spec/fixtures/10x102.pdf | Bin 396589 -> 406579 bytes 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/pdf_info.rb b/lib/pdf_info.rb index 6f6d9dd9624..5b6b6657ea0 100644 --- a/lib/pdf_info.rb +++ b/lib/pdf_info.rb @@ -18,7 +18,7 @@ def self.read(file_or_path) def initialize(path) @stdout = [] - Open3.popen2e(Settings.binaries.pdfinfo, path) do |_stdin, stdout, wait| + Open3.popen2e(Settings.binaries.pdfinfo, '-l', '-1', path) do |_stdin, stdout, wait| stdout.each_line do |line| @stdout.push(force_utf8_encoding(line)) end @@ -43,7 +43,7 @@ def pages end def page_size - width, height = self['Page size'].scan(/\d+/).map(&:to_i) + width, height = self['Page 1 size'].scan(/\d+/).map(&:to_i) { width:, height: } end @@ -55,6 +55,20 @@ def page_size_inches } end + def oversized_pages(max_width, max_height) + results = [] + (1..pages).each do |page_num| + page_key = page_num < 10_000 ? format('%4d', page_num) : page_num + pw_pts, ph_pts = self["Page #{page_key} size"].scan(/\d+/).map(&:to_i) + pw_inches = convert_pts_to_inches(pw_pts) + ph_inches = convert_pts_to_inches(ph_pts) + if pw_inches > max_width || ph_inches > max_height + results << "Page #{page_num}, Width: #{pw_inches}, Height: #{ph_inches}" + end + end + results + end + def file_size self['File size'].scan(/\d+/).first.to_i end diff --git a/lib/pdf_utilities/pdf_validator.rb b/lib/pdf_utilities/pdf_validator.rb index 7511c1058e1..0c8b2b19528 100644 --- a/lib/pdf_utilities/pdf_validator.rb +++ b/lib/pdf_utilities/pdf_validator.rb @@ -97,14 +97,15 @@ def check_encryption end def check_page_size - if @pdf_metadata.present? - dimensions = @pdf_metadata.page_size_inches - width_limit = @options[:width_limit_in_inches] - height_limit = @options[:height_limit_in_inches] - - if dimensions[:width] > width_limit || dimensions[:height] > height_limit - @result.add_error("#{PAGE_SIZE_LIMIT_EXCEEDED_MSG} of #{width_limit} in. x #{height_limit} in.") - end + return if @pdf_metadata.blank? + + width_limit = @options[:width_limit_in_inches] + height_limit = @options[:height_limit_in_inches] + + oversized_pages = @pdf_metadata.oversized_pages(width_limit, height_limit) + + if oversized_pages.present? + @result.add_error("#{PAGE_SIZE_LIMIT_EXCEEDED_MSG} of #{width_limit} in. x #{height_limit} in.") end end end diff --git a/modules/vba_documents/spec/fixtures/10x102.pdf b/modules/vba_documents/spec/fixtures/10x102.pdf index 68a51b26f54b54bf9138737516a05f3e6b74b43b..43cfda1b59f66415869d847bc6a74a5ade1ef11f 100644 GIT binary patch delta 13380 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 R3IHc01i@ork=Ibb`#;9b(+L0o delta 3317 zcmbtX4^R}>85cEZuWjUNO<O>)pWFWlp5{mSg;uqnXzi@jEMv(k_u|9VKkK_ZH-AK>D#^A;}kTR z_GaGP-nZZTz2En}@82C6OMms{^yQfqj2k747G37m_ulH)Q3#F*b&Wc^9V-RFdZ_^+ zp~Qo^IbH%H=H^)mFu*JL0Jan{VIDSE4_4s_0hK0K?WTd;%>%h9aLt5k7F@Ht2XY@8 zyilYAL7#%Jpeo-~9%UkFO-fHW-F%!S`h<6{6sac;S)R@FIAwF1Lay zMyy84NT3|DI=hAoQsnBK9G%0FFwGPY6*0o-%&+w!}hro|LYKsO!0SJ#o1AH)Si{=|x7<<45pA|7?h$%u<(dV~$7nErNK(j#Va?6W#%9VWi1ip@wOTQp#7Gi_8fdsBD6vsA7+xeNfZ|XL2zx~?BymCz zQJ~p6AtL1)3>uL@sH`k;LNIJpX&Jpj0E@CAj4Yyb+`U>Lgij%NSODI)2f%Jb~2dsP3Uk7}F$%K)*CtRV} zrd2k_G=(iz*K+LGU5fuBTX{-`K~$LS@f5x*!IU>J!=~XIwZ;2{Lv0f(wMp57sKNM) zebhRV6!Oz0zt5W>7K(_xT3LKv4DdinzcA!R+~Z51*Cr`VC^^XDN#x`uC{3KNvQSCz zoKkCSJZ#VThA8R-em25O2FGL@iv_|snzf)UhK8eK?KAZ+dh`c-=U?f|{Qjf0KixA_^!L%`ofU5{Z=Tmg9=UPh;+tY>NBi-N zMSq*KxvhQkr562V{p@Y!A4=AYg0w%K*!04&c31kRS1)foTNU_Vt8?x*2KVTnU%q$v zfWB?ZovMW=_LEJYtv$B4`0?`g9o8N?viaE0#{IkG43@uc_oiK#v7ssbR^uMMn||ND z?wN*lt<)nco?VtZcnA2q!R0!zXRe=z2r*jMt~%+R4+ za(gRwWA(tvC1dENtLtmNIFO!IxixV7Q-Li#b9VT&*Yn+PpE&@QHNLZJ{N%CL&QGNC z*AD;r!;MB(4(NpVYHm2FoUzw@<=0Vq~LBpm3{qu!KUH~6G zrk`iLmXV(K>qvLj{C~gxo!J}b&H8KKg1VtO^$XvPoXcwZ<(l3l9rC_26FtVoU+eHU z41b-`Pqgg6@=vxoQeEAja`V=W4(0&{5=iyYJ}0^?{pvPrhU`Y;Vc=;PfNUKI}O7{y#pi9@r-y zeok6>t!K>$=ylB4|JJNd7{Btp0jv#FX2P17g0!IxPC?Vm(rU=9@Blwnvx-0{gsjCX zxmJLXX3Qf95~7B`2P+Qx1wiP$o0u zh^st6qZW(J^A)TZ2t#%*fsX`&VT8siMBwAR%Aib;4u|%CfFS93Wzh0L4(Ou8=8isn ziZiWn^bR;5T9DFMGGpn?(Dui3dPRj+w!V$ByvKcqT;tl!OlHq^gm z!0t>*^*{B;@W|_bs5MrG7iG7VZb+}he*fN?tf74H8`s92&vkD({Yvk)r|qvEs**1@ x?#!^C|BvBcfxcgLm86v1o+&Rx7T=s&MBtnxN>LH`b(EDRaYC1wSy=AY{TBgwQfdGI