Вопрос

Я прочитал все релевантные посты на креветке, но не упомянул не упоминание (даже в собственной документации креветок) заголовков и нижних колонтитулов.

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

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

Часть концерна:

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

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

  text "hello world!"
end

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

Спасибо!

Это было полезно?

Решение

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

Вы также можете использовать число_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

Другие советы

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

Поскольку я также нужен заголовок и нижний колонтитул, я немного посмотрел в это. Похоже, что эта версия кревета имела методы заголовка и нижнего колонтитула, которые были реализованы с использованием ленивой ограничительной коробки. (Найдено путем проверки кода на 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's 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's 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

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

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

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

Если вы хотите, чтобы нижний колонтитул, который не пишет вещи по тексту, вы должны создать 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

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

Начать редактировать

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

Конец редактирования

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

 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

Единственный способ, которым я нашел, чтобы получить повторяющийся элемент на странице, это использовать 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

конец

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

Вот проблема при использовании bounding_box Для создания пользовательского содержимого нижнего колонтитула ... он все еще рендеринг в границах поля.

Я искал то, что напишет содержимое В маржинальном районе вместе с number_pages, (Потому что нижний колонтитул обычно устанавливается в нижней части маржировки) ... И кажется, что их нет.

так вместо этого я использовал text_box и поместите координаты за пределами моей главной границы, как так:

repeat :all do
      text_box "My custom footer", size: 7, align: :center, :at => [bounds.left, bounds.bottom], :height => 100, :width => bounds.width
end

Обратите внимание, что repeat :all сделает этот нижний колонтитул текстом на каждую страницу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top