• 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 20 grudnia 2018 przez itcloud Gaduła (3,380 p.)

Poprawiło się, jak dałem namespace.

Ale nadal są problemy:

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

Pobrałem więc wcześniej cały folder tcpdf, bo pewnych plików wymagała klasa PDFMERGER ale nic z tego jw.

1
komentarz 20 grudnia 2018 przez HaKIM Szeryf (87,590 p.)

Pyknij w root folderze projektu (głównym): git clone https://github.com/myokyawhtun/PDFMerger.git(Kropka nie jest przypadkowa)

I powinno śmigać jak ta lala.

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

Pobrałem wszystko, a mam teraz komunikat:

Fatal error: Class 'PDFMerger\TCPDI' not found in C:\WWW\Apache2\htdocs\pdf_merger\PDFMerger.php on line 87

W kodzie strony mam:

<?php
namespace PDFMerger;

require "PDFMerger.php"; 
use PDFMerger\PDFMerger;
use PDFMerger\TCPDI;

echo "start";

$merger = new PDFMerger;

$merger->addPDF('pliki/PAD_20181227_14_RB-03-01700.pdf', 'all');
$merger->addPDF('plik/Dokument1.pdf', 'all');
$merger->merge('file', 'wynik/testowy.pdf');
	
//REPLACE 'file' WITH 'browser', 'download', 'string', or 'file' for output options
//You do not need to give a file path for browser, string, or download - just the name. 

?>

 

komentarz 21 grudnia 2018 przez itcloud Gaduła (3,380 p.)
Dokładnie czepia się tego:

$fpdi = new TCPDI;
1
komentarz 21 grudnia 2018 przez HaKIM Szeryf (87,590 p.)

Cała ta biblioteka jest skopana...

Dodaj use TCPDI; do pliku PDFMerger zaraz po namespace PDFMerger;

<?php

namespace PDFMerger;

use TCPDI;

class PDFMerger {[...]}

Powinno działać. A! Nie zapomnij w metodzie addPDF, merge i wszędzie gdzie podajesz nazwy plików dodawać "prefixu": __DIR__ . '/xyz';

Przykład:

$pdf->addPDF(__DIR__ . '/CV.pdf', '1');

Na Twoim miejscu poszukałbym innej biblioteki, którą da się zainstalować komendą:

composer require xyz/xyz

Następnie wymagasz od PHP dołączenia pliku __DIR__ . /vendor/autoload.php i tyle.

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

Jest lepiej :)

Ze ścieżkami chyba nie muszę nic zmieniać, bo jak dopisałem __DIR__ to pojawił się exception (też dopisałem wcześniej use exception w pliku klasy), a teraz nie ma ale:

 

Warning: fopen() [function.fopen]: remote host file access not supported, file://wynik/testowy.pdf in C:\www\Apache2\htdocs\pdf_merger\tcpdf\include\tcpdf_static.php on line 1854

Warning: fopen(file://wynik/testowy.pdf) [function.fopen]: failed to open stream: no suitable wrapper could be found in C:\www\Apache2\htdocs\pdf_merger\tcpdf\include\tcpdf_static.php on line 1854

TCPDF ERROR: Unable to create output file: wynik/testowy.pdf

Czyli biblioteka nie wspiera pdf w wersji 1.3 takiego jakiego uzywam?

Znasz jakąś lepszą/prostrzą bibliotekę do php5 łączącą pdf-y ?

1
komentarz 21 grudnia 2018 przez HaKIM Szeryf (87,590 p.)

No i właśnie dlatego musisz dodać __DIR__ .  wink Tylko poprawnie, aby nie było Exception.

Nie, nie znam. Acz możesz Spróbować skorzystać z tego: https://github.com/hanneskod/libmergepdf

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

Dobra, miałeś częściowo rację, DIR dodaję do ostatniej ścieżki:


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

Działa!!!!! Dzięki Mistrzu:)

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

Chce skleić inny plik 28MB... i napotkałem na problem:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes) in C:\www\Apache2\htdocs\pdf_merger\tcpdf\tcpdi_parser.php on line 898

Co moge zrobić ?

 

 

komentarz 21 grudnia 2018 przez HaKIM Szeryf (87,590 p.)

Wydaję mi się, że albo coś skopałeś w kodzie albo paczka z której korzystasz jest podatna na memory leak.

Możesz użyć:

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

na początku pliku php. Choć, nie jest to najlepsze wyjście z sytuacji. Ja na Tw. miejscu przejrzałbym kod (swój) w poszukiwaniu wycieku pamięci albo zmienił bibliotekę.

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

Może problem wynika z tego że w pętli tworzę nowe obiekty, a nie usuwam wcześniejszych?

 

$founded_file = searchFiles('pliki/','*.pdf');
foreach($founded_file as $f){

$merger = new PDFMerger;

$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->addPDF('plik/pismo2.pdf', 'all');
$merger->merge('file', __DIR__.'/wynik/'.$f_only_name);

}

 

komentarz 21 grudnia 2018 przez HaKIM Szeryf (87,590 p.)

I tak i nie. Problemem na pewno jest pętla.

Spróbuj:

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

$merger = new PDFMerger;

foreach ($founded_file as $f) {
    $merger->addPDF($f, 'all');
}

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

$merger->merge('file', __DIR__.'/wynik/allInOne.pdf');

Zakładam, że chcesz zmergować wszystkie pdf w 1.

Oczywiście, musisz stworzyć plik /wynikl/allInOne.pdf bo ta libka nie chce tego robić za Ciebie.

Jeśli jednak nie chcesz osiągnąć zmergowania wszystkich pdfów w jeden plik - napisz co było celem Tw. kodu i zobaczymy co da się zrobić.

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

komentarz 21 grudnia 2018 przez HaKIM Szeryf (87,590 p.)
Jeszcze jedno - mógłbyś podesłać funckję searchFiles z której korzystasz? Nie znalazłem jej w dokumentacji.
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,452 zapytań

141,262 odpowiedzi

319,085 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!

...