├── 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 |
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 |Maybe you tried to change something you didn't have access to.
24 |You may have mistyped the address or the page may have moved.
24 |We've been notified about this issue and we'll take a look at it shortly.
24 |]*)>/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 [](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 | --------------------------------------------------------------------------------