[英]How to check if PDF, DOC or DOCX file is password protected in Ruby?
有沒有一種方法可以確定用戶上傳的文件是否受密碼保護? 我們有一種情況,我們不希望用戶在基於Ruby on Rails構建的應用程序中上載受密碼保護的文件。
文件類型將為PDF
或Word文檔( DOC
或DOCX
)
我不知道任何可用於此類任務的Ruby庫。
但是您可以從Ruby代碼中pdftotext
諸如docx2txt
和pdftotext
類的外部工具。 對於加密文件,調用這些工具會導致將消息打印到STDERR,並返回非零退出代碼。
讓我們看一下這個演示代碼:
#!/usr/bin/env ruby
require 'open3'
file_names = ARGV
command = ""
file_names.each do |file_name|
case file_name
when /.\.pdf$/i
command = "pdftotext #{file_name} -"
when /.\.docx$/i
command = "docx2txt #{file_name} -"
else
next
end
stdout, stderr, status = Open3.capture3(command)
puts "command: #{command}"
puts "stdout: #{stdout}"
puts "stderr: #{stderr}"
puts "status: #{status}"
puts
end
我為pdf和docx創建了四個文件,它們的解釋性名稱為: pass.docx
, pass.pdf
, no_pass.docx
, no_pass.pdf
並在上述腳本中執行:
./tester.rb pass.pdf pass.docx no_pass.pdf no_pass.docx
command: pdftotext pass.pdf -
stdout:
stderr: Command Line Error: Incorrect password
status: pid 5856 exit 1
command: docx2txt pass.docx -
stdout:
stderr: Failed to extract required information from <pass.docx>!
status: pid 5860 exit 2
command: pdftotext no_pass.pdf -
stdout: Hello world.
stderr:
status: pid 5866 exit 0
command: docx2txt no_pass.docx -
stdout: Hello world.
stderr:
status: pid 5870 exit 0
至少對於PDF,如果您在沒有提供有效密碼(使用-upw
參數指定)的情況下調用pdftotext
則可以確定文件是否受密碼保護。 只要注意Command Line Error: Incorrect password
stderr消息。
不幸的是,在那種情況下,我找不到用於docx
的工具,該工具返回明確的錯誤消息-可能還有其他原因導致docx2txt
無法轉換文件,並且Failed to extract required information from <pass.docx>!
消息,這將需要進一步調查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.