Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby/Rails:遍历文件夹并将元数据解析为种子数据库_Ruby On Rails_Ruby_Parsing_Pdftk - Fatal编程技术网

Ruby on rails Ruby/Rails:遍历文件夹并将元数据解析为种子数据库

Ruby on rails Ruby/Rails:遍历文件夹并将元数据解析为种子数据库,ruby-on-rails,ruby,parsing,pdftk,Ruby On Rails,Ruby,Parsing,Pdftk,我想在Rails应用程序中索引一堆文档。我想使用rake任务来梳理目录层次结构,查找文件并从这些文件中捕获元数据以在Rails中建立索引 我真的不知道如何在Ruby中做到这一点。我发现了一个名为的实用程序,它可以从PDF文件中提取元数据(我正在索引的大部分是PDF),但我不确定如何捕获这些数据的各个部分 例如,获取下面的ModDate或每个书签标题和书签页码 具体地说,我想遍历一个文件层次结构,为我找到的每个.pdf执行pdftk$filename dump_data命令,然后将该输出的重要部分

我想在Rails应用程序中索引一堆文档。我想使用rake任务来梳理目录层次结构,查找文件并从这些文件中捕获元数据以在Rails中建立索引

我真的不知道如何在Ruby中做到这一点。我发现了一个名为的实用程序,它可以从PDF文件中提取元数据(我正在索引的大部分是PDF),但我不确定如何捕获这些数据的各个部分

例如,获取下面的
ModDate
或每个
书签标题
书签页码

具体地说,我想遍历一个文件层次结构,为我找到的每个.pdf执行
pdftk$filename dump_data
命令,然后将该输出的重要部分捕获到rails模型中

来自pdftk的输出:

$ pdftk BoringDocument883c2.pdf dump_data
InfoKey: Creator
InfoValue: Adobe Acrobat 9.3.4
InfoKey: Producer
InfoValue: Adobe Acrobat 9.34 Paper Capture Plug-in
InfoKey: ModDate
InfoValue: D:20110312194536-04'00'
InfoKey: CreationDate
InfoValue: D:20110214174733-05'00'
PdfID0: 2f28dcb8474c6849ae8628bc4157df43
PdfID1: 3e13c82c73a9f44bad90eeed137e7a1a
NumberOfPages: 126
BookmarkTitle: Alternative Maintenance Techniques
BookmarkLevel: 1
BookmarkPageNumber: 3
BookmarkTitle: CONTENTS
BookmarkLevel: 1
BookmarkPageNumber: 4
BookmarkTitle: EXHIBITS
BookmarkLevel: 1
BookmarkPageNumber: 6
BookmarkTitle: I - INTRODUCTION
BookmarkLevel: 1
BookmarkPageNumber: 8
BookmarkTitle: II - EXECUTIVE SUMMARY
BookmarkLevel: 1
BookmarkPageNumber: 13
BookmarkTitle: III - REMOTE DIAGNOSTICS - A STATUS REPORT
BookmarkLevel: 1
BookmarkPageNumber: 30
BookmarkTitle: IV - ALTERNATIVE TECHNIQUES
BookmarkLevel: 1
BookmarkPageNumber: 55
BookmarkTitle: V - COMPANYA - A SERVICE PHILOSOPHY
BookmarkLevel: 1
BookmarkPageNumber: 66
BookmarkTitle: VI - COMPANYB - REDUNDANT HARDWARE ARCHITECTURE
BookmarkLevel: 1
BookmarkPageNumber: 77
...shortened for brevity...
PageLabelNewIndex: 1
PageLabelStart: 1
PageLabelPrefix: F-E12_0001.jpg
PageLabelNumStyle: NoNumber
PageLabelNewIndex: 2
PageLabelStart: 1
PageLabelPrefix: F-E12_0002.jpg
PageLabelNumStyle: NoNumber
PageLabelNewIndex: 3
PageLabelStart: 1
PageLabelPrefix: F-E12_0003.jpg
PageLabelNumStyle: NoNumber
...

编辑:我最近在shell中发现了gem,它看起来很有希望,而且可能不需要触发
pdftk

首先,我要说的是,我对Rake的了解不是很好,所以可能会有一些错误。如果出现问题,请告诉我,我很乐意尝试解决问题

为了解决这个问题,我将使用2个rake任务。其中一个rake任务是递归目录遍历任务,另一个是启动递归的任务

desc "Populate the database with PDF metadata from the default PDF path"
task :populate_all_pdf_metadata do
  pdf_path = "/path/to/pdfs"

  Rake::Task[:populate_pdf_metadata].invoke(pdf_path)
end

desc "Recursively traverse a path looking for PDF metadata"
task :populate_pdf_metadata, :pdf_path do |t, args|
  excluded_dir_names = [".", ".."] # Do not look in dirs with these names.

  pdf_path = args[:pdf_path]

  Dir.entries(pdf_path).each do |file|
    if Dir.directory?(file) && !excluded_dir_names.include?(file)
      Rake::Task[:populate_pdf_metadata].invoke(pdf_path + "/" + file)
    elsif File.extname(file) == ".pdf"
      reader = PDF::Reader.new(file)

      # Populate the database here
    end
  end
end 

我相信上面的代码与您想要做的类似。为了访问数据库,您需要将
:environment
依赖项添加到任务中。您可以在Google上搜索如何从rake任务访问ActiveRecord模型。我希望这有帮助

我下课后要写一个答案。只是出于好奇,你用什么做索引?是否只想填充数据库?你能举一个索引的例子吗?我真的很感激!任何能让我朝正确方向前进的东西。指数是(通过创业板)。我并不热衷于ES,但我确实让它运行并为PDF本身编制索引。我只想提取一些PDF元数据并将其插入数据库。理想情况下,我想要一个rake任务,它遍历这些PDF的层次结构,并用它们构建ActiveRecord模型,然后(通过轮胎回调)将它们索引到Elasticsearch中。你太好了。我会在周末玩这个游戏,一旦有机会接受或评论。真的很感激!快看一遍,谢谢!这是否看到了
书签标题:CONTENTS
,然后从中解析字符串“CONTENTS”?这就是我想要达到的粒度。不确定它是否需要一个正则表达式或者其他什么?!?但是我想捕捉每一个
InfoKey
s(和
InfoValues
)以及每一章(
bookmarkstitle
)及其页码。。。狡猾,我知道!