Ruby on rails 如何检查PDF、DOC或DOCX文件在Ruby中是否受密码保护?

Ruby on rails 如何检查PDF、DOC或DOCX文件在Ruby中是否受密码保护?,ruby-on-rails,ruby,Ruby On Rails,Ruby,是否有一种方法可以识别用户上传的文件是否受密码保护?我们有一个场景,我们不希望我们的用户在我们基于Ruby on Rails构建的应用程序中上传受密码保护的文件 文件类型要么是PDF,要么是Word文档DOC,要么是DOCX,我不知道有哪种Ruby库可以用于这种任务 但是您可以从Ruby代码调用外部工具,如docx2txt和pdftotext。对于加密文件,调用这些工具将导致将消息打印到STDERR并返回非零退出代码 让我们看看这个演示代码: #!/usr/bin/env ruby requir

是否有一种方法可以识别用户上传的文件是否受密码保护?我们有一个场景,我们不希望我们的用户在我们基于Ruby on Rails构建的应用程序中上传受密码保护的文件


文件类型要么是PDF,要么是Word文档DOC,要么是DOCX,我不知道有哪种Ruby库可以用于这种任务

但是您可以从Ruby代码调用外部工具,如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,如果调用pdftotext而不提供用-upw参数指定的有效密码,则可以确定文件是否受密码保护。只需注意命令行错误:错误的密码stderr消息


不幸的是,在这种情况下,我找不到一个用于docx的工具返回明确的错误消息-可能还有其他原因导致docx2txt无法转换文件,无法从中提取所需信息!这将需要进一步调查。

什么文件类型?如果你说“任何”,那就不可能做你想做的事files@nuravWord Document指的是modern.docx还是legacy doc文件?可能两者都有,但是,如果不可能对遗留DOC文件进行限制,那么我们可以将其作为用户上传文件的必要条件。对于使用Adobe加密选项加密的PDF文件,请考虑使用GEM等。我不熟悉它,但我看到可以应用的规则之一是飞行前::规则::无加密。如果设计用于读取pdf或Word文件的gem无法打开该文件,则可能表明该文件已加密。如果加密文件始终是二进制文件,gem*ruby filemagic]可用于确定文件是否为二进制文件。值得注意的是,ruby的case语句可以处理多个正则表达式,并且比一系列if语句要简单得多。这里需要注意的另一件事是使用它提取文件扩展名,而不需要正则表达式。然后您可以将这种情况归结为一个简单的哈希查找表。考虑文件名中的空格也很重要,当运行命令时,插值是永远不够的。使用离散参数,如open3cmd、文件名,-等。