From 9186bbdedef10e394eeba2cb41ec5ceafc836ed9 Mon Sep 17 00:00:00 2001 From: Nils Dittberner Date: Sun, 27 Nov 2016 01:05:04 +0100 Subject: [PATCH] Added previews, load pdf with selected page. --- app/jobs/content_generation_job.rb | 50 ++++++++++++++++++---- app/models/content.rb | 1 + app/models/page_preview.rb | 11 +++++ app/views/documents/index.html.erb | 8 ++-- app/views/documents/show.html.erb | 11 ++++- .../20161126215021_add_pagecount_to_content.rb | 5 +++ db/migrate/20161126222233_create_page_previews.rb | 9 ++++ ...2301_add_attachment_preview_to_page_previews.rb | 11 +++++ ...0161126234039_add_pagenumber_to_page_preview.rb | 5 +++ db/schema.rb | 19 ++++++-- test/fixtures/page_previews.yml | 7 +++ test/models/page_preview_test.rb | 7 +++ 12 files changed, 126 insertions(+), 18 deletions(-) create mode 100644 app/models/page_preview.rb create mode 100644 db/migrate/20161126215021_add_pagecount_to_content.rb create mode 100644 db/migrate/20161126222233_create_page_previews.rb create mode 100644 db/migrate/20161126222301_add_attachment_preview_to_page_previews.rb create mode 100644 db/migrate/20161126234039_add_pagenumber_to_page_preview.rb create mode 100644 test/fixtures/page_previews.yml create mode 100644 test/models/page_preview_test.rb diff --git a/app/jobs/content_generation_job.rb b/app/jobs/content_generation_job.rb index 5409768..50c2d66 100644 --- a/app/jobs/content_generation_job.rb +++ b/app/jobs/content_generation_job.rb @@ -2,25 +2,57 @@ class ContentGenerationJob < ApplicationJob require 'docsplit' @document_id = nil + @document = nil + @content = nil queue_as :default - after_perform :generate_tags + # after_perform :generate_tags def perform(document_id) @document_id = document_id - document = Document.find(document_id) - Docsplit.extract_text(document.doc.path, output: 'tmp/raw_content') - file_path = 'tmp/raw_content/' + File.basename(document.doc.path, 'pdf') + 'txt' - text = IO.read(file_path) + @document = Document.find(document_id) + @content = @document.build_content - content = document.build_content(text: text) - content.save! - - File.delete(file_path) if File.exist?(file_path) + generate_metadata + generate_text + generate_page_previews end private + def generate_metadata + length = Docsplit.extract_length(@document.doc.path, output: 'tmp/raw_content') + @content.pagecount = length + @content.save + end + + def generate_text + Docsplit.extract_text(@document.doc.path, output: 'tmp/raw_content') + file_path = 'tmp/raw_content/' + File.basename(@document.doc.path, 'pdf') + 'txt' + text = IO.read(file_path) + @content.text = text + @content.save! + + File.delete(file_path) if File.exist?(file_path) + end + + def generate_page_previews + file_basename = File.basename(@document.doc.path, '.pdf') + folder_path = 'tmp/raw_content/' + file_basename + Docsplit.extract_images(@document.doc.path, output: folder_path, size: '200x', format: :png) + @content.pagecount.times do |page| + i = page + 1 + page_preview = @content.page_previews.build + puts 'build fine' + file = File.open(folder_path + '/' + File.basename(@document.doc.path, '.pdf') + '_' + i.to_s + '.png', 'rb') + puts 'opened fine' + page_preview.preview = file + page_preview.pagenumber = i + file.close + page_preview.save + end + end + def generate_tags TagGenerationJob.perform_now @document_id end diff --git a/app/models/content.rb b/app/models/content.rb index 6b3c2da..9cd3f31 100644 --- a/app/models/content.rb +++ b/app/models/content.rb @@ -1,3 +1,4 @@ class Content < ApplicationRecord belongs_to :document + has_many :page_previews, dependent: :destroy end diff --git a/app/models/page_preview.rb b/app/models/page_preview.rb new file mode 100644 index 0000000..63033cd --- /dev/null +++ b/app/models/page_preview.rb @@ -0,0 +1,11 @@ +class PagePreview < ApplicationRecord + belongs_to :content + + has_attached_file :preview, + { + adapter_options: { hash_digest: Digest::SHA256 }, + url: "/system/:class/:attachment/:id_partition/:style/:hash.:extension", + hash_secret: Rails.application.secrets.secret_key_base + } + validates_attachment_content_type :preview, content_type: 'image/png' +end diff --git a/app/views/documents/index.html.erb b/app/views/documents/index.html.erb index bebb3a9..6541806 100644 --- a/app/views/documents/index.html.erb +++ b/app/views/documents/index.html.erb @@ -7,7 +7,7 @@ Category Name - + Created @@ -15,10 +15,8 @@ <% @documents.each do |document| %> <%= document.category.get_fqcn %> - <%= document.name %> - <%= link_to 'Show', document %> - <%= link_to 'Edit', edit_document_path(document) %> - <%= link_to 'Destroy', document, method: :delete, data: { confirm: 'Are you sure?' } %> + <%= link_to document.name, document %> + <%= document.created_at.localtime %> <% end %> diff --git a/app/views/documents/show.html.erb b/app/views/documents/show.html.erb index 4f14c92..0be0631 100644 --- a/app/views/documents/show.html.erb +++ b/app/views/documents/show.html.erb @@ -10,7 +10,11 @@ <%= @document.category.get_fqcn %>

-<% if File.exists?(@document.doc.path(:thumb)) %> +<% if @document.content.page_previews.any? %> + <% @document.content.page_previews.each do |page_preview| %> + <%= link_to image_tag(page_preview.preview.url, alt: 'Page #' + page_preview.pagenumber.to_s), @document.doc.url + '#page=' + page_preview.pagenumber.to_s %> + <% end %> +<% elsif File.exists?(@document.doc.path(:thumb)) %>

<%= link_to image_tag(@document.doc.url(:thumb), alt: 'Thumbnail of PDF'), @document.doc.url %>

@@ -22,6 +26,10 @@ <% if @document.content %>

+ Pagecount: + <%= @document.content.pagecount %> +

+

Content: <%= @document.content.text.truncate_words(30) %>

@@ -33,4 +41,5 @@ <%= link_to 'Edit', edit_document_path(@document) %> | +<%= link_to 'Destroy', @document, method: :delete, data: { confirm: 'Are you sure?' } %> | <%= link_to 'Back', documents_path %> diff --git a/db/migrate/20161126215021_add_pagecount_to_content.rb b/db/migrate/20161126215021_add_pagecount_to_content.rb new file mode 100644 index 0000000..387ddb0 --- /dev/null +++ b/db/migrate/20161126215021_add_pagecount_to_content.rb @@ -0,0 +1,5 @@ +class AddPagecountToContent < ActiveRecord::Migration[5.0] + def change + add_column :contents, :pagecount, :integer, default: -1 + end +end diff --git a/db/migrate/20161126222233_create_page_previews.rb b/db/migrate/20161126222233_create_page_previews.rb new file mode 100644 index 0000000..f732222 --- /dev/null +++ b/db/migrate/20161126222233_create_page_previews.rb @@ -0,0 +1,9 @@ +class CreatePagePreviews < ActiveRecord::Migration[5.0] + def change + create_table :page_previews do |t| + t.references :content, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20161126222301_add_attachment_preview_to_page_previews.rb b/db/migrate/20161126222301_add_attachment_preview_to_page_previews.rb new file mode 100644 index 0000000..e8ee47b --- /dev/null +++ b/db/migrate/20161126222301_add_attachment_preview_to_page_previews.rb @@ -0,0 +1,11 @@ +class AddAttachmentPreviewToPagePreviews < ActiveRecord::Migration + def self.up + change_table :page_previews do |t| + t.attachment :preview + end + end + + def self.down + remove_attachment :page_previews, :preview + end +end diff --git a/db/migrate/20161126234039_add_pagenumber_to_page_preview.rb b/db/migrate/20161126234039_add_pagenumber_to_page_preview.rb new file mode 100644 index 0000000..08f659a --- /dev/null +++ b/db/migrate/20161126234039_add_pagenumber_to_page_preview.rb @@ -0,0 +1,5 @@ +class AddPagenumberToPagePreview < ActiveRecord::Migration[5.0] + def change + add_column :page_previews, :pagenumber, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index f905372..f5c1085 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161125201757) do +ActiveRecord::Schema.define(version: 20161126234039) do create_table "categories", force: :cascade do |t| t.string "name" @@ -25,8 +25,9 @@ ActiveRecord::Schema.define(version: 20161125201757) do create_table "contents", force: :cascade do |t| t.text "text" t.integer "document_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "pagecount", default: -1 t.index ["document_id"], name: "index_contents_on_document_id" end @@ -51,6 +52,18 @@ ActiveRecord::Schema.define(version: 20161125201757) do t.integer "tag_id", null: false end + create_table "page_previews", force: :cascade do |t| + t.integer "content_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "preview_file_name" + t.string "preview_content_type" + t.integer "preview_file_size" + t.datetime "preview_updated_at" + t.integer "pagenumber" + t.index ["content_id"], name: "index_page_previews_on_content_id" + end + create_table "tags", force: :cascade do |t| t.string "value" t.boolean "automatically_asigned" diff --git a/test/fixtures/page_previews.yml b/test/fixtures/page_previews.yml new file mode 100644 index 0000000..e10a0cf --- /dev/null +++ b/test/fixtures/page_previews.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + content: one + +two: + content: two diff --git a/test/models/page_preview_test.rb b/test/models/page_preview_test.rb new file mode 100644 index 0000000..06f95f5 --- /dev/null +++ b/test/models/page_preview_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class PagePreviewTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end