0

Railsアプリケーションでインデックスを作成したいドキュメントがたくさんあります。ある種のrakeタスクを使用して、ディレクトリ階層を組み合わせてファイルを探し、それらのファイルからメタデータをキャプチャしてRailsでインデックスを作成したいと思います。

Rubyでこれを行う方法がよくわかりません。PDFファイルからメタデータを抽出できるpdftkというユーティリティを見つけました(インデックスを作成しているものの多くはPDFです)が、そのデータの個々の部分をキャプチャする方法がわかりませんか?

たとえば、ModDateまたは以下を取得BookmarkTitleBookmarkPageNumberます。

具体的には、ファイル階層をトラバースし、pdftk $filename dump_data見つけた.pdfごとにコマンドを実行してから、その出力の重要な部分を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リーダーpdftkの宝石を見つけましたか?!?

4

1 に答える 1

1

まず、私のRakeの知識はあまり良くないので、間違いがあるかもしれません。何かがうまくいかない場合はお知らせください。問題を解決していただければ幸いです。

これを解決するために、2つのレーキタスクを使用します。rakeタスクの1つは再帰的なディレクトリトラバーサルタスクであり、もう1つは再帰を開始するタスクです。

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データベースにアクセスするには、タスクに依存関係を追加する必要があります。レーキタスクからActiveRecordモデルにアクセスする方法をGoogleで検索できます。これがお役に立てば幸いです。

于 2012-09-14T13:52:14.680 に答える