• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z klasą PDFMerger w php

0 głosów
268 wizyt
pytanie zadane 20 grudnia 2018 w PHP przez itcloud Gaduła (3,380 p.)
edycja 20 grudnia 2018 przez itcloud

Od godziny walczę z niby błahostką, nie czaję o co chodzi.

Mam załączoną klasę pdfMerger którego pobrałem z githuba. Jak w pliku klasy wpisuję na początku echo "AAA" to się wyświetla, więc plik jest dołączany.

Ale problem jest niby z klasą.

W głównym kodzie mam tak:

include "PDFMerger.php"; 
//require_once('PDFMerger.php');
echo "start";

$merger = new PDFMerger;

$merger->addPDF('pliki/1.pdf', 'all');
$merger->addPDF('plik/Dokument1.pdf', 'all');
$merger->merge('file', 'wynik/testowy.pdf');

No a pokazuje mi błąd:

Fatal error: Class 'PDFMerger' not found in C:\www\Apache2\htdocs\pdf_merger\index.php on line 10

Dziwny błąd, bo w pliku klasy od razy pierwsze co to jest

class PDFMerger

{

}

 

ps. dobra, to chyba przez to ze brakuje ponizszych plikow:

 

    public function __construct()
    {
        require_once('tcpdf/tcpdf.php');
        require_once('tcpdf/tcpdi.php');
    }

ps. to jednak nie to, nie wiem więc o co chodzi.

1
komentarz 20 grudnia 2018 przez Assasz Nałogowiec (30,490 p.)
Nie korzystasz z jakichś przestrzeni nazw? Pokaż cały kod.
komentarz 20 grudnia 2018 przez itcloud Gaduła (3,380 p.)
Pokazałem wyżej cały kod, ale w plku klasy jest faktycznie odwołanie do jakiejś przestrzeni.

namespace PDFMerger;

class PDFMerger
{....
komentarz 20 grudnia 2018 przez Assasz Nałogowiec (30,490 p.)
No i to jest bardzo istotne ;) Zrób jak napisał HaKIM.
komentarz 20 grudnia 2018 przez itcloud Gaduła (3,380 p.)

miałeś chyba rację, jak dopisałem namespace w moim pliku głównym:

 

Warning: require_once(fpdf_tpl.php) [function.require-once]: failed to open stream: No such file or directory in C:\www\Apache2\htdocs\pdf_merger\tcpdf\tcpdi.php on line 24

Fatal error: require_once() [function.require]: Failed opening required 'fpdf_tpl.php' (include_path='.;C:\php\pear') in C:\www\Apache2\htdocs\pdf__merger\tcpdf\tcpdi.php on line 24

Ciągle brakuje czegoś. Wiecie może skąd pobrać taką kompletną paczkę biblioteki tcpdf do której odwołuje się ten PDFMerger ??

1 odpowiedź

+1 głos
odpowiedź 20 grudnia 2018 przez HaKIM Szeryf (87,810 p.)
wybrane 21 grudnia 2018 przez itcloud
 
Najlepsza

Dodaj tę linijkę po include - choć, ja bym użył require - 'PDFMerger.php';

use PDFMerger\PDFMerger;
komentarz 21 grudnia 2018 przez HaKIM Szeryf (87,810 p.)

Uprzedzając pozytywną odpowiedź na te założenie:

Albo chcesz zmergować wszystkie pliki z Dokument1.pdf i pismo2.pdf osobno - jeśli tak, daj znać.

Spróbuj tego kodu:

$founded_files = searchFiles('pliki/', '*.pdf');

$merger = new PDFMerger;

foreach ($founded_files as $file) {
    $file_name = trim(preg_replace('%^[^\/]{1,}\/(.{1,30}\.pdf).{0,4}$%','\\1', $file));

    $merger->addPDF($file, 'all');
    
    $merger->addPDF('plik/Dokument1.pdf', 'all');
    $merger->addPDF('plik/pismo2.pdf', 'all');

    $merger->merge('file', __DIR__.'/wynik/' . $file_name);
}

 

komentarz 21 grudnia 2018 przez itcloud Gaduła (3,380 p.)

Tzn. zalaczona przeze mnie petla foreach jest ok, sklejam dwa pdfy ze sztywna nazwa ale wczesniej daje pdf ktory siedzi w iterowanej petli czyli w zmiennej $f.

Moja funkcja SearchFiles:

//funkcja szuka pliki np. *.jpg ($sPattern) w katalogu $sDir
function searchFiles($sDir, $sPattern, $nFlags = NULL) {
   $aFiles = glob("$sDir"."$sPattern", $nFlags);
   $files = getDir($sDir);
   if (is_array($files)) {
       foreach( $files as $file ) {
           $aSubFiles = globr($file, $sPattern, $nFlags);
           $aFiles = array_merge($aFiles,$aSubFiles);
       }
   }
   return $aFiles;
}

 

A jeszcze raz mój kod z głównego pliku index.php

namespace PDFMerger;
use TCPDI;
use PDFMerger\PDFMerger;

//ini_set('memory_limit', '-1');

include "util.php";
require "PDFMerger.php"; 

echo "start";

$founded_file = searchFiles('pliki/','*.pdf');

foreach($founded_file as $f){

   $merger = new PDFMerger;

   //only name, w $f jest pelna sciezka
  $f_only_name = trim(preg_replace('%^[^\/]{1,}\/(.{1,30}\.pdf).{0,4}$%','\\1',$f));

  $merger->addPDF($f, 'all');
  $merger->addPDF('plik/Dokument1.pdf', 'all');
  $merger->merge('file', __DIR__.'/wynik/'.$f_only_name);

}
 

Troche go uprościłem. Nie wiem, czy jak tworze obiekt, to przy kolejnej iteracji nie powinienem go zniszczyć? Stad to przepełnianie pamięci. Chociaż dla prostego pdf i malutkiego było ok.

komentarz 22 grudnia 2018 przez HaKIM Szeryf (87,810 p.)

Przenieś:

   $merger = new PDFMerger;

poza pętle - a dokłniej to przed. Jeśli wystąpi błąd - podaj go. No i zobacz ile łącznie ważą wszystkie Tw. pdfy do zmergowania.

komentarz 22 grudnia 2018 przez itcloud Gaduła (3,380 p.)
Jak miłem przed pętlą, to... pierwszy pdf po połączeniu był ok, ale każdy następny zawierał tego poprzedniego ;) Stąd stwierdziłem, że obiekty musi być tworzony za każdym razem na nowo. Pytanie, czy pamięć samoistnie się zwalnia, jak w javie (garbage collector) czy powinienem użyć coś w rodzaju unset?
1
komentarz 22 grudnia 2018 przez HaKIM Szeryf (87,810 p.)

PHP ma garbage collector, acz możesz skorzystać z funkcji wbudowanej unset();

Na Tw. miejscu skorzystałbym z innej biblioteki.

Podobne pytania

–1 głos
1 odpowiedź 136 wizyt
pytanie zadane 10 lutego 2018 w SQL, bazy danych przez koder12345 Obywatel (1,580 p.)
0 głosów
0 odpowiedzi 89 wizyt
pytanie zadane 8 maja w C i C++ przez Judasz Początkujący (400 p.)
0 głosów
1 odpowiedź 78 wizyt
pytanie zadane 17 maja 2021 w C i C++ przez urbix01 Gaduła (3,290 p.)

89,689 zapytań

138,291 odpowiedzi

309,236 komentarzy

59,620 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...