2010-04-22 38 views
28

Tôi đã đọc qua tất cả các bài đăng có liên quan trên Prawn nhưng không đề cập đến (ngay cả trong tài liệu của Prawn) về đầu trang và chân trang.đầu trang và chân trang trong Prawn PDF

Tuy nhiên, tôi đã xem bản trình diễn trên trang web của Prawnto về tiêu đề và chân trang. Tôi đã sao chép toàn bộ nguồn của bản demo đó chỉ để xem nó có hoạt động hay không nhưng một lỗi của phương thức không xác định "tiêu đề" bị khiếu nại. Tôi có hiểu rằng Prawn đã xuất hiện đầu trang và chân trang gần đây trong đá quý hay có điều gì khác tôi cần phải làm đầu tiên để sử dụng đầu trang và chân trang?

Các trang demo: http://cracklabs.com/prawnto/code/prawn_demos/source/text/flowing_text_with_header_and_footer

một phần của quy tắc ứng mối quan tâm:

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 

Và bởi tiêu đề, chỉ trong trường hợp, tôi có nghĩa là đoạn từ mà xuất hiện thường tại một góc của mỗi trang của tài liệu. Giống như số tài khoản của bạn trong các trang hóa đơn của bạn.

cảm ơn!

Trả lời

18

@GrantSayer thx cho ví dụ này, nhưng điều này sẽ chỉ cho phép bạn hiển thị số trang hiện tại, không phải tổng số trang.

Bạn cũng có thể sử dụng number_pages chức năng cho footer:

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 

Tuy nhiên, trong trường hợp của tôi, tôi cũng cần phải định dạng/phong cách và phải sắp xếp các số trang để phù hợp với hướng dẫn phong cách công ty. Tôi đã sử dụng go_to_page(k) để tạo các chức năng đầu trang và chân trang của riêng mình, thêm tiêu đề và chân trang vào mỗi trang sau tất cả các trang được tạo. Điều này mang lại cho tôi cả tùy chọn tạo kiểu và tổng số trang:

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 
+4

tôi vẫn tự hỏi làm thế nào bạn quản lý, tôm mà không viết công cụ lên các ô chân trang của bạn trong trường hợp này. Tôi đang sử dụng cùng một cách và nó chỉ không hoạt động. Điều tương tự cũng xảy ra trong ví dụ của bạn, khi bạn tăng số lượng văn bản. Chỉ cần xóa start_new_page và thêm '* 100' vào dòng văn bản bên trong vòng lặp. Tôi thường di chuyển toàn bộ tài liệu vào một hộp giới hạn và trừ các kích cỡ của hộp đầu trang/chân trang để tránh các vấn đề như vậy. – unexist

+1

Ví dụ chân trang đó thực sự giúp tôi tiết kiệm nhiều giờ đau khổ. – Vigrant

0

Cách duy nhất tôi tìm thấy để nhận một mục lặp lại trên một trang là sử dụng phương thức Prawn::Document::LazyBoundingBox. Về cơ bản, điều này cho phép bạn xác định một hộp giới hạn chỉ được hiển thị khi bạn gọi nó. Vì vậy, thông thường pseudo-code bước

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

Ví dụ từ nguồn cho thấy cách

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 

cuối

này cung cấp cho bạn một lượng văn bản Page-đếm trên mỗi trang mới. Điều lý tưởng là nếu điều này có thể được áp dụng trong thiết lập mẫu trang được sử dụng lại mà không có lệnh gọi thủ công để hiển thị phần tử. Kết hợp với dòng văn bản, nó sẽ cung cấp cho giải pháp truyền thống về đầu trang và chân trang.

32

Mẫu bạn đang đề cập đến, từ plugin tôm, đang sử dụng phiên bản cũ hơn của tôm.

Vì tôi cũng cần đầu trang và chân trang, tôi nhìn thêm một chút về điều này. Dường như phiên bản tôm đó có các phương thức đầu trang và chân trang, được triển khai bằng cách sử dụng hộp giới hạn lười. (tìm thấy bằng cách kiểm tra mã trên github)

Trong phiên bản tôm mới, bạn có thể làm điều tương tự bằng cách sử dụng bộ lặp.

Dưới đây là toàn bộ mẫu viết lại sử dụng phiên bản mới:

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 

bạn có thể kiểm tra các trang tài liệu của lặp lại cho các tùy chọn khác cho phép bạn xác định chính xác nơi bạn muốn lặp.

13

Đó là một chút khác nhau với phiên bản mới nhất của Tôm bạn phải passe một băm

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 
+0

cái này hoạt động cho tôi, các câu trả lời khác với 21 phiếu bầu, không hoạt động cho tôi .. – Kokizzu

+1

Luôn hân hạnh được giúp đỡ –

+0

Cảm ơn: liên kết đến các tài liệu hiện tại: http://www.rubydoc.info/github/sandal/prawn/Prawn% 2FDocument% 3Anumber_pages –

2

BẮT ĐẦU EDIT

này hoạt động trong tôm> = 0,12

END EDIT

Đây là giải pháp của tôi bằng cách sử dụng lặp lại, canvas một d ô. Về cơ bản tôi đang vẽ các hộp giới hạn của mình ở đầu và cuối tuyệt đối của mỗi trang. Tôi đang sử dụng ô để kiểm soát kiểu dáng tốt hơn. Hy vọng điều này sẽ hữu ích cho ai đó. (Tôi đã sử dụng màu sắc hơi khó chịu để minh họa rõ hơn về cách bạn có thể kiểm soát phong cách của header và footer)

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 
+1

Cảm ơn bạn rất nhiều, đó là chính xác những gì tôi đang tìm kiếm. – Thrasher

7

Nếu bạn muốn có một chân mà không biết những thứ trên văn bản của bạn, bạn cần phải tạo ra các bounding_box dưới bên lề tài liệu sử dụng 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 

Nó sẽ giống như thế, bạn có thể thấy rằng chân nằm ngoài đáy margin:

example result

Hy vọng nó sẽ giúp một ai đó

Các vấn đề liên quan