Ruby / Rails:遍历文件夹并解析元数据到种子DB

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

我不确定如何在Ruby中执行此操作。 我找到了一个名为pdftk的实用程序,它可以从PDF文件中提取元数据(我索引的大部分内容都是PDF),但我不确定如何捕获该数据的各个部分?

例如,要获取下面的ModDate或每个BookmarkTitleBookmarkPageNumber

具体来说,我想遍历文件层次结构,为我找到的每个.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 ... 

编辑:我最近发现了一个看起来很有前景的pdf-reader gem,可能会在shell中以某种方式消除触发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模型。 我希望这有帮助。