├── test ├── dummy │ ├── log │ │ └── .gitkeep │ ├── app │ │ ├── mailers │ │ │ └── .gitkeep │ │ ├── models │ │ │ ├── .gitkeep │ │ │ └── product.rb │ │ ├── helpers │ │ │ ├── pdf_helper.rb │ │ │ ├── products_helper.rb │ │ │ └── application_helper.rb │ │ ├── views │ │ │ ├── pdf │ │ │ │ ├── render_pdf.html.erb │ │ │ │ └── render_pdf.pdf.prawn │ │ │ └── layouts │ │ │ │ └── application.html.erb │ │ ├── controllers │ │ │ ├── application_controller.rb │ │ │ └── pdf_controller.rb │ │ └── assets │ │ │ ├── stylesheets │ │ │ ├── pdf.css │ │ │ ├── products.css │ │ │ ├── application.css │ │ │ └── scaffold.css │ │ │ └── javascripts │ │ │ ├── pdf.js │ │ │ ├── products.js │ │ │ └── application.js │ ├── lib │ │ └── assets │ │ │ └── .gitkeep │ ├── public │ │ ├── favicon.ico │ │ ├── 422.html │ │ ├── 404.html │ │ └── 500.html │ ├── config │ │ ├── initializers │ │ │ ├── prawn-rails.rb │ │ │ ├── mime_types.rb │ │ │ ├── inflections.rb │ │ │ ├── backtrace_silencers.rb │ │ │ ├── session_store.rb │ │ │ ├── secret_token.rb │ │ │ └── wrap_parameters.rb │ │ ├── environment.rb │ │ ├── locales │ │ │ └── en.yml │ │ ├── boot.rb │ │ ├── database.yml │ │ ├── environments │ │ │ ├── development.rb │ │ │ ├── test.rb │ │ │ └── production.rb │ │ ├── application.rb │ │ └── routes.rb │ ├── test │ │ ├── unit │ │ │ └── helpers │ │ │ │ └── pdf_helper_test.rb │ │ └── functional │ │ │ └── pdf_controller_test.rb │ ├── config.ru │ ├── Rakefile │ ├── script │ │ └── rails │ └── db │ │ └── schema.rb ├── integration │ └── navigation_test.rb ├── prawn-rails_test.rb └── test_helper.rb ├── lib ├── prawn-rails │ ├── version.rb │ ├── renderer.rb │ ├── config.rb │ ├── engine.rb │ ├── rails_helper.rb │ ├── document.rb │ └── extension.rb ├── prawn-rails.rb └── tasks │ └── prawn-rails_tasks.rake ├── .gitignore ├── script └── rails ├── Gemfile ├── Rakefile ├── prawn-rails.gemspec ├── MIT-LICENSE └── README.markdown /test/dummy/log/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/app/mailers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/app/models/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/lib/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/dummy/app/helpers/pdf_helper.rb: -------------------------------------------------------------------------------- 1 | module PdfHelper 2 | end 3 | -------------------------------------------------------------------------------- /test/dummy/app/helpers/products_helper.rb: -------------------------------------------------------------------------------- 1 | module ProductsHelper 2 | end 3 | -------------------------------------------------------------------------------- /lib/prawn-rails/version.rb: -------------------------------------------------------------------------------- 1 | module PrawnRails 2 | VERSION = "0.1.1" 3 | end 4 | -------------------------------------------------------------------------------- /test/dummy/app/helpers/application_helper.rb: -------------------------------------------------------------------------------- 1 | module ApplicationHelper 2 | end 3 | -------------------------------------------------------------------------------- /test/dummy/app/models/product.rb: -------------------------------------------------------------------------------- 1 | class Product < ActiveRecord::Base 2 | end 3 | -------------------------------------------------------------------------------- /lib/prawn-rails.rb: -------------------------------------------------------------------------------- 1 | require "prawn-rails/config" 2 | require "prawn-rails/engine" 3 | 4 | module PrawnRails 5 | end 6 | -------------------------------------------------------------------------------- /test/dummy/app/views/pdf/render_pdf.html.erb: -------------------------------------------------------------------------------- 1 |

Pdf#render_pdf

2 |

Find me in app/views/pdf/render_pdf.html.erb

3 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/prawn-rails.rb: -------------------------------------------------------------------------------- 1 | PrawnRails.config do |config| 2 | config.page_layout = :landscape 3 | end 4 | 5 | -------------------------------------------------------------------------------- /test/dummy/test/unit/helpers/pdf_helper_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class PdfHelperTest < ActionView::TestCase 4 | end 5 | -------------------------------------------------------------------------------- /lib/tasks/prawn-rails_tasks.rake: -------------------------------------------------------------------------------- 1 | # desc "Explaining what the task does" 2 | # task :prawn-rails do 3 | # # Task goes here 4 | # end 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .bundle/ 2 | log/*.log 3 | pkg/ 4 | test/dummy/db/*.sqlite3 5 | test/dummy/log/*.log 6 | test/dummy/tmp/ 7 | Gemfile.lock 8 | vendor/ 9 | -------------------------------------------------------------------------------- /test/dummy/app/controllers/application_controller.rb: -------------------------------------------------------------------------------- 1 | class ApplicationController < ActionController::Base 2 | protect_from_forgery 3 | end 4 | -------------------------------------------------------------------------------- /test/dummy/app/assets/stylesheets/pdf.css: -------------------------------------------------------------------------------- 1 | /* 2 | Place all the styles related to the matching controller here. 3 | They will automatically be included in application.css. 4 | */ 5 | -------------------------------------------------------------------------------- /test/dummy/app/assets/stylesheets/products.css: -------------------------------------------------------------------------------- 1 | /* 2 | Place all the styles related to the matching controller here. 3 | They will automatically be included in application.css. 4 | */ 5 | -------------------------------------------------------------------------------- /test/dummy/config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require ::File.expand_path('../config/environment', __FILE__) 4 | run Dummy::Application 5 | -------------------------------------------------------------------------------- /test/dummy/app/assets/javascripts/pdf.js: -------------------------------------------------------------------------------- 1 | // Place all the behaviors and hooks related to the matching controller here. 2 | // All this logic will automatically be available in application.js. 3 | -------------------------------------------------------------------------------- /test/dummy/app/assets/javascripts/products.js: -------------------------------------------------------------------------------- 1 | // Place all the behaviors and hooks related to the matching controller here. 2 | // All this logic will automatically be available in application.js. 3 | -------------------------------------------------------------------------------- /test/dummy/config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the rails application 2 | require File.expand_path('../application', __FILE__) 3 | 4 | # Initialize the rails application 5 | Dummy::Application.initialize! 6 | -------------------------------------------------------------------------------- /lib/prawn-rails/renderer.rb: -------------------------------------------------------------------------------- 1 | require "prawn-rails/document" 2 | 3 | module PrawnRails 4 | class Renderer 5 | def self.call(template) 6 | template.source.strip 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /test/integration/navigation_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class NavigationTest < ActionDispatch::IntegrationTest 4 | fixtures :all 5 | 6 | # test "the truth" do 7 | # assert true 8 | # end 9 | end 10 | 11 | -------------------------------------------------------------------------------- /test/dummy/app/controllers/pdf_controller.rb: -------------------------------------------------------------------------------- 1 | class PdfController < ApplicationController 2 | 3 | def render_pdf 4 | @items=[{:name=> "Hello"},{:name=> "World"}] 5 | render "render_pdf.pdf.prawn" 6 | end 7 | 8 | 9 | 10 | end 11 | -------------------------------------------------------------------------------- /test/dummy/config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # Sample localization file for English. Add more files in this directory for other locales. 2 | # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. 3 | 4 | en: 5 | hello: "Hello world" 6 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | # Mime::Type.register_alias "text/html", :iphone 6 | -------------------------------------------------------------------------------- /test/dummy/config/boot.rb: -------------------------------------------------------------------------------- 1 | require 'rubygems' 2 | gemfile = File.expand_path('../../../../Gemfile', __FILE__) 3 | 4 | if File.exist?(gemfile) 5 | ENV['BUNDLE_GEMFILE'] = gemfile 6 | require 'bundler' 7 | Bundler.setup 8 | end 9 | 10 | $:.unshift File.expand_path('../../../../lib', __FILE__) -------------------------------------------------------------------------------- /test/dummy/Rakefile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env rake 2 | # Add your own tasks in files placed in lib/tasks ending in .rake, 3 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 4 | 5 | require File.expand_path('../config/application', __FILE__) 6 | 7 | Dummy::Application.load_tasks 8 | -------------------------------------------------------------------------------- /script/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | #!/usr/bin/env ruby 3 | # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. 4 | 5 | ENGINE_PATH = File.expand_path('../..', __FILE__) 6 | load File.expand_path('../../test/dummy/script/rails', __FILE__) 7 | -------------------------------------------------------------------------------- /test/prawn-rails_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | require "prawn-rails/extension" 3 | 4 | class PrawnRailsTest < ActiveSupport::TestCase 5 | include PrawnRails::Extension 6 | test "html_strip" do 7 | 8 | assert_nil(html_strip(nil)) 9 | assert_not_nil(html_strip("")) 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /test/dummy/app/views/layouts/application.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dummy 5 | <%= stylesheet_link_tag "application" %> 6 | <%= javascript_include_tag "application" %> 7 | <%= csrf_meta_tags %> 8 | 9 | 10 | 11 | <%= yield %> 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /test/dummy/script/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. 3 | 4 | APP_PATH = File.expand_path('../../config/application', __FILE__) 5 | require File.expand_path('../../config/boot', __FILE__) 6 | require 'rails/commands' 7 | -------------------------------------------------------------------------------- /test/test_helper.rb: -------------------------------------------------------------------------------- 1 | # Configure Rails Environment 2 | ENV["RAILS_ENV"] = "test" 3 | 4 | require File.expand_path("../dummy/config/environment.rb", __FILE__) 5 | require "rails/test_help" 6 | 7 | Rails.backtrace_cleaner.remove_silencers! 8 | 9 | # Load support files 10 | Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f } 11 | -------------------------------------------------------------------------------- /test/dummy/app/assets/stylesheets/application.css: -------------------------------------------------------------------------------- 1 | /* 2 | * This is a manifest file that'll automatically include all the stylesheets available in this directory 3 | * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at 4 | * the top of the compiled file, but it's generally better to create a new file per style scope. 5 | *= require_self 6 | *= require_tree . 7 | */ -------------------------------------------------------------------------------- /test/dummy/config/initializers/inflections.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new inflection rules using the following format 4 | # (all these examples are active by default): 5 | # ActiveSupport::Inflector.inflections do |inflect| 6 | # inflect.plural /^(ox)$/i, '\1en' 7 | # inflect.singular /^(ox)en/i, '\1' 8 | # inflect.irregular 'person', 'people' 9 | # inflect.uncountable %w( fish sheep ) 10 | # end 11 | -------------------------------------------------------------------------------- /lib/prawn-rails/config.rb: -------------------------------------------------------------------------------- 1 | require 'ostruct' 2 | 3 | module PrawnRails 4 | extend self 5 | 6 | @config = OpenStruct.new(:page_layout => :portrait, 7 | :page_size => "A4", 8 | :skip_page_creation => false) 9 | 10 | def config 11 | begin 12 | block_given? ? yield(@config) : @config 13 | rescue => e 14 | puts e 15 | puts e.backtrace 16 | end 17 | 18 | end 19 | 20 | end 21 | 22 | 23 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/backtrace_silencers.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. 4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } 5 | 6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. 7 | # Rails.backtrace_cleaner.remove_silencers! 8 | -------------------------------------------------------------------------------- /lib/prawn-rails/engine.rb: -------------------------------------------------------------------------------- 1 | require "prawn" 2 | require "prawn-rails/rails_helper" 3 | require "prawn-rails/renderer" 4 | 5 | module PrawnRails 6 | class Engine < Rails::Engine 7 | ActionView::Base.send(:include, PrawnRails::RailsHelper) 8 | ActionView::Template.register_template_handler(:prawn, PrawnRails::Renderer) 9 | 10 | if !Mime::Type.lookup_by_extension(:pdf) 11 | Mime::Type.register_alias("application/pdf", :pdf) 12 | end 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Dummy::Application.config.session_store :cookie_store, :key => '_dummy_session' 4 | 5 | # Use the database for sessions instead of the cookie-based default, 6 | # which shouldn't be used to store highly confidential information 7 | # (create the session table with "rails generate session_migration") 8 | # Dummy::Application.config.session_store :active_record_store 9 | -------------------------------------------------------------------------------- /test/dummy/app/assets/javascripts/application.js: -------------------------------------------------------------------------------- 1 | // This is a manifest file that'll be compiled into including all the files listed below. 2 | // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically 3 | // be included in the compiled file accessible from http://example.com/assets/application.js 4 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the 5 | // the compiled file. 6 | // 7 | //= require jquery 8 | //= require jquery_ujs 9 | //= require_tree . 10 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/secret_token.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Your secret key for verifying the integrity of signed cookies. 4 | # If you change this key, all old signed cookies will become invalid! 5 | # Make sure the secret is at least 30 characters and all random, 6 | # no regular words or you'll be exposed to dictionary attacks. 7 | Dummy::Application.config.secret_token = '4f337f0063fbb4a724dd8da15419679300da990ae4f6c94d36c714a3cd07e9653fc42d902cf33a9b9449a28e7eb2673f928172d65a090fa3c9156d6beea8d16c' 8 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/wrap_parameters.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | # 3 | # This file contains settings for ActionController::ParamsWrapper which 4 | # is enabled by default. 5 | 6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. 7 | ActiveSupport.on_load(:action_controller) do 8 | wrap_parameters :format => [:json] 9 | end 10 | 11 | # Disable root element in JSON by default. 12 | ActiveSupport.on_load(:active_record) do 13 | self.include_root_in_json = false 14 | end 15 | -------------------------------------------------------------------------------- /lib/prawn-rails/rails_helper.rb: -------------------------------------------------------------------------------- 1 | require 'prawn-rails/document' 2 | 3 | module PrawnRails 4 | module RailsHelper 5 | def prawn_document(options={}) 6 | options.reverse_merge!(:page_layout => PrawnRails.config.page_layout, 7 | :page_size => PrawnRails.config.page_size) 8 | 9 | options.reverse_merge!(:skip_page_creation => true) if PrawnRails.config.skip_page_creation 10 | 11 | pdf = PrawnRails::Document.new(options) 12 | 13 | yield pdf if block_given? 14 | 15 | pdf.render 16 | end 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "http://rubygems.org" 2 | 3 | # Declare your gem's dependencies in prawn-rails.gemspec. 4 | # Bundler will treat runtime dependencies like base dependencies, and 5 | # development dependencies will be added by default to the :development group. 6 | gemspec 7 | 8 | # jquery-rails is used by the dummy application 9 | gem "jquery-rails" 10 | gem "prawn" 11 | 12 | 13 | # Declare any dependencies that are still in development here instead of in 14 | # your gemspec. These might include edge Rails or gems from your path or 15 | # Git. Remember to move these dependencies to your gemspec before releasing 16 | # your gem to rubygems.org. 17 | 18 | # To use debugger 19 | # gem 'ruby-debug' 20 | -------------------------------------------------------------------------------- /test/dummy/config/database.yml: -------------------------------------------------------------------------------- 1 | # SQLite version 3.x 2 | # gem install sqlite3 3 | # 4 | # Ensure the SQLite 3 gem is defined in your Gemfile 5 | # gem 'sqlite3' 6 | development: 7 | adapter: sqlite3 8 | database: db/development.sqlite3 9 | pool: 5 10 | timeout: 5000 11 | 12 | # Warning: The database defined as "test" will be erased and 13 | # re-generated from your development database when you run "rake". 14 | # Do not set this db to the same as development or production. 15 | test: 16 | adapter: sqlite3 17 | database: db/test.sqlite3 18 | pool: 5 19 | timeout: 5000 20 | 21 | production: 22 | adapter: sqlite3 23 | database: db/production.sqlite3 24 | pool: 5 25 | timeout: 5000 26 | -------------------------------------------------------------------------------- /test/dummy/test/functional/pdf_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | require 'pdf/reader' 3 | 4 | class PdfControllerTest < ActionController::TestCase 5 | test "should get a pdf" do 6 | get :render_pdf 7 | assert_response :success 8 | reader = PDF::Reader.new(StringIO.new(@response.body)) 9 | assert_not_nil(reader) 10 | #do some basic assertions 11 | assert_equal(1, reader.page_count) 12 | assert_match(/Hello There :D/, reader.pages[0].to_s) 13 | assert_no_match(/This should not be any where/, reader.pages[0].to_s) 14 | assert_no_match(/ITEMS ARE nil/, reader.pages[0].to_s) 15 | assert_match(/with html<\/bold>/,reader.pages[0].to_s) 16 | assert_match(/without html LD/,reader.pages[0].to_s) 17 | end 18 | 19 | 20 | 21 | end 22 | -------------------------------------------------------------------------------- /test/dummy/public/422.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The change you wanted was rejected (422) 5 | 17 | 18 | 19 | 20 | 21 |
22 |

The change you wanted was rejected.

23 |

Maybe you tried to change something you didn't have access to.

24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /test/dummy/public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The page you were looking for doesn't exist (404) 5 | 17 | 18 | 19 | 20 | 21 |
22 |

The page you were looking for doesn't exist.

23 |

You may have mistyped the address or the page may have moved.

24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /test/dummy/public/500.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | We're sorry, but something went wrong (500) 5 | 17 | 18 | 19 | 20 | 21 |
22 |

We're sorry, but something went wrong.

23 |

We've been notified about this issue and we'll take a look at it shortly.

24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env rake 2 | begin 3 | require 'bundler/setup' 4 | rescue LoadError 5 | puts 'You must `gem install bundler` and `bundle install` to run rake tasks' 6 | end 7 | begin 8 | require 'rdoc/task' 9 | rescue LoadError 10 | require 'rdoc/rdoc' 11 | require 'rake/rdoctask' 12 | RDoc::Task = Rake::RDocTask 13 | end 14 | 15 | RDoc::Task.new(:rdoc) do |rdoc| 16 | rdoc.rdoc_dir = 'rdoc' 17 | rdoc.title = 'PrawnRails' 18 | rdoc.options << '--line-numbers' 19 | rdoc.rdoc_files.include('README.rdoc') 20 | rdoc.rdoc_files.include('lib/**/*.rb') 21 | end 22 | 23 | APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__) 24 | load 'rails/tasks/engine.rake' 25 | 26 | 27 | Bundler::GemHelper.install_tasks 28 | 29 | require 'rake/testtask' 30 | 31 | Rake::TestTask.new(:test) do |t| 32 | t.libs << 'lib' 33 | t.libs << 'test' 34 | t.pattern = 'test/**/*_test.rb' 35 | t.verbose = false 36 | end 37 | 38 | 39 | task :default => :test 40 | -------------------------------------------------------------------------------- /prawn-rails.gemspec: -------------------------------------------------------------------------------- 1 | $:.push File.expand_path("../lib", __FILE__) 2 | 3 | # Maintain your gem's version: 4 | require "prawn-rails/version" 5 | 6 | # Describe your gem and declare its dependencies: 7 | Gem::Specification.new do |s| 8 | s.name = "prawn-rails" 9 | s.version = PrawnRails::VERSION 10 | s.authors = ["Carlos Ortiz"] 11 | s.email = ["chrono.dark@gmail.com"] 12 | s.homepage = "https://github.com/cortiz/prawn-rails" 13 | s.summary = "Prawn Handler for RoR 3.x/4.x projects" 14 | s.description = "Prawn Handler for RoR 3.x/4.x projects handles and registers pdf formats" 15 | 16 | s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.markdown"] 17 | s.test_files = Dir["test/**/*"] 18 | 19 | s.add_dependency "prawn" 20 | s.add_dependency "prawn-table" 21 | s.add_dependency "rails", ">= 3.1.0" 22 | s.add_development_dependency "sqlite3" 23 | s.add_development_dependency "pdf-reader" 24 | end 25 | -------------------------------------------------------------------------------- /test/dummy/db/schema.rb: -------------------------------------------------------------------------------- 1 | # This file is auto-generated from the current state of the database. Instead 2 | # of editing this file, please use the migrations feature of Active Record to 3 | # incrementally modify your database, and then regenerate this schema definition. 4 | # 5 | # Note that this schema.rb definition is the authoritative source for your 6 | # database schema. If you need to create the application database on another 7 | # system, you should be using db:schema:load, not running all the migrations 8 | # from scratch. The latter is a flawed and unsustainable approach (the more migrations 9 | # you'll amass, the slower it'll run and the greater likelihood for issues). 10 | # 11 | # It's strongly recommended to check this file into your version control system. 12 | 13 | ActiveRecord::Schema.define(:version => 20120221152352) do 14 | 15 | create_table "products", :force => true do |t| 16 | t.string "name" 17 | t.decimal "price" 18 | t.datetime "created_at" 19 | t.datetime "updated_at" 20 | end 21 | 22 | end 23 | -------------------------------------------------------------------------------- /MIT-LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2012 YOURNAME 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /test/dummy/app/assets/stylesheets/scaffold.css: -------------------------------------------------------------------------------- 1 | body { background-color: #fff; color: #333; } 2 | 3 | body, p, ol, ul, td { 4 | font-family: verdana, arial, helvetica, sans-serif; 5 | font-size: 13px; 6 | line-height: 18px; 7 | } 8 | 9 | pre { 10 | background-color: #eee; 11 | padding: 10px; 12 | font-size: 11px; 13 | } 14 | 15 | a { color: #000; } 16 | a:visited { color: #666; } 17 | a:hover { color: #fff; background-color:#000; } 18 | 19 | div.field, div.actions { 20 | margin-bottom: 10px; 21 | } 22 | 23 | #notice { 24 | color: green; 25 | } 26 | 27 | .field_with_errors { 28 | padding: 2px; 29 | background-color: red; 30 | display: table; 31 | } 32 | 33 | #error_explanation { 34 | width: 450px; 35 | border: 2px solid red; 36 | padding: 7px; 37 | padding-bottom: 0; 38 | margin-bottom: 20px; 39 | background-color: #f0f0f0; 40 | } 41 | 42 | #error_explanation h2 { 43 | text-align: left; 44 | font-weight: bold; 45 | padding: 5px 5px 5px 15px; 46 | font-size: 12px; 47 | margin: -7px; 48 | margin-bottom: 0px; 49 | background-color: #c00; 50 | color: #fff; 51 | } 52 | 53 | #error_explanation ul li { 54 | font-size: 12px; 55 | list-style: square; 56 | } 57 | -------------------------------------------------------------------------------- /lib/prawn-rails/document.rb: -------------------------------------------------------------------------------- 1 | require 'prawn' 2 | require 'prawn/table' 3 | require "prawn-rails/extension" 4 | 5 | module PrawnRails 6 | # This derives from Prawn::Document in order to override defaults. Note 7 | # that the Prawn::Document behaviour itself shouldn't be changed. 8 | class Document < Prawn::Document 9 | def initialize(opts = {}) 10 | if PrawnRails.config.respond_to?(:to_h) 11 | default = PrawnRails.config.to_h.merge(opts) 12 | else 13 | default = PrawnRails.config.marshal_dump.merge(opts) 14 | end 15 | super(default) 16 | end 17 | 18 | # Typicall text expects a string. But rails views have this interesting 19 | # concept that they implicitly call `to_s` on all the variables before 20 | # rendering. So, passing an integer to text fails: 21 | # 22 | # pdf.text 10 #=> fails because 10 is not a string 23 | # pdf.text 10.to_s #=> works 24 | # 25 | # To circumvent this situation, we call to_s on value, and delegate 26 | # action to actual Prawn::Document. 27 | def text(value, options = {}) 28 | super(value.to_s, options) 29 | end 30 | end 31 | 32 | Document.extensions << Extension 33 | end 34 | -------------------------------------------------------------------------------- /test/dummy/config/environments/development.rb: -------------------------------------------------------------------------------- 1 | Dummy::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb 3 | 4 | # In the development environment your application's code is reloaded on 5 | # every request. This slows down response time but is perfect for development 6 | # since you don't have to restart the web server when you make code changes. 7 | config.cache_classes = false 8 | 9 | # Log error messages when you accidentally call methods on nil. 10 | config.whiny_nils = true 11 | 12 | # Show full error reports and disable caching 13 | config.consider_all_requests_local = true 14 | config.action_controller.perform_caching = false 15 | 16 | # Don't care if the mailer can't send 17 | config.action_mailer.raise_delivery_errors = false 18 | 19 | # Print deprecation notices to the Rails logger 20 | config.active_support.deprecation = :log 21 | 22 | # Only use best-standards-support built into browsers 23 | config.action_dispatch.best_standards_support = :builtin 24 | 25 | # Do not compress assets 26 | config.assets.compress = false 27 | 28 | # Expands the lines which load the assets 29 | config.assets.debug = true 30 | end 31 | -------------------------------------------------------------------------------- /test/dummy/app/views/pdf/render_pdf.pdf.prawn: -------------------------------------------------------------------------------- 1 | prawn_document do |pdf| 2 | pdf.text "Hello There :D" 3 | pdf.text "now it is here: #{pdf.cursor}" 4 | pdf.text "ITems are #{@items.inspect}" 5 | pdf.font("Courier") do 6 | pdf.text "Written in Courier because we are inside the block." 7 | end 8 | 9 | pdf.text "with html" 10 | pdf.text pdf.html_strip("without html LD") 11 | pdf.text "Let's see which is the current font_size: #{pdf.font_size.inspect}" 12 | pdf.move_down 10 13 | pdf.font_size 16 14 | pdf.text "Yeah, something bigger!" 15 | pdf.move_down 10 16 | pdf.font_size(25) { pdf.text "Even bigger!" } 17 | pdf.move_down 10 18 | pdf.text "Back to 16 again." 19 | pdf.move_down 10 20 | pdf.text "Single line on 20 using the :size option.", :size => 20 21 | pdf.move_down 10 22 | pdf.text "Back to 16 once more." 23 | pdf.move_down 10 24 | pdf.font("Courier", :size => 10) do 25 | pdf.text "Yeah, using Courier 10 courtesy of the font method." 26 | end 27 | pdf.font("Helvetica", :size => 12) # back to normal 28 | 29 | pdf.text "Default color is black" 30 | pdf.move_down 25 31 | pdf.text "Changed to red", :color => "FF0000" 32 | pdf.move_down 25 33 | pdf.text "CMYK color", :color => [22, 55, 79, 30] 34 | pdf.move_down 25 35 | pdf.text "Also works with inline formatting", :color => "0000FF", :inline_format => true 36 | end 37 | -------------------------------------------------------------------------------- /lib/prawn-rails/extension.rb: -------------------------------------------------------------------------------- 1 | module PrawnRails 2 | module Extension 3 | ## 4 | # Removes all html tags from the string 5 | # @param html[String] string to remove the tags 6 | # @return [String] the string with out the tags 7 | ## 8 | def html_strip html 9 | return html if html.nil? 10 | html 11 | text = html. 12 | gsub(/( |\n|\s)+/im, ' ').squeeze(' ').strip. 13 | gsub(/<([^\s]+)[^>]*(src|href)=\s*(.?)([^>\s]*)\3[^>]*>\4<\/\1>/i, 14 | '\4') 15 | 16 | links = [] 17 | linkregex = /<[^>]*(src|href)=\s*(.?)([^>\s]*)\2[^>]*>\s*/i 18 | while linkregex.match(text) 19 | links << $~[3] 20 | text.sub!(linkregex, "[#{links.size}]") 21 | end 22 | 23 | text = CGI.unescapeHTML( 24 | text. 25 | gsub(/<(script|style)[^>]*>.*<\/\1>/im, ''). 26 | gsub(//m, ''). 27 | gsub(/]*)>/i, "___\n"). 28 | gsub(/]*)>/i, "\n* "). 29 | gsub(/]*)>/i, '> '). 30 | gsub(/<(br)(| [^>]*)>/i, "\n"). 31 | gsub(/<(\/h[\d]+|p)(| [^>]*)>/i, "\n\n"). 32 | gsub(/<[^>]*>/, '') 33 | ).lstrip.gsub(/\n[ ]+/, "\n") + "\n" 34 | 35 | for i in (0...links.size).to_a 36 | text = text + "\n [#{i+1}] <#{CGI.unescapeHTML(links[i])}>" unless 37 | links[i].nil? 38 | end 39 | links = nil 40 | text 41 | end 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /test/dummy/config/environments/test.rb: -------------------------------------------------------------------------------- 1 | Dummy::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb 3 | 4 | # The test environment is used exclusively to run your application's 5 | # test suite. You never need to work with it otherwise. Remember that 6 | # your test database is "scratch space" for the test suite and is wiped 7 | # and recreated between test runs. Don't rely on the data there! 8 | config.cache_classes = true 9 | 10 | # Configure static asset server for tests with Cache-Control for performance 11 | config.serve_static_assets = true 12 | config.static_cache_control = "public, max-age=3600" 13 | 14 | # Log error messages when you accidentally call methods on nil 15 | config.whiny_nils = true 16 | 17 | # Show full error reports and disable caching 18 | config.consider_all_requests_local = true 19 | config.action_controller.perform_caching = false 20 | 21 | # Raise exceptions instead of rendering exception templates 22 | config.action_dispatch.show_exceptions = false 23 | 24 | # Disable request forgery protection in test environment 25 | config.action_controller.allow_forgery_protection = false 26 | 27 | # Tell Action Mailer not to deliver emails to the real world. 28 | # The :test delivery method accumulates sent emails in the 29 | # ActionMailer::Base.deliveries array. 30 | config.action_mailer.delivery_method = :test 31 | 32 | # Use SQL instead of Active Record's schema dumper when creating the test database. 33 | # This is necessary if your schema can't be completely dumped by the schema dumper, 34 | # like if you have constraints or database-specific column types 35 | # config.active_record.schema_format = :sql 36 | 37 | # Print deprecation notices to the stderr 38 | config.active_support.deprecation = :stderr 39 | end 40 | -------------------------------------------------------------------------------- /test/dummy/config/application.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../boot', __FILE__) 2 | 3 | require 'rails/all' 4 | 5 | Bundler.require 6 | require "prawn-rails" 7 | 8 | module Dummy 9 | class Application < Rails::Application 10 | # Settings in config/environments/* take precedence over those specified here. 11 | # Application configuration should go into files in config/initializers 12 | # -- all .rb files in that directory are automatically loaded. 13 | 14 | # Custom directories with classes and modules you want to be autoloadable. 15 | # config.autoload_paths += %W(#{config.root}/extras) 16 | 17 | # Only load the plugins named here, in the order given (default is alphabetical). 18 | # :all can be used as a placeholder for all plugins not explicitly named. 19 | # config.plugins = [ :exception_notification, :ssl_requirement, :all ] 20 | 21 | # Activate observers that should always be running. 22 | # config.active_record.observers = :cacher, :garbage_collector, :forum_observer 23 | 24 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 25 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. 26 | # config.time_zone = 'Central Time (US & Canada)' 27 | 28 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. 29 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] 30 | # config.i18n.default_locale = :de 31 | 32 | # Configure the default encoding used in templates for Ruby 1.9. 33 | config.encoding = "utf-8" 34 | 35 | # Configure sensitive parameters which will be filtered from the log file. 36 | config.filter_parameters += [:password] 37 | 38 | # Enable the asset pipeline 39 | config.assets.enabled = true 40 | 41 | # Version of your assets, change this if you want to expire all your assets 42 | config.assets.version = '1.0' 43 | end 44 | end 45 | 46 | -------------------------------------------------------------------------------- /test/dummy/config/routes.rb: -------------------------------------------------------------------------------- 1 | Dummy::Application.routes.draw do 2 | resources :products 3 | 4 | get "pdf/render_pdf" 5 | 6 | # The priority is based upon order of creation: 7 | # first created -> highest priority. 8 | 9 | # Sample of regular route: 10 | # match 'products/:id' => 'catalog#view' 11 | # Keep in mind you can assign values other than :controller and :action 12 | 13 | # Sample of named route: 14 | # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase 15 | # This route can be invoked with purchase_url(:id => product.id) 16 | 17 | # Sample resource route (maps HTTP verbs to controller actions automatically): 18 | # resources :products 19 | 20 | # Sample resource route with options: 21 | # resources :products do 22 | # member do 23 | # get 'short' 24 | # post 'toggle' 25 | # end 26 | # 27 | # collection do 28 | # get 'sold' 29 | # end 30 | # end 31 | 32 | # Sample resource route with sub-resources: 33 | # resources :products do 34 | # resources :comments, :sales 35 | # resource :seller 36 | # end 37 | 38 | # Sample resource route with more complex sub-resources 39 | # resources :products do 40 | # resources :comments 41 | # resources :sales do 42 | # get 'recent', :on => :collection 43 | # end 44 | # end 45 | 46 | # Sample resource route within a namespace: 47 | # namespace :admin do 48 | # # Directs /admin/products/* to Admin::ProductsController 49 | # # (app/controllers/admin/products_controller.rb) 50 | # resources :products 51 | # end 52 | 53 | # You can have the root of your site routed with "root" 54 | # just remember to delete public/index.html. 55 | # root :to => 'welcome#index' 56 | 57 | # See how all your routes lay out with "rake routes" 58 | 59 | # This is a legacy wild controller route that's not recommended for RESTful applications. 60 | # Note: This route will make all actions in every controller accessible via GET requests. 61 | # match ':controller(/:action(/:id(.:format)))' 62 | end 63 | -------------------------------------------------------------------------------- /test/dummy/config/environments/production.rb: -------------------------------------------------------------------------------- 1 | Dummy::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb 3 | 4 | # Code is not reloaded between requests 5 | config.cache_classes = true 6 | 7 | # Full error reports are disabled and caching is turned on 8 | config.consider_all_requests_local = false 9 | config.action_controller.perform_caching = true 10 | 11 | # Disable Rails's static asset server (Apache or nginx will already do this) 12 | config.serve_static_assets = false 13 | 14 | # Compress JavaScripts and CSS 15 | config.assets.compress = true 16 | 17 | # Don't fallback to assets pipeline if a precompiled asset is missed 18 | config.assets.compile = false 19 | 20 | # Generate digests for assets URLs 21 | config.assets.digest = true 22 | 23 | # Defaults to Rails.root.join("public/assets") 24 | # config.assets.manifest = YOUR_PATH 25 | 26 | # Specifies the header that your server uses for sending files 27 | # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache 28 | # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx 29 | 30 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 31 | # config.force_ssl = true 32 | 33 | # See everything in the log (default is :info) 34 | # config.log_level = :debug 35 | 36 | # Use a different logger for distributed setups 37 | # config.logger = SyslogLogger.new 38 | 39 | # Use a different cache store in production 40 | # config.cache_store = :mem_cache_store 41 | 42 | # Enable serving of images, stylesheets, and JavaScripts from an asset server 43 | # config.action_controller.asset_host = "http://assets.example.com" 44 | 45 | # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added) 46 | # config.assets.precompile += %w( search.js ) 47 | 48 | # Disable delivery errors, bad email addresses will be ignored 49 | # config.action_mailer.raise_delivery_errors = false 50 | 51 | # Enable threaded mode 52 | # config.threadsafe! 53 | 54 | # Enable locale fallbacks for I18n (makes lookups for any locale fall back to 55 | # the I18n.default_locale when a translation can not be found) 56 | config.i18n.fallbacks = true 57 | 58 | # Send deprecation notices to registered listeners 59 | config.active_support.deprecation = :notify 60 | end 61 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | # Prawn-Rails [![Gem Version](https://badge.fury.io/rb/prawn-rails.svg)](http://badge.fury.io/rb/prawn-rails) 2 | 3 | ## Dependencies 4 | 5 | * prawn > 0.0.12 6 | * prawn-table 7 | * Rails 3.0x 8 | * Ruby > 1.8.7 9 | 10 | ## Install 11 | 1.Add to the Rails Gemfile 12 | 13 | gem 'prawn-rails' 14 | 15 | to the Rails Gemfile 16 | `prawn` and `prawn-table` is a dependency so no need to mention it in the projects Gemfile 17 | but can mention a specific version if your Gemfile, if you want 18 | 19 | ## Usage 20 | Create a view with `pdf` as format and `prawn` as handler 21 | so filename should look like `example.pdf.prawn` 22 | 23 | we provide a helper called `prawn_document` 24 | it builds a PrawnRails::Document with default options. Can override with `page_size` and `page_layout` 25 | example contents of `example.pdf.prawn` 26 | 27 | prawn_document(:page_layout => :landscape) do |pdf| 28 | pdf.text "Hello World" 29 | end 30 | 31 | No need to call `pdf.render`, it is called by `prawn_document` 32 | 33 | Your available to use all prawn document methods like `pdf.text` `pdf.font_size` and also 34 | block like `pdf.font(FONT_NAME,opts) do 35 | pdf.XXXX 36 | end` 37 | 38 | For more documentation go to [the manual](http://prawnpdf.org/manual.pdf) 39 | 40 | ### Build in helpers 41 | * *html_strip(html)* 42 | Removes the html tags from a string 43 | 44 | ### Default configuration 45 | 46 | Add a `prawn-rails.rb` config to your Rails app under `config/initializers` like this 47 | 48 | PrawnRails.config do |config| 49 | config.page_layout = :portrait 50 | config.page_size = "A4" 51 | config.skip_page_creation = false 52 | end 53 | 54 | by default `page_layout` is portrait and `page_size` is "A4" 55 | also `skip_page_creation` is set to false by default, if it is set to true 56 | then have to create the first page yourself for eg. 57 | 58 | pdf.start_new_page size: "A4", page_layout: :landscape 59 | 60 | ## Examples 61 | 62 | 1. **Hello World** 63 | 64 | **hello.pdf.prawn** 65 | 66 | pdf.text hello world 67 | 68 | 2. ** Using Active Record ** 69 | 70 | **myproducts.pdf.prawn** 71 | 72 | pdf.text "Current Products are" 73 | pdf.move_down 20 74 | pdf.table(@products.collect{ |p| [p.name,p.price]}) 75 | 76 | 77 | ## ToDos 78 | 79 | 1. Add per-render Configuration 80 | 2. Simple Html to PDF ? 81 | 3. Any Other requested 82 | 83 | ## thx to 84 | @rwilliams 85 | @sigmike 86 | @smber1 87 | @iffyuva 88 | 89 | ## Dev Notes 90 | Gem works with any rails 3.0 version and ruby but for development It should be atlest Rails 3.1 (for the testing env) 91 | I'll try to fix that 92 | --------------------------------------------------------------------------------