Sep 22 2009

Prawn i prawnto - dlaczego jestem przeciw?

Category: Ruby On Rails początki, Ruby, Ruby on RailsSebastian Bobrowski @ 1:13 pm

Jednym z elementów programu do faktur, nad którym pracuje jest generowanie wielu rodzajów pdfów, od faktur vat, przez korygujące aż po zestawienia faktur miesięcznie, kwartalne, roczne.Nie ukrywam, że na początku przysparzało to sporo problemów. Głównym z nich były tabelki, które stanowią trzon każdego z powyższych dokumentów.  Przy nowej odsłonie pdfów chciałem wykorzystać bibliotekę Prawn wraz z pluginem PrawnTo za namową reklamy na railscasts. W przykładach wszystko wygląda dobrze, pare lini kodu i działa. Jednak problemy zaczynają się przy:

  • większej ilości tekstu
  • numeracji poszczególnych stron

Autorzy nie przewidzieli dobrej obsługi sytuacji gdy tekst umieszczony w komórce tabeli nie mieści się w jednym wierszu i musi zostać przeniesiony do kolejnych. Pozostawienie automatycznej konfiguracji dawało bardzo kiepskie rezulataty. Oczywiście można też samodzielnie liczyć szerokość każdego z wyrazów i dzielić je w razie potrzeby, gdy nie mieszczą się w jednym wierszu. Jednak obsługa szerokości znaków polskich nie działała poprawnie.Zdedydowanie gorszą sprawą, było numerowanie poszczególnych stron. O ile wersja podstawowa działała bez problemu, bo wystarczało zwiększać licznik wraz z każdą nową stroną to innej wersje są nieosiągalne. Próbowałem najbardziej popularną wersją obecną w dokumentach np: strona 2/7. Jest to konieczne dla wszystkich sprawdzających i czytających aby mieli pewność, że żadana ze stron nie zaginęła. Pytałem o tą sprawę na forum i kanale irc projektu jednak od autora biblioteki otrzymałem odpowiedź: “Nie da się :)”. Podobno mechanizm zamykania stron jest dość dziwny tzn, aby otworzyć nową stronę trzeba zamknąć poprzednią, a raz zamknięta strona nie może być ponownie otworzona. Takie rozwiązanie kompletnie wyklucza moją funkcjonalność. Autor próbował mi pomóc, ale razem doszliśmy do wniosku, że najłatwiejszym i najszybszym (tylko do implementacji) sposobem będzie:

  1. generowanie dokumentu
  2. zliczanie jego stron
  3. generowanie ponownie dokumentu znając już całkowitą liczbę stron z pierwszego punktu

Jednak to rozwiązanie nie bardzo przypadło mi do gustu z uwagi na to, że dokumenty już dość długo się generowały (parę sekund), a w wersji produktcyjnej pewnie zrobi się z tego około 10 z uwagi na dużo większą ilość danych.

Podsumowanie:Prawn polecam do prostych dokumentów takich jak prosta lista czy prawie pusta tabelka. Wtedy używa się tego bardzo przyjemnie. Jednak do bardziej wymagających zadań wciąż niezastąpione jest rfpdf.


Sep 05 2009

Wykrywanie schametów kodowania znaków

Category: RubySebastian Bobrowski @ 2:22 pm

Jednoznaczne określenie schematu kodowania danego łańcucha znaków jest dość trudne. Schematy wielobajtowe wykazują pewne wzorce, które możemy wykrywać i na ich podstawie domniemywać o schemacie kodowania. Pozostają schematy kodowania jednobajtowe które są znacznie trudniejsze. Możemy próbować podejść od strony statystycznej ale przy krótkim łańcuchu nie daje to dobrych efektów.W większość sytuacji pierwszym krokiem przy rozpoznawaniu jest odpowiedź na pytanie: “Czy jest to uft8?”. Jeśli tak to jesteśmy w domu, jeśli nie sprawa staje się bardziej skomplikowana. Najprostszą metodą rozpoznania jest uzycie metody unpack, która rzuca wyjątek w sytuacji kiedy nie otrzymuje prawidłowego łańcucha na wejściu.

class String

def utf8?

unpack(’U*’)  rescue return false

end

end

W prosty sposób można też sprawdzać czy łańcuch składa się tylko ze znaków ASCII

class String

def ascii?

self.split(/./).all? {|ch| ch<128}

end

end