Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CakePHP] Eksport danych do PDF przy użyciu LaTeX
Forum PHP.pl > Forum > PHP > Frameworki
luk4s
Witam

Piszę sobie małą aplikację w CakePHP, w której potrzebuję eksportu do PDF. Ponieważ dokumenty PDF będą trochę skomplikowane to wymyśliłem sobie, że najłatwiej będzie mi to zrobić wykorzystując LaTeXa, ponieważ jakieś doświadczenie już z nim mam i wiem, że da się za jego pomocą uzyskać ładne PDFy.

Zaznaczę w tym miejscu, że nie jestem programistą PHP, a w CakePHP piszę dopiero od niedawna, wyłącznie na swoje potrzeby.
Mój problem polega na tym, że nie wiem jak napisać ów eksport do PDF stosując się do filozofii CakePHP.

To co chcę osiągnąć:

1) W kontrolerze pobieram dane z tabeli SQL.
2) Z pobranych danych generuję plik *.tex (dokument LaTeX).
3) Przy użyciu systemowego polecenia pdflatex tworzę z dokumentu *.tex plik *.pdf.
4) Pakuję gotowego PDFa zipem i wysyłam użytkownikowi do pobrania.

Jak to zrobić w CakePHP? smile.gif

Czy mój widok, do którego przekażę dane z kontrolera powinien być dokumentem LaTeX? I jak zapisać taki widok do pliku *.tex na serwerze, a następnie z niego wygenerować PDF, spakować i wysłać do użytkownika?

Pozdrawiam i bardzo proszę o jakieś nakierowanie na rozwiązanie. winksmiley.jpg
everth
Masz parę innych dróg - użyć XSL-FO, lub PHP-owej funkcji PDF (ale to już raczej masochizm)
Co do latexa, sprawdź sobie passthru(). Nie wiem jak to będzie w wywoływaniem aplikacji systemowej na serwerze, ale lokalnie powinno ci pójść. Jak chcesz to skompresować to zapisz gdzieś wynik passthru() i skompresuj.
fleshgrinder
byc mozne znajdziesz tam cos uzytecznego: http://bakery.cakephp.org/articles/view/cr...kephp-and-tcpdf
luk4s
Dzięki za odpowiedzi, jednak zrobiłem tak jak pierwotnie chciałem. Poniżej opis, może się komuś przyda. smile.gif

W kontrolerze napisałem sobie funkcję, która zajmuje się całą logiką generowania dokumentów pdf.

Na początku funkcji dodałem dwie linijki:
  1. $this->autoRender = false;
  2. Configure::write('debug', '0');

Pierwszej chyba nie trzeba tłumaczyć, dzięki drugiej nie zapisuje się nam "syf" w generowanym pliku.

Teraz kolejne czynności:
1) Pobieramy dane z tabeli.
2) Przy użyciu klas Folder i File tworzymy katalog roboczy i w nim plik foo.tex, do którego zapiszemy gotowy dokument LaTeXa.
3) Tworzymy nowy layout: app/views/layouts/latex.ctp, w którym zapisujemy preambułę i wszystkie rzeczy wspólne dla naszych dokumentów *.tex, np.:

  1. \documentclass[twoside,a4paper,10pt]{article}
  2. %lokalizacja
  3. \usepackage{polski}
  4. \usepackage[utf8x]{inputenc}
  5. % geometria strony i czcionki
  6. \usepackage[top=2.5cm,bottom=4cm,left=2.6cm,right=1.5cm]{geometry}
  7. \usepackage{graphicx}
  8. \usepackage{graphics}
  9. \usepackage{fancyhdr}
  10.  
  11. \begin{document}
  12.  
  13. <?php echo $content_for_layout; ?>
  14.  
  15. \end{document}


4) Tworzymy nowy wiok app/views/nazwa_naszego_kontrolera/latex.ctp
W widoku opisujemy nasze dane przekazane z kontrolera już nie HTMLem tylko składnią LaTeXa.

5) Renderujemy nasze dane i zapisujemy do pliku:
  1. $this->output = $this->render('latex', 'latex'); // $this->render('nazwa_widoku', 'nazwa_layoutu')
  2. $file->append($this->output); // obiekt klasy File
  3. $this->output = '';


6) Teraz przy użyciu systemowego polecenia pdflatex generujemy gotowy dokument PDF z naszego foo.tex i otrzymujemy pięknego pdfa. smile.gif

Zależało mi mocno, by generować pdfy przy pomocy LaTeXa, ponieważ LaTeX robi to doskonale, przy czym nakład pracy jest stosunkowo mały.

Pozdrawiam winksmiley.jpg
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.