2011-08-10 47 views
14

Tôi đang tạo một cuốn sách pdf nơi tôi cần đặt hình nền cho mỗi trang.Tôm: thêm hình nền có độ phân giải lớn hơn

Kích thước của trang là (576 x 576) và kích thước của hình nền là 2700 x 2700 (300 dpi.) (Các kích thước này là các yêu cầu để không thể điều chỉnh được). Vấn đề của tôi là - hình nền xuất hiện ngoài tỷ lệ trong trang. Làm thế nào tôi có thể sửa lỗi này ? Dưới đây là mã của tôi:

Prawn::Document.generate("#{Rails.root.to_s}/public/#{filename}.pdf", :page_size => [576,576], :left_margin => 50, 
:right_margin => 50, :page_layout => :portrait, :skip_page_creation => true, :skip_encoding => true, 
:background => "#{Rails.root.to_s}/public/images/pdf/bg_blank_low.jpg") do |pdf| 
    .... 
    .... 
    .... 
) 

Có cách nào khác mà tôi có thể đặt hình ảnh của 300 dpi làm hình nền.

Tôi thậm chí đã thử thêm mẫu pdf làm nền, nhưng vẫn không có may mắn.

Mọi đề xuất hoặc gợi ý sẽ được đánh giá cao.

Cảm ơn.

Trả lời

11

Điều bạn đang cố gắng thực hiện không thể thực hiện được bằng cách sử dụng tùy chọn :background của Prawn::Document.generate vì tùy chọn :background không thể chia tỷ lệ hình ảnh. Nếu bạn muốn sử dụng tùy chọn :background, bạn cần đảm bảo hình ảnh của bạn có cùng dpi với PDF (thường là 72dpi).

Tuy nhiên, bạn có thể chỉ cần chụp ảnh trong trang, như bạn sẽ làm một hình ảnh bình thường và sau đó thả văn bản lên trên nó. Điều này làm việc kể từ khi bạn nhúng một hình ảnh bạn có thể mở rộng nó. Các mã có thể giống như thế này:

Prawn::Document.generate("#{Rails.root.to_s}/public/#{filename}.pdf", :page_size => [576,576], :left_margin => 50, :right_margin => 50, :page_layout => :portrait, :skip_page_creation => true, :skip_encoding => true) do |pdf| 
    bg_image = "#{Rails.root.to_s}/public/images/pdf/bg_blank_low.jpg" 
    pdf.image bg_image, :scale => 0.2311 
    pdf.move_up 576 
end 

Điều này sẽ làm 'nền' của bạn bao gồm đầy đủ trang (kể từ khi chúng ta tự tính toán quy mô 2700/576), nếu bạn muốn tôn trọng lợi nhuận của bạn (điều này có lẽ là một cách tốt hơn nói chung), bạn có thể thay đổi một cái gì đó như:

pdf.image bg_image, :width => pdf.bounds.width 

này sẽ tự động mở rộng hình ảnh dựa trên độ rộng của khung giới hạn của trang. Tất nhiên bạn sẽ cần phải thay đổi move_up của bạn là tốt, cái gì đó như:

pdf.move_up pdf.bounds.height 

Sau khi bạn đã làm điều này bạn có thể bắt đầu đưa văn bản của bạn và nó sẽ xuất hiện trên đầu trang của hình ảnh của bạn và vì vậy chúng tôi có được chúng tôi mô phỏng quy mô lý lịch.

Cập nhật

Đây là một bản cập nhật liên quan đến các nhận xét. Nếu bạn có các trang được tạo tự động và bạn muốn chúng có cùng một nền thì bạn sẽ không may mắn nếu bạn đang sử dụng bản phát hành con tôm hiện tại theo cách của nó. Nếu bạn thực sự cần chức năng này, thì bạn phải vá tôm.

Lấy nguồn tôm (từ https://github.com/sandal/prawn) và xem qua. Những gì bạn đang theo sau là lib/document.rb, trên dòng 244 có phương thức start_new_page, đây là phương thức bạn đang theo dõi. Trong phương thức này trên dòng 280, bạn có thể thấy nơi nền đang được thiết lập. Thật không may nó đang sử dụng canvas có nghĩa là, hình ảnh của bạn đã có kích thước phù hợp. Đây là lý do tại sao hình nền không tự động mở rộng.

Bạn sẽ cần ghi đè hành vi này.Vì đây là Ruby, tất cả những gì bạn phải làm là mở lại lớp trong dự án của bạn và sau đó sao chép dán phương thức này vào (nếu bạn cần thêm thông tin về cách thực hiện điều này, có rất nhiều thứ xung quanh các lớp Ruby đang vá khỉ). Bây giờ bạn chỉnh sửa phương pháp này cho nội dung trái tim của bạn. Cách dễ nhất là có lẽ để loại bỏ tất cả các vải với nhau và sau đó sử dụng thủ thuật hình ảnh của chúng tôi từ trên cao. Vì vậy, dòng kết thúc là:

image(@background, :width => bounds.width) if @background 
move_up bounds.height 

Bây giờ bạn có thể quay lại sử dụng cách thiết lập nền chuẩn và mọi thứ sẽ hoạt động.

Infact, bạn thậm chí có thể nhận được ngay với thay đổi dòng 280 như sau:

canvas { image(@background, :width => bounds.width) } if @background 

Và mọi thứ sẽ làm việc tốt, giúp bạn tiết kiệm phải gõ thêm một dòng :). Sử dụng hình ảnh có tùy chọn :width sẽ tự động chia tỷ lệ hình ảnh, trong khi sử dụng tùy chọn :at vì tôm sẽ không chia tỷ lệ hình ảnh.

Lưu ý: Tôi chưa thực sự thực hiện việc này để bạn có thể cần phải giải quyết vấn đề.

+0

Xin chào skorks, Cảm ơn bạn đã đề xuất. Tôi đã thử điều này rồi. Vấn đề với phương pháp này là nếu văn bản phát triển nhiều trang, trang tiếp theo sẽ không có nền. Trong ứng dụng của tôi, tôi phải thêm văn bản được lấy ra từ cơ sở dữ liệu. Nếu văn bản dài hơn và không thể được trang bị trong một trang, con tôm sẽ tự động tạo một trang mới và nối thêm văn bản còn lại vào đó. Và trang con tôm mới được tạo sẽ không có nền - chỉ đơn giản là màu trắng. Có cách nào để đặt hình ảnh làm nền cho trang được tạo tự động cho tôm không? Một lần nữa xin cảm ơn. – safalmj

+0

Không phải với tôm theo cách của nó, nếu bạn muốn chia tỷ lệ hình ảnh và đảm bảo các trang mới có hình nền làm nền, bạn sẽ phải vá tôm. Tôi sẽ cập nhật câu trả lời với những gì tôi nghĩ rằng có thể làm việc, tâm trí bạn tôi đã không thực sự thực hiện nó, vì vậy bạn sẽ phải làm việc ra các kinks. – skorks

+0

Cảm ơn bạn rất nhiều skorks. Gợi ý của bạn đã hiệu quả. Tuy nhiên tôi đã phải làm việc trên rất nhiều kinks nhưng cuối cùng đã thực hiện theo cách của tôi. Bạn Rock. Chúc mừng. – safalmj

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