2011-08-10 17 views
14

Tworzę książkę pdf, w której muszę umieścić obraz tła dla każdej strony.Krewetka: dodawanie obrazu tła o większej rozdzielczości

Rozmiar strony to (576 x 576), a rozmiar obrazu tła to 2700 x 2700 (300 dpi.) (Te rozmiary są wymaganiami, więc nie można ich zmienić). Mój problem polega na tym, że obraz tła jest nieproporcjonalny na stronie. Jak mogę to naprawić? Oto mój kod:

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| 
    .... 
    .... 
    .... 
) 

Czy istnieje inny sposób przez które mogę umieścić obraz 300 DPI jako obraz tła.

Próbowałem nawet dodać szablon PDF jako tło, ale wciąż nie ma szczęścia.

Wszelkie sugestie lub podpowiedzi będą mile widziane.

Dzięki.

Odpowiedz

11

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.

+0

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

+0

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

+0

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