2009-10-16 12 views
6

Na życzenie klienta należy mieć tabele w formacie PDF z zaokrąglonym rogiem. Mam do dyspozycji jedynie procesor Apache FOP i nie obsługuje on zaokrąglonego atrybutu rogu. Nie obsługuje również elementów pływających, więc nie można wykonywać pływających zaokrąglonych obrazów w lewo i w prawo.Zaokrąglone narożniki w XSL-FO

Czy masz jakieś sugestie, jak to zrobić?

Odpowiedz

5

Możesz utworzyć tabelę jako obiekt SVG (Scalable Vector Graphics) i dołączyć ją jako zewnętrzny obraz do dokumentu XSL-FO. SVG obsługuje zaokrąglone rogi, a FOP obsługuje SVG.

Sądzę, że można również po prostu utworzyć zaokrąglony prostokąt SVG i użyć go jako tła do treści, a następnie postawić przed nim tabelę. Myślę, że zrobiłem to raz, ale nie mogę zlokalizować kodu ...

0

Dopóki jest to stała szerokość i nie oczekuj, że rzeczy będą "płynąć" dynamicznie w kierunku szerokości jak css, zrobiłem to (przez używając pionowej techniki "Drzwi przesuwane", jeśli pamiętasz oldschool'owe css):

Zdobądź zaokrąglony narożnik i trzymaj go tak długo, jak oczekujesz na stronie (uwaga, jeśli spodziewasz się, że coś pójdzie na wiele stron, wtedy to nie zadziała tak dobrze hehe). Używam go w nagłówkach/stopkach, a rzeczy, które rozpoczynają nową stronę (w obszarze ciała), które znam, nie przekraczają 1 strony.

Potem zdecyduje, czy muszę stałą wysokość ... jeśli tak można po prostu użyć obrazu tła bez fancyness ...

jeśli wysokość będzie się zmieniać, a potem po prostu używać górnej części obrazu dla jednej części i dolnej części obrazu dla innej części. coś takiego:

<fo:block-container> 
    <fo:block-container background-image="url(images/rounded_corner_image.png)" 
    background-repeat="no-repeat" 
    background-position-horizontal="15px" 
    background-position-vertical="top"    
    background-color="white" 
    > 
    <!-- 
    So it used the top of the image for as long as the block-container exists heightwise. 
    I may have had some whitespace in my image and need to move image into place so think I used background-position-horizontal since i had 15px of whitespace i wanted to cut off 
    Also you may set a height above if definatley know you don't need it to 'auto-expand', just make sure you have content that can't overflow if setting height (like a table with Name: Address: fields) 
    --> 
    <fo:block margin="70px 70px 0px 70px"> 
     Need to add some margins before starting content since dont want to text to touch the top and sides of of the rounded corner/borders plus add whitespace for content. 
    </fo:block> 
    </fo:block-container> 

    <fo:block-container background-image="url(images/rounded_corner_image.png)" 
    background-repeat="no-repeat" 
    background-position-horizontal="15px" 
    background-position-vertical="bottom" 
    padding="0px 0px 20px 0px" 
    background-color="white" 
    > 
    <fo:block margin="0px 70px 70px 70px"> 
     Need to add some margins before starting content since dont want to text to touch bottom and sides of of the rounded corner/borders. 
    </fo:block> 
    </fo:block-container> 

</fo:block-container> 

Są różne sposoby na to, jak sądzę. tak jakbym miał zawartość na dole, więc używam dołu, wiedząc, że na pewno będę miał co najmniej 70 pikseli treści, aby pokazać dolny gradient moich zaokrąglonych narożników ... możesz po prostu zdecydować o umieszczeniu całej zawartości w pierwszym blok-kontener i nadanie drugiemu blokowi kontenera stałej wysokości 70 pikseli, aby pokazać tylko dolny obraz w tle (myślę, że jest to możliwe, nawet jeśli w tym dolnym pojemniku nie ma zawartości [zapomnij zasad xsl-fo]). Korzystanie z bagażnika FOP i ładnie działa.

EDYCJA: należy zauważyć, że używam najnowszego FOP 1.0 (również wypróbowany z wersją prev) i działa dobrze. Użyłem też grafiki tak wysokiej, jak zawartość, ponieważ mam granice ... Jeśli potrzebujesz tylko górnej i dolnej grafiki (i koloru tła do wypełnienia ciała, wtedy nie potrzebujesz pełnego "as-tall-as" "możliwy" obraz).