• 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

VPS Starter Arubacloud
0 głosów
350 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,460 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,460 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,590 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,590 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,590 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,590 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ź 166 wizyt
pytanie zadane 10 lutego 2018 w SQL, bazy danych przez koder12345 Obywatel (1,570 p.)
0 głosów
0 odpowiedzi 218 wizyt
pytanie zadane 8 maja 2022 w C i C++ przez Bollo Początkujący (460 p.)
0 głosów
1 odpowiedź 201 wizyt
pytanie zadane 17 maja 2021 w C i C++ przez urbix01 Gaduła (3,290 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...