Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] łączenie pdf'ów - PDFMerger
Forum PHP.pl > Forum > PHP
hettmix
Witam.

Mam następujący problem - w polu blob bazy program zapisuję pliki pdf generowane przez użytkowników. Zapis tych plików oraz ich późniejszy odczyt/wyświetlenie działa bez żadnych problemów. To z czym nie mogę się aktualnie uporać, to pobranie wszystkich plików pdf z bazy i wygenerowanie jednego zbiorczego pdf'a.
Jako że program działa na serwerku Synology nie mogę doinstalować np. PDFTK, w związku z czym skorzystałem z klasy PDFMerger.
  1. $strSQL = "SELECT pdf_plik FROM tbl_zwykle_2str_pdf";
  2. $objQuery = mysql_query($strSQL);
  3. $resultData = array();
  4. for ($i=0;$i<mysql_num_rows($objQuery);$i++) {
  5. $result = mysql_fetch_array($objQuery);
  6. array_push($resultData,$result);
  7. }
  8.  
  9. $pdf = new PDFMerger;
  10.  
  11. $pdf->addPDF($resultData, 'all')
  12. ->merge('file', '/modules/mod_zbiorczy_pdf/tmp/zbiorczy_test.pdf');
  13.  
  14. echo "PDF Created Click <a href=\"/modules/mod_zbiorczy_pdf/tmp/zbiorczy_test.pdf\">here</a> to Download";

Powyższy kod zwraca jednak błędy:
- file_exists() expects parameter 1 to be string PDFMerger.php on line 47
- uncaught exception 'Exception' with message 'Could not locate PDF on 'Array' PDFMerger.php on line 58

Będę wdzięczny za pomoc w rozwiązaniu tego problemu, bądź naprowadzenie na właściwe tory. Pewnie można ten temat ugryźć z innej strony.
nospor
$result = mysql_fetch_array($objQuery);
array_push($resultData,$result);
O tu panie kolego otrzymujesz tablicę. A ty masz tam przekać przecież ścieżkę do PDF a nie tablicę...

Tak ma być:
$result = mysql_fetch_array($objQuery);
array_push($resultData,$result['pdf_plik']);
hettmix
Cytat(nospor @ 21.11.2012, 14:06:40 ) *
$result = mysql_fetch_array($objQuery);
array_push($resultData,$result);
O tu panie kolego otrzymujesz tablicę. A ty masz tam przekać przecież ścieżkę do PDF a nie tablicę...

Tak ma być:
$result = mysql_fetch_array($objQuery);
array_push($resultData,$result['pdf_plik']);


Po zmianie w dalszym ciągu otrzymuję te same błędy:
- file_exists() expects parameter 1 to be string PDFMerger.php on line 47
- uncaught exception 'Exception' with message 'Could not locate PDF on 'Array' PDFMerger.php on line 58

Jak już pisałem w bazie trzymam pdf'y w polach blob, a nie ścieżki do plików na dysku.
nospor
1) wg komunikatu ty nadal przekazujesz tam tablicę a nie tekst
Pokaż kod po poprawkach

2) No i najważniejsze: wg. komunikatu on wymaga ścieżki do pliku a nie zawartości pliku smile.gif

Dobra, zajrzałem na stronę PDFMerger i tam jak wół napisane jest, że metoda addPDF przyjmuje scięzkę do pliku. A ty radośnie od tak sobie wrzucasz tam tablice. Kurcze, Ty myślisz, że jak sobie zamienisz na tablice i to tablice nie ściezek a zawartosci to w magiczny sposób klasa to sobie obsłuży bo Ty tak chcesz?
hettmix
Cytat(nospor @ 21.11.2012, 15:15:33 ) *
1) wg komunikatu ty nadal przekazujesz tam tablicę a nie tekst
Pokaż kod po poprawkach

2) No i najważniejsze: wg. komunikatu on wymaga ścieżki do pliku a nie zawartości pliku :)


Kod tak jak proponowałeś:
  1. $strSQL = "SELECT pdf_plik FROM tbl_zwykle_2str_pdf";
  2. $objQuery = mysql_query($strSQL);
  3. $resultData = array();
  4. for ($i=0;$i<mysql_num_rows($objQuery);$i++) {
  5. $result = mysql_fetch_array($objQuery);
  6. array_push($resultData,$result['pdf_plik']);
  7. }
  8.  
  9. $pdf = new PDFMerger;
  10.  
  11. $pdf->addPDF($resultData, 'all')
  12. ->merge('file', '/modules/mod_zbiorczy_pdf/tmp/zbiorczy_test.pdf');
  13.  
  14. echo "PDF Created Click <a href=\"/modules/mod_zbiorczy_pdf/tmp/zbiorczy_test.pdf\">here</a> to Download";


A co do ścieżki do pliku, to właśnie wolałbym pobierać pdf (ich zawartość) z bazy i łączyć w jeden zbiorczy.
nospor
Dodałem notkę do poprzedniego posta. Przeczytaj.

Cytat
A co do ścieżki do pliku, to właśnie wolałbym pobierać pdf (ich zawartość) z bazy i łączyć w jeden zbiorczy.
To że Ty byś wolał, to nie znaczy że klasa się do Ciebie dostosuje. To Ty masz się dostować do możliwości klasy. To Ty teoretycznie jesteś istotą rozumną a nie klasa php.

Skoro klasa przyjmuje tylko ścieżki do plików to:
albo modyfikujesz klasę, by działała jak Ty chesz
albo się dostosowujesz Ty i pdf z bazy zapisujesz do pliku a potem dla klasy zapodajesz tę ścieżkę do świeżo zapisanego pliku
hettmix
Cytat(nospor @ 21.11.2012, 15:21:17 ) *
Dodałem notkę do poprzedniego posta. Przeczytaj.

To że Ty byś wolał, to nie znaczy że klasa się do Ciebie dostosuje. To Ty masz się dostować do możliwości klasy. To Ty teoretycznie jesteś istotą rozumną a nie klasa php.

Skoro klasa przyjmuje tylko ścieżki do plików to:
albo modyfikujesz klasę, by działała jak Ty chesz
albo się dostosowujesz Ty i pdf z bazy zapisujesz do pliku a potem dla klasy zapodajesz tę ścieżkę do świeżo zapisanego pliku



No w sumie racja - dzięki za poświęcony czas. Odezwę się jak przerobię program na zapisywanie w bazie ścieżek, a nie pdf'ów w blobie.

A tak na marginesie jest jakaś inna opcja, żeby pobrać i scalić pdf'y z pól blob ?
nospor
Cytat
A tak na marginesie jest jakaś inna opcja, żeby pobrać i scalić pdf'y z pól blob ?
W tej klasie z tego co widzę to nie.

Cytat
Odezwę się jak przerobię program na zapisywanie w bazie ścieżek, a nie pdf'ów w blobie.
Pamiętaj tylko o tym, że addPDF przyjmuje tylko jedną ścieżkę a nie tablicę ścieżek. Musisz wywołać addPDF tyle razy, ile będziesz miał ścieżek
hettmix
Cytat(nospor @ 21.11.2012, 15:29:41 ) *
W tej klasie z tego co widzę to nie.

Pamiętaj tylko o tym, że addPDF przyjmuje tylko jedną ścieżkę a nie tablicę ścieżek. Musisz wywołać addPDF tyle razy, ile będziesz miał ścieżek


OK - przebudowałem program i w tej chwili w bazie zapisuję ścieżki do pliku, które wyglądają np. tak /volume1/web/Joomla_1.5/modules/mod_zbiorczy_pdf/tmp/trafic_2_strony.pdf
Niestety podczas scalania plików w dalszym ciągu dostaję te same komunikaty o błędach.
nospor
No ale pokaż jaki teraz masz kod.... Czy za każdym razem muszę to samo pisać...?
hettmix
Cytat(nospor @ 22.11.2012, 08:12:31 ) *
No ale pokaż jaki teraz masz kod.... Czy za każdym razem muszę to samo pisać...?


Trochę przerobiłem ten kod:
  1. header('Content-type: application/pdf');
  2.  
  3. $strSQL = "SELECT pdf_nazwa_pliku FROM tbl_zwykle_2str_pdf";
  4. $objQuery = mysql_query($strSQL);
  5. $resultData = array();
  6. for ($i=0;$i<mysql_num_rows($objQuery);$i++) {
  7. $result = mysql_fetch_array($objQuery);
  8. array_push($resultData,readfile($result['pdf_nazwa_pliku']));
  9.  
  10.  
  11. $pdf = new PDFMerger;
  12. $pdf->addPDF($resultData, 'all')
  13. ->merge('browser', '');
  14. }

Jest już jakiś postęp, bo wyświetliło mi w przeglądarce poprawnie pdf, ale tylko pierwszego. Na chwilę obecną nie bardzo wiem jak to dalej ugryźć.
nospor
Czy Ty wogóle czytasz dokumentacje? Czytasz co ci ludzie piszą? Bo widzę, że nie. Ciągle wychodzisz z założenia "Bo ja wolę" i się go konsekwentnie trzymasz....

Powiedz mi proszę, czego nie zrozumiałeś w tym co ci napisałem
Cytat
Pamiętaj tylko o tym, że addPDF przyjmuje tylko jedną ścieżkę a nie tablicę ścieżek. Musisz wywołać addPDF tyle razy, ile będziesz miał ścieżek

?

A najlepsze to juz w ogóle jest to:
readfile($result['pdf_nazwa_pliku'])
Po grzyba ty tam readfile dałes?
hettmix
Cytat(nospor @ 22.11.2012, 09:32:34 ) *
Czy Ty wogóle czytasz dokumentacje? Czytasz co ci ludzie piszą? Bo widzę, że nie. Ciągle wychodzisz z założenia "Bo ja wolę" i się go konsekwentnie trzymasz....

Powiedz mi proszę, czego nie zrozumiałeś w tym co ci napisałem

?

A najlepsze to juz w ogóle jest to:
readfile($result['pdf_nazwa_pliku'])
Po grzyba ty tam readfile dałes?


Nie ma się co tak gorączkować, w końcu człowiek uczy się na błędach. Zwłaszcza początkujący w dane dziedzinie.
Kod wygląda więc tak:
  1. define( '_JEXEC', 1 ) or die('Direct Access to this location is not allowed.');
  2.  
  3. header('Content-type: application/pdf');
  4. header("Pragma: no-cache");
  5. header("Expires: 0");
  6. header("Cache-Control: must-revalidate");
  7.  
  8. require "/volume1/web/Joomla_1.5/connection/connection.php";
  9. include "/volume1/web/Joomla_1.5/joomla-auth-porzadkowe.php";
  10. include "/volume1/web/Joomla_1.5/joomla-config-porzadkowe.php";
  11. include "/volume1/web/Joomla_1.5/modules/mod_zbiorczy_pdf/pdfmerger/PDFMerger.php";
  12.  
  13.  
  14. $strSQL = ("SELECT pdf_nazwa_pliku FROM tbl_zwykle_2str_pdf") or die('Błąd zapytania select');
  15. $objQuery = mysql_query($strSQL);
  16. $resultData = array();
  17. for ($i=0;$i<mysql_num_rows($objQuery);$i++) {
  18. $result = mysql_fetch_array($objQuery);
  19. array_push($resultData,$result['pdf_nazwa_pliku']);
  20. }
  21.  
  22. $pdf = new PDFMerger;
  23. $pdf->addPDF($resultData[0], 'all')
  24. ->merge('browser', '');

Wszystko ładnie działa, po zmianie wskaźnika tablicy generują się właściwe pliki pdf - nie wiem tylko jak przekazać do funkcji addPDF wszystkie pliki.
nospor
Cytat
w końcu człowiek uczy się na błędach.
Tak, ale jak ci ktoś wyraźnie i po polsku któryś raz skolei pisze, że addPDF przyjmuje tylko i wyłącznie ścieżke do pliku a Ty ciągle i uparcie wkładasz tam tablicę, to chyba osoba, ma prawo stracić cierpliwość, nie sądzisz? I nie wynika to z braku Twojej wiedzy a z braku myślenia.

Widzę, jak ci nie napiszę, to w życiu tego nie zrobisz....

  1. $strSQL = ("SELECT pdf_nazwa_pliku FROM tbl_zwykle_2str_pdf") or die('Błąd zapytania select');
  2.  
  3. $objQuery = mysql_query($strSQL);
  4. $pdf = new PDFMerger;
  5.  
  6. for ($i=0;$i<mysql_num_rows($objQuery);$i++) {
  7.  
  8. $result = mysql_fetch_array($objQuery);
  9.  
  10. $pdf->addPDF($result['pdf_nazwa_pliku'], 'all');
  11.  
  12. }
  13.  
  14. $pdf->merge('browser', '');
hettmix
Cytat(nospor @ 22.11.2012, 10:37:22 ) *
Tak, ale jak ci ktoś wyraźnie i po polsku któryś raz skolei pisze, że addPDF przyjmuje tylko i wyłącznie ścieżke do pliku a Ty ciągle i uparcie wkładasz tam tablicę, to chyba osoba, ma prawo stracić cierpliwość, nie sądzisz? I nie wynika to z braku Twojej wiedzy a z braku myślenia.

Widzę, jak ci nie napiszę, to w życiu tego nie zrobisz....

  1. $strSQL = ("SELECT pdf_nazwa_pliku FROM tbl_zwykle_2str_pdf") or die('Błąd zapytania select');
  2.  
  3. $objQuery = mysql_query($strSQL);
  4. $pdf = new PDFMerger;
  5.  
  6. for ($i=0;$i<mysql_num_rows($objQuery);$i++) {
  7.  
  8. $result = mysql_fetch_array($objQuery);
  9.  
  10. $pdf->addPDF($result['pdf_nazwa_pliku'], 'all');
  11.  
  12. }
  13.  
  14. $pdf->merge('browser', '');


No to zamykam temat - dzięki za zrozumienie...
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.