Nie możesz tego zrobić, używając opcji :background
z Prawn::Document.generate
, ponieważ opcja :background
nie może przeskalować obrazu. Jeśli chcesz użyć opcji :background
, upewnij się, że obraz ma taką samą rozdzielczość jak plik PDF (zwykle 72 dpi).
Możesz jednak po prostu umieścić obraz na stronie, tak jak zwykły obrazek, a następnie unieść go nad tekstem. Działa to od momentu osadzenia obrazu, który można przeskalować. Kod może wyglądać tak:
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
To sprawi, że „background” pełnego pokrycia strony (ponieważ ręcznie oblicza skalę 2700/576), jeśli chcemy szanować swoje marże (prawdopodobnie jest to lepszy sposób w ogóle), można zmienić na coś w stylu:
pdf.image bg_image, :width => pdf.bounds.width
powinno to automatycznie przeskalować obraz w oparciu o szerokości obwiedni strony. Oczywiście trzeba by zmienić move_up
jak dobrze, coś takiego:
pdf.move_up pdf.bounds.height
Po zrobił to można rozpocząć wprowadzanie tekstu i powinien pojawić się na górnej części obrazu, a więc dostajemy nasze symulowane skalowane tło.
Aktualizacja
Jest to zmiana w odniesieniu do komentarza. Jeśli masz automatycznie tworzone strony i chcesz, żeby miały to samo tło, to masz pecha, jeśli używasz aktualnego wydania prawdy, tak jak jest. Jeśli naprawdę potrzebujesz tej funkcjonalności, musisz załatać krewetki.
Złap źródło krewetki (od https://github.com/sandal/prawn) i spójrz na to. To, czego szukasz, to lib/document.rb
, w linii 244 jest metoda start_new_page
, to jest ta, której szukasz. W ramach tej metody w linii 280 można zobaczyć, gdzie jest ustawiane tło. Niestety używa on canvas
, co oznacza, że Twój obraz musi już mieć odpowiedni rozmiar. Dlatego obraz tła nie skaluje się automatycznie.
Będziesz musiał zastąpić to zachowanie.Ponieważ to jest Ruby, wystarczy ponownie otworzyć klasę w projekcie, a następnie skopiować wklej tę metodę (jeśli potrzebujesz więcej informacji o tym, jak to zrobić, jest mnóstwo na temat łatania małpek klas Ruby). Teraz edytujesz tę metodę do treści swoich serc. Najprostszym sposobem jest prawdopodobnie usunięcie płótna razem, a następnie skorzystaj z naszej sztuczki obrazkowej z góry. Tak więc linia kończy się:
image(@background, :width => bounds.width) if @background
move_up bounds.height
Teraz możesz wrócić do standardowego sposobu ustawiania tła i wszystko powinno działać.
Rzeczywiście, może nawet być w stanie uciec z linii 280 zmienia się następująco:
canvas { image(@background, :width => bounds.width) } if @background
i wszystko powinno działać poprawnie, oszczędzając konieczności wpisywania dodatkowy wiersz :). Użycie obrazu z opcją :width
powinno automatycznie skalować obraz, a użycie opcji :at
spowoduje, że obraz nie zostanie skalowany.
Uwaga: Nie zrobiłem tego, więc być może będziesz musiał rozwiązać problemy.
Witaj skorks, dziękuję za sugestię. Próbowałem już tego. Problem z tym podejściem polega na tym, że jeśli tekst ma więcej niż jedną stronę, następna strona nie będzie miała żadnego tła. W mojej aplikacji muszę dodać tekst pobrany z bazy danych. Jeśli tekst jest dłuższy i nie można go umieścić na jednej stronie, krewetka automatycznie utworzy nową stronę i dołączy do niej pozostały tekst. Nowa strona stworzona dla krewetki nie będzie miała tła - po prostu biały. Czy istnieje sposób na umieszczenie obrazu jako tła strony automatycznie generowanej przez krewetki? Jeszcze raz dziękuję. – safalmj
Nie z krewetkami takimi, jakie są, jeśli chcesz przeskalować obraz i upewnić się, że nowe strony mają go również jako tło, musisz zaszczepić krewetki. Zaktualizuję odpowiedź z tym, co myślę, że może zadziałać, pamiętaj, że tak naprawdę tego nie zrobiłem, więc będziesz musiał rozwiązać problemy. – skorks
Bardzo dziękuję skorks. Twoja podpowiedź działa. Jednak musiałem pracować nad wieloma załamaniami, ale w końcu udało mi się wyjść. Rządzisz. Twoje zdrowie. – safalmj