Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: drukowanie wielu stron
Forum PHP.pl > Forum > PHP
Kabraxis
Cel: Drukowanie faktur

Problematyka: fragment strony (zwanej dalej blokiem) nie może zostać wydrukowany w połowie na jednej stronie, a w połowie na drugiej. Nie jestem w stanie przewidzieć ilości produktów oraz miejsca jakie zajmą (nazwa może być np. na tyle długa, że zajmie dwa wiersze itp.). W związku z tym jedynym logicznym wyjściem byłoby podzielenie faktury na bloki, które w przypadku gdy nie mieszczą się już na pierwszej stronie do druku zostają przeniesione w całości na drugą, a tam pozostanie puste miejsce.

(Pisząc poniższe nie wiedziałem, że są takie problemy ze spacjami na tym forum... wyobraźcie sobie, że pomiędzy | a | są równe odstępy winksmiley.jpg)
Zilustrowanie problemu:

strona 1
-------------
| abc |
| abc |
| abc |
| jakisele |
--------------

strona 2
-------------
| ment |
| abc |
| |
| |
--------------

Powyższa sytuacja nie może mieć miejsca, zamiast tego musi zostać to wydrukowane tak:

strona 1
-------------
| abc |
| abc |
| abc |
| |
--------------

strona 2
-------------
| jakisele |
| ment |
| abc |
| |
| |
--------------



Czy istnieje jakaś technologia, która umożliwia taki podział na bloki?
siemakuba
Możesz spróbować wykorzystać CSS i atrybuty page-break-before, page-break-after i page-break-inside.
Szczegóły tu: http://www.w3.org/TR/CSS21/page.html#page-break-props

Ale, różnie to działa w różnych przeglądarkach i może być troche zależne od kodu (tabele czy divy).

Innym pomysłem może być robienie z tego PDFa i dopiero jego drukowanie. Wada - więcej roboty, chociaż znajdziesz niezłe biblioteki generujące pdf. Zaleta - masz gwarancję, że wydruk będzie wyglądał tak jak go przygotujesz.

pozdr.
Kabraxis
Jeśli chodzi o pdfa sądzę, że to będzie wersja wyjściowa całości więc i tak będę musiał go wykonać. Tylko nie mam pojęcia jak takiego pdfa generować aby spełniał moje założenie winksmiley.jpg
mokry
Kiedyś pisalem system do obslugi firmy zajmujacej sie sprzedaza... Wszystko w php i MySQL.
Problem drukowania faktur zlatwilem za pomoca CSS... Aby nie drukowalo adresu i innych dodatkow na fakturze, trzeba bylo usunac to w ustawieniach przegladarki...

Jesli chodzi o pdfy... Byly tworzone, a nauczylem sie ich za pomoca topicu przyklejonego do tego forum.

Pozatym jesli piszesz system faktur to dla konkretnej firmy, wykorzystanie to ma w jednej firmie, wiec nie musisz w tym momencie dostosowywac tego do kazdej przegladarki...
thornag
Ja generuje statystyki w podobny sposob, nie moge zlamac bloku wiec przenosze. Problem byl taki ze jak generuje statystyki 7 kazdego miesiaca to mam kupe miejsca i mi wykresy podnosilo do gory co mi sie nie podobalo. Rozwiazalem to drugujac za kazdym razem 31 divow jeden pod drugiem ale tylko do dnia bierzace mialy visibility: visible, reszta hidden.

Mozesz pokombinowac w ten sam sposob, ja bym jednak traktowal jedna fakture jak jedna strone, (nawet jesli zmiesciliby sie dwie) i wkladal do niej blok o stalej wysokosci (odpowiadajacej stronie A4 czy cos) wtedy bedzie w porzadku, co do generowania PDFa to sa do tego biblioteki, ja osobiscie korzystam z html_to_pdf() i DOMPDF.

Jesli interesuje Cie jak to jest realizowane to daj znac, moge sie podzielic spostrzezeniami smile.gif
Kabraxis
Cytat
ja bym jednak traktowal jedna fakture jak jedna strone, (nawet jesli zmiesciliby sie dwie)


Nie jestem pewien czy dobrze zrozumiałeś problematykę. Chodzi o to, że jedna faktura może mieć tyle produktów, że może wyjść np. na dwie strony albo i więcej. I są pewne elementy takie jak np. notki pod spodem o artykułach prawnych oraz inne, które nie mogą znaleźć się w części na jednej stronie, a w części na drugiej.

Każda faktura stanowi oddzielny pdf z niewiadomą ilością stron, nie da się przewidzieć wysokości wiersza ponieważ opis usługi może być na tyle długi, że znajdzie się w więcej niż jednym wierszu.

Jeśli ktoś to rozwiązał i może mi przedstawić swoje rozwiązania będę bardzo wdzięczny smile.gif
Jarod
Ja załatiwłem to w poniższy sposób. Testowałem pod IE, FF i Operą.

  1. <?php
  2. // Dzielenie strony
  3.  $licznik++; $podzial++; $coIle = 0;
  4.  
  5.  if ( $licznik <= 34 ) $coIle = 34;
  6.  if ( $licznik > 34 ) $coIle = 38;
  7.  
  8.  if ( ($podzial == $coIle) && ($licznik < $iloscRekordow) )
  9.  {
  10.  echo '<div class="spacerdruk"></div>';
  11.  $podzial = 0;
  12.  }
  13. ?>

  1. .spacerdruk {
  2. page-break-before: always;
  3. height: 1px;
  4. }


Musisz metodą prób i błędów sprawdzić ile w Twom przypadku zmieści się danych na stronie i odpowiednio pozmieniać wartości w warunkach (34 i 38). Na pierwszej stronie drukowanych jest 34 (bo drukuje jeszcze tyutł nagłówka) wiersze a na każdej następnej 38.
Kabraxis
No tak ale jak wspomniałem nie jestem wstanie przewidzieć ile jeden produkt zajmie wierszy, więc to rozwiązanie odpada sad.gif
Jarod
Cytat(Kabraxis @ 30.11.2006, 02:41:31 ) *
No tak ale jak wspomniałem nie jestem wstanie przewidzieć ile jeden produkt zajmie wierszy, więc to rozwiązanie odpada sad.gif


To przy wywalaniu danych na stronie sprawdzaj długość wiersza. Sprawdź ile znaków mieści Ci się na stronie (uwzględnij szerokość liter: W zajmuje więcej niż N, etc) i sobie dostasuj page_break.
Kabraxis
Nie jestem w stanie obliczać szerokości znaków na podstawie ich literek winksmiley.jpg Na dodatek to pod różnymi systemami (ze strony serwera), a nawet zmianą oprogramowania może ulec zmianie, gdzieś dojdzie jeden piksel i wszystko się pochrzani. Takie rozwiązanie odpada winksmiley.jpg

Ponawiam pytanie z początku topicu winksmiley.jpg
Jarod
Cytat(Kabraxis @ 1.12.2006, 19:33:54 ) *
Nie jestem w stanie obliczać szerokości znaków na podstawie ich literek winksmiley.jpg Na dodatek to pod różnymi systemami (ze strony serwera), a nawet zmianą oprogramowania może ulec zmianie, gdzieś dojdzie jeden piksel i wszystko się pochrzani. Takie rozwiązanie odpada winksmiley.jpg

Ponawiam pytanie z początku topicu winksmiley.jpg


Obawiam się, że pozostaje Ci tylko obliczanie. Napisz dokładnie jeszcze raz o co Ci chodzi z tym podziałem bo przykład, któy podałeś nie wyjaśnia tego zbyt jasno..
Kabraxis
Jaśniej się nie da...

Wyobraź sobie, że drukujesz kwadraciki (w rzeczywistości to są powiedzmy akapity tekstu). Przy drukowaniu nie możesz dopuścić, żeby kwadracik został wydrukowany po części na jednej stronie, po części na drugiej. Musi być on na jednej stronie w całości. Jeśli na poprzedniej stronie zostało miejsce i mieści się 90% kwadracika nie może on być na niej wydrukowany i ma się wydrukować początku strony kolejnej.
Jarod
Cytat(Kabraxis @ 2.12.2006, 02:31:13 ) *
Jeśli na poprzedniej stronie zostało miejsce i mieści się 90% kwadracika nie może on być na niej wydrukowany i ma się wydrukować początku strony kolejnej.


Więc moim sposobem to zrobisz..
Kabraxis
Nie bo nie znam wysokości kwadracików...

Nie istnieje żadna metoda drukowania, w której można ustalić takie bloki?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.