我有一堆文档,我想在Rails应用程序中对它们进行索引。我想使用某种rake任务来梳理目录层次结构,查找文件并从这些文件中捕获元数据,以便在Rails中进行索引。
我真的不知道如何在Ruby中做到这一点。我发现了一个名为pdftk的实用程序,它可以从PDF文件中提取元数据(我正在索引的大部分是PDF),但我不知道如何捕获这些数据的各个部分?
例如,获取下面的ModDate
或每个BookmarkTitle
和BookmarkPageNumber
。
具体来说,我想遍历一个文件层次结构,对我找到的每个.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阅读器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
依赖项。您可以在谷歌上搜索如何从rake任务访问ActiveRecord模型。我希望这能有所帮助。