Подтвердить что ты не робот

Верхний и нижний колонтитулы в Prawn PDF

Я прочитал все соответствующие сообщения о Кревете, но не нашел упоминания (даже в собственной документации Прайна) верхних и нижних колонтитулов.

Тем не менее, я видел демо на собственном веб-сайте Prawnto о верхних и нижних колонтитулах. Я скопировал весь источник этой демонстрации только для того, чтобы увидеть, работает ли она, но об ошибке "заголовок" метода undefined жалуется. Должен ли я понять, что в последнее время в эпоху драгоценности креветка подняла верхний и нижний колонтитулы, или есть что-то еще, что мне нужно сделать сначала, чтобы использовать верхний и нижний колонтитулы?

Демо-страница: http://cracklabs.com/prawnto/code/prawn_demos/source/text/flowing_text_with_header_and_footer

часть кода, вызывающего озабоченность:

Prawn::Document.generate("flow_with_headers_and_footers.pdf")  do

  header margin_box.top_left do 
      text "Here My Fancy Header", :size => 25, :align => :center   
  end   

  text "hello world!"
end

И по заголовку, на всякий случай, я имею в виду фрагменты слов, которые обычно появляются в углу каждой страницы документа. Как ваш номер счета на страницах ваших счетов.

спасибо!

4b9b3361

Ответ 1

@GrantSayer спасибо для примера, но это позволит вам показывать текущий номер страницы, а не общее количество страниц.

Вы также можете использовать функцию number_pages для нижнего колонтитула:

Prawn::Document.generate("page_with_numbering.pdf") do
  text "Hai"
  start_new_page
  text "bai"
  start_new_page
  text "-- Hai again"
  number_pages "<page> in a total of <total>", [bounds.right - 50, 0]
end

Однако, в моем случае мне также нужно форматировать/стилизовать и выравнивать номера страниц в соответствии с руководствами по стилю. Я использовал go_to_page (k) для создания собственных функций верхнего и нижнего колонтитула, которые добавляют верхний и нижний колонтитулы на каждую страницу после создаются все страницы. Это дает мне как варианты стилизации, так и общее количество страниц:

Prawn::Document.generate("footer_example.pdf", :skip_page_creation => true) do
  10.times do
    start_new_page
    text "Some filler text for the page"
  end

  # footer
  page_count.times do |i|
    go_to_page(i+1)
    lazy_bounding_box([bounds.right-50, bounds.bottom + 25], :width => 50) {
      text "#{i+1} / #{page_count}"
    }.draw
  end
end

Ответ 2

Образец, на который вы ссылаетесь, из плагина prawnto использует более старую версию креветок.

Так как мне также нужен верхний и нижний колонтитул, я смотрел немного больше на это. Похоже, что у этой версии креветок были методы заголовка и нижнего колонтитула, которые были реализованы с использованием ленивой ограничивающей рамки. (определяется путем проверки кода на github)

В новой версии креветок вы можете сделать то же самое с помощью повторителей.

Вот полный образец, переписанный с использованием новой версии:

require "#{File.dirname(__FILE__)}/../example_helper.rb"

Prawn::Document.generate("test.pdf")  do

   repeat :all do
    # header
    bounding_box [bounds.left, bounds.top], :width  => bounds.width do
        font "Helvetica"
        text "Here My Fancy Header", :align => :center, :size => 25
        stroke_horizontal_rule
    end

    # footer
    bounding_box [bounds.left, bounds.bottom + 25], :width  => bounds.width do
        font "Helvetica"
        stroke_horizontal_rule
        move_down(5)
        text "And here a sexy footer", :size => 16
    end
  end

  bounding_box([bounds.left, bounds.top - 50], :width  => bounds.width, :height => bounds.height - 100) do                 
   text "this is some flowing text " * 200    

   move_down(20)

   font "#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf"
   table [["ὕαλον ϕαγεῖν",    "baaar",             "1" ],
          ["This is","a sample",          "2" ],
          ["Table",  "dont\ncha\nknow?",  "3" ],
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules\nwith an iron fist", "x" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],   
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ],  
          [ "It",    "Rules",             "4" ],     
          [ "It",    "Rules",             "4" ]],     

     :font_size          => 24, 
     :horizontal_padding => 10,
     :vertical_padding   => 3,
     :border_width       => 2,
     :position           => :center,
     :headers            => ["Column A","Column B","#"]

  end
end

вы можете проверить страницу документации повтора для других параметров, которые позволяют точно указать, где вы хотите повторители.

Ответ 3

Это немного отличается от последней версии креветки, вы должны обработать хеш

Prawn::Document.generate("page_with_numbering.pdf") do
  text "Hai"
  start_new_page
  text "bai"
  start_new_page
  text "-- Hai again"
  number_pages "<page> in a total of <total>", { :start_count_at => 0, :page_filter => :all, :at => [bounds.right - 50, 0], :align => :right, :size => 14 }
end

Ответ 4

Если вы хотите, чтобы нижний колонтитул не записывал текст поверх вашего текста, вы должны создать bounding_box ниже поля документа с помощью bounds.bottom.

require 'prawn'

file_name = 'hello.pdf'
random_table = (0..50).map{|i|[*('a'..'z')]} # generate a 2D array for example (~2 pages)

Prawn::Document::generate(file_name) do |pdf|
    pdf.table random_table
    pdf.page_count.times do |i|
        pdf.bounding_box([pdf.bounds.left, pdf.bounds.bottom], :width => pdf.bounds.width, :height => 30) {
        # for each page, count the page number and write it
        pdf.go_to_page i+1
             pdf.move_down 5 # move below the document margin
             pdf.text "#{i+1}/#{pdf.page_count}", :align => :center # write the page number and the total page count
        }
    end
end

Это должно выглядеть так, вы можете видеть, что нижний колонтитул находится за пределами поля:

example result

Надеюсь, что это поможет кому-то

Ответ 5

СТАРТ РЕДАКТИРОВАТЬ

Это работает в креветке >= 0,12

END EDIT

Вот мое решение, использующее повтор, холст и ячейку. По сути, я рисую свои ограничивающие прямоугольники в абсолютном верхнем и нижнем углу каждой страницы. Я использую ячейку, чтобы лучше управлять стилем. Надеюсь, это будет полезно кому-то. (Я использовал слегка раздражающие цвета, чтобы лучше проиллюстрировать, как вы можете управлять стилем верхнего и нижнего колонтитула)

 Prawn::Document.generate("headers_and_footers_with_background.pdf") do
  repeat :all do
    # header
    canvas do
      bounding_box([bounds.left, bounds.top], :width => bounds.width) do
        cell :content => 'Header',
             :background_color => 'EEEEEE',
             :width => bounds.width,
             :height => 50,
             :align => :center,
             :text_color => "001B76",
             :borders => [:bottom],
             :border_width => 2,
             :border_color => '00FF00',
             :padding => 12
      end
    end
    # footer
    canvas do
      bounding_box [bounds.left, bounds.bottom + 50], :width  => bounds.width do
        cell :content => 'Footer',
             :background_color => '333333',
             :width => bounds.width,
             :height => 50,
             :align => :center,
             :text_color => "FFFFFF",
             :borders => [:top],
             :border_width => 2,
             :border_color => 'FF0000',
             :padding => 12
      end
    end
  end
  # body
  bounding_box([bounds.left, bounds.top - 25], :width  => bounds.width, :height => bounds.height - 50) do
    100.times do
      text "Some filler text for the page"
    end
  end
end

Ответ 6

Единственный способ найти повторяющийся элемент на странице - использовать метод Prawn::Document::LazyBoundingBox. В основном это позволяет вам определить ограничивающий прямоугольник, который отображается только после его вызова. Таким образом, обычные шаги pseudo-code:

1. Define lazy bounding box element assign to somevar
2. One each new page call the element.

Пример из источника показывает, как

file = "lazy_bounding_boxes.pdf"
Prawn::Document.generate(file, :skip_page_creation => true) do
  point = [bounds.right-50, bounds.bottom + 25]
  page_counter = lazy_bounding_box(point, :width => 50) do
  text "Page: #{page_count}"
end 

10.times do
  start_new_page
  text "Some filler text for the page"  
  page_counter.draw
end

конец

Это дает вам вывод текста страницы-счетчика на каждой новой странице. Идеально было бы, если бы это можно было применить при настройке шаблона страницы, который повторно используется без ручного вызова для визуализации элемента. В сочетании с текстовым потоком это даст традиционное решение верхних и нижних колонтитулов.