2012-09-12 43 views
0

我有一大堆我想在Rails應用程序中編制索引的文檔。我想使用排序的rake任務來梳理目錄層次結構以查找文件並從這些文件捕獲元數據以在Rails中進行索引。Ruby/Rails:遍歷文件夾並解析元數據給種子數據庫

我不太確定如何在Ruby中做到這一點。我發現了一個名爲pdftk的實用程序,它可以從PDF文件中提取元數據(我索引的很多是PDF),但我不確定如何捕獲該數據的各個部分?

例如,要抓住下面的ModDate或每個BookmarkTitleBookmarkPageNumber

具體而言,我想遍歷文件層次結構,對每個.pdf執行pdftk $filename dump_data命令,然後將該輸出的重要部分捕獲到軌道模型中。從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寶石看起來有前途,可能避免需要觸發pdftk,不知何故,在shell?!?

+0

當我從課堂回來時,我會爲此寫一個答案。出於好奇,你對索引有什麼用?你只是想填充一個數據庫?你能舉一個索引的例子嗎? – Max

+0

我真的很感激! *任何*讓我朝着正確的方向前進。該索引是[Elasticsearch](http://www.elasticsearch.org/)(通過[Tire](https://github.com/karmi/tire)gem)。我沒有與ES結緣,但我確實已經運行並編制了PDF索引。我只想提取一些PDF元數據並將其插入到數據庫中。理想情況下,我希望有一個rake任務遍歷這些PDF的層次結構,並從中構建ActiveRecord模型,然後(通過Tire回調)將它們索引到Elasticsearch中。 – Meltemi

回答

1

首先,讓我說我的耙子知識不太好,所以可能會有一些錯誤。讓我知道如果有什麼不起作用,我會很樂意嘗試解決這個問題。

爲了解決這個問題,我將使用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模型。我希望這有幫助。

+0

你太善良了。我會在週末玩這個,接受或評論一次。真的很感激它! – Meltemi

+0

快速瀏覽一下,謝謝!這是否看到'BookmarkTitle:CONTENTS '行,例如,在輸出(呃,這種情況下的輸入),然後從它解析字符串「CONTENTS」?這就是我想要獲得的粒度。不知道它是否需要成爲RegEx或其他東西?!?但我想要捕獲每個'InfoKey'(和'Inf​​oValues')以及每個章節('BookmarkTitle')及其頁碼...狡猾,我知道! – Meltemi