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

时间:2018-03-25 14:36:45

标签: ruby-on-rails ruby

有没有办法确定用户上传的文件是否受密码保护?我们有一个场景,我们不希望我们的用户在我们的基于Ruby on Rails构建的应用程序中上传受密码保护的文件。

文件类型可以是PDF,也可以是Word文档(DOCDOCX

1 个答案:

答案 0 :(得分:1)

我不知道任何可用于此类任务的Ruby库。

但您可以从Ruby代码中调用docx2txtpdftotext等外部工具。对于调用这些工具的加密文件,会导致向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.docxpass.pdfno_pass.docxno_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,则可以确定文件是否受密码保护。只需注意Command Line Error: Incorrect password stderr消息。

不幸的是,我无法找到docx的工具,在这种情况下会返回明确的错误消息 - 可能还有其他原因导致docx2txt无法使用{{1}转换文件消息,这将需要进一步调查。