diff --git a/CHANGELOG.md b/CHANGELOG.md index d16d970..e40715c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog * `Unreleased` - [View Diff](https://github.com/cortiz/prawn-rails/compare/v1.5.0...master) - - Nothing yet + - [#55](https://github.com/cortiz/prawn-rails/pull/55) - Add config options `additional_fonts` and `default_font_name` * `v1.5.0` - [View Diff](https://github.com/cortiz/prawn-rails/compare/v1.4.2...v1.5.0) - [#52](https://github.com/cortiz/prawn-rails/pull/52) - Add active_support as a dependency and use the active_support lazy load hooks diff --git a/README.md b/README.md index 075695e..46ce1c4 100644 --- a/README.md +++ b/README.md @@ -60,9 +60,21 @@ Add a `prawn-rails.rb` config to your Rails app under `config/initializers` like ```ruby PrawnRails.config do |config| + # Prawn::Document options config.page_layout = :portrait config.page_size = "A4" config.skip_page_creation = false + + # PrawnRails options + config.additional_fonts = { + "some-custom-font" => { + normal: Rails.root.join('app/assets/fonts/print/some-custom-font.ttf'), + italic: Rails.root.join('app/assets/fonts/print/some-custom-font-italic.ttf'), + bold: Rails.root.join('app/assets/fonts/print/some-custom-font-bold.ttf'), + bold_italic: Rails.root.join('app/assets/fonts/print/some-custom-font-bold-italic.ttf'), + }, + } + config.default_font_name = "some-custom-font" end ``` diff --git a/lib/prawn-rails/config.rb b/lib/prawn-rails/config.rb index bffadea..98afbc0 100644 --- a/lib/prawn-rails/config.rb +++ b/lib/prawn-rails/config.rb @@ -26,6 +26,8 @@ def method_missing(method_name, *args) page_layout: :portrait, page_size: "A4", skip_page_creation: false, + additional_fonts: nil, + default_font_name: nil, ) def config(&block) diff --git a/lib/prawn-rails/document.rb b/lib/prawn-rails/document.rb index 37bfde3..d4b1e19 100644 --- a/lib/prawn-rails/document.rb +++ b/lib/prawn-rails/document.rb @@ -4,7 +4,7 @@ module PrawnRails class Document < Prawn::Document def initialize(options = {}) - options = PrawnRails.config.merge(options) + options = PrawnRails.config.except(:additional_fonts, :default_font_name).merge(options) super(options) end @@ -16,5 +16,21 @@ def text(value, options = {}) # To circumvent this situation, we call to_s on value, and delegate action to actual Prawn::Document super(value.to_s, options) end + + def start_new_page(options = {}) + return_val = super + + if state.page_count == 1 + if PrawnRails.config.additional_fonts + font_families.update(PrawnRails.config.additional_fonts) + end + + if PrawnRails.config.default_font_name + font(PrawnRails.config.default_font_name) + end + end + + return_val + end end end diff --git a/test/dummy_app/app/assets/stylesheets/fonts/Arial.ttf b/test/dummy_app/app/assets/stylesheets/fonts/Arial.ttf new file mode 100755 index 0000000..7ff88f2 Binary files /dev/null and b/test/dummy_app/app/assets/stylesheets/fonts/Arial.ttf differ diff --git a/test/test_helper.rb b/test/test_helper.rb index 159dce3..e429fd3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -21,3 +21,17 @@ require 'pry' require 'pdf/reader' + +DEFAULT_CONFIG ||= PrawnRails.config.clone + +def restore_default_config + PrawnRails.config do |config| + config.keys.each do |key| + config.delete(key) + end + + DEFAULT_CONFIG.each do |k,v| + config[k] = v + end + end +end diff --git a/test/unit/config_test.rb b/test/unit/config_test.rb index 6e6be91..1b8a701 100644 --- a/test/unit/config_test.rb +++ b/test/unit/config_test.rb @@ -2,24 +2,18 @@ class ConfigTest < ActiveSupport::TestCase - def setup - @original_config = PrawnRails.config.clone - end - def teardown - PrawnRails.config do |config| - config.keys.each do |key| - config.delete(key) - end - - @original_config.each do |k,v| - config[k] = v - end - end + restore_default_config end test "has a default config" do - assert_equal PrawnRails.config.symbolize_keys, {page_layout: :portrait, page_size: "A4", skip_page_creation: false} + assert_equal PrawnRails.config.symbolize_keys, { + page_layout: :portrait, + page_size: "A4", + skip_page_creation: false, + default_font_name: nil, + additional_fonts: nil, + } end test "config can be set with block syntax" do @@ -28,7 +22,13 @@ def teardown config.page_size = "A8" end - assert_equal PrawnRails.config.symbolize_keys, {page_layout: :landscape, page_size: "A8", skip_page_creation: false} + assert_equal PrawnRails.config.symbolize_keys, { + page_layout: :landscape, + page_size: "A8", + skip_page_creation: false, + default_font_name: nil, + additional_fonts: nil, + } end test "allows reading any hash value via method syntax" do diff --git a/test/unit/rails_helpers_test.rb b/test/unit/rails_helpers_test.rb index 9e3c8da..2878fdb 100644 --- a/test/unit/rails_helpers_test.rb +++ b/test/unit/rails_helpers_test.rb @@ -5,6 +5,10 @@ class RailsHelperTest < ActiveSupport::TestCase include PrawnRails::RailsHelper + def teardown + restore_default_config + end + test "matches .PDF extension regardless of case" do ["pDf", "pdf", "PDF"].each do |ext| @filename = "test.#{ext}" @@ -18,4 +22,39 @@ class RailsHelperTest < ActiveSupport::TestCase end end + test "config.default_font_name" do + font_name = "Arial" + + PrawnRails.config.default_font_name = "Arial" + + font_path = Rails.root.join("app/assets/stylesheets/fonts/Arial.ttf") + + PrawnRails.config.additional_fonts = { + "Arial" => { + normal: font_path, + italic: font_path, + bold: font_path, + bold_italic: font_path, + }, + } + + prawn_document do |pdf| + assert_equal pdf.font.family, "Arial" + + pdf.text "foo" + end + + prawn_document(skip_page_creation: true) do |pdf| + assert_raises(Prawn::Errors::NotOnPage) do + pdf.font + end + + pdf.start_new_page + + assert_equal pdf.font.family, "Arial" + + pdf.text "foo" + end + end + end