Đ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 đề.
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
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
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