Czy ktoś zna dobrą metodę edycji plików PDF w PHP? Preferowane metody open source / bez licencji. :)
Myślę o otwarciu pliku PDF, zastąpieniu tekstu w pliku PDF, a następnie wypisaniu zmodyfikowanej wersji pliku PDF?
W przeszłości programowo tworzyłem pliki PDF przy użyciu FPDF, ale czasami wydawało mi się, że jest to trochę nieporęczne.
Odpowiedzi:
Jeśli korzystasz z podejścia „wypełnij puste miejsce”, możesz precyzyjnie umieścić tekst w dowolnym miejscu na stronie. Tak więc dodanie brakującego tekstu do dokumentu jest stosunkowo łatwe (jeśli nie trochę nudne). Na przykład z Zend Framework:
<?php require_once 'Zend/Pdf.php'; $pdf = Zend_Pdf::load('blank.pdf'); $page = $pdf->pages[0]; $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA); $page->setFont($font, 12); $page->drawText('Hello world!', 72, 720); $pdf->save('zend.pdf');
Jeśli próbujesz zamienić zawartość wbudowaną, taką jak „[ciąg znaków zastępczych]”, sprawa staje się znacznie bardziej skomplikowana. Chociaż jest to technicznie możliwe, prawdopodobnie zepsujesz układ strony.
Dokument PDF składa się z zestawu prymitywnych operacji rysowania: tutaj linia, tutaj obraz, tam fragment tekstu itp. Nie zawiera żadnych informacji o zamierzeniu układu tych prymitywów.
źródło
Istnieje bezpłatna i łatwa w użyciu klasa PDF do tworzenia dokumentów PDF. Nazywa się FPDF . W połączeniu z FPDI ( http://www.setasign.de/products/pdf-php-solutions/fpdi ) możliwa jest nawet edycja dokumentów PDF. Poniższy kod pokazuje, jak użyć FPDF i FPDI do wypełnienia istniejącego kuponu upominkowego danymi użytkownika.
require_once('fpdf.php'); require_once('fpdi.php'); $pdf = new FPDI(); $pdf->AddPage(); $pdf->setSourceFile('gift_coupon.pdf'); // import page 1 $tplIdx = $this->pdf->importPage(1); //use the imported page and place it at point 0,0; calculate width and height //automaticallay and ajust the page size to the size of the imported page $this->pdf->useTemplate($tplIdx, 0, 0, 0, 0, true); // now write some text above the imported page $this->pdf->SetFont('Arial', '', '13'); $this->pdf->SetTextColor(0,0,0); //set position in pdf document $this->pdf->SetXY(20, 20); //first parameter defines the line height $this->pdf->Write(0, 'gift code'); //force the browser to download the output $this->pdf->Output('gift_coupon_generated.pdf', 'D');
źródło
"FPDF error: This document (testcopy.pdf) probably uses a compression technique which is not supported by the free parser shipped with FPDI."
Jakieś rozwiązanie?Jeśli potrzebujesz naprawdę prostych plików PDF, to Zend lub FPDF są w porządku. Jednak praca z nimi jest dla mnie trudna i frustrująca. Ponadto ze względu na sposób działania interfejsu API nie ma dobrego sposobu na oddzielenie treści od prezentacji od logiki biznesowej.
Z tego powodu używam domeny dompdf , która automatycznie konwertuje HTML i CSS na dokumenty PDF. Możesz ułożyć szablon tak samo, jak w przypadku strony HTML i użyć standardowej składni HTML. Możesz nawet dołączyć zewnętrzny plik CSS. Biblioteka nie jest idealna i bardzo złożone znaczniki lub css czasami ulegają zniekształceniu, ale nie znalazłem nic innego, co również działałoby.
źródło
Nie wiem, czy jest to opcja, ale działałaby bardzo podobnie do biblioteki pdf Zend, ale nie musisz ładować dodatkowego kodu (framework zend). Po prostu rozszerza FPDF.
http://www.setasign.de/products/pdf-php-solutions/fpdi/
Tutaj możesz w zasadzie zrobić to samo. Załaduj plik PDF, napisz nad nim, a następnie zapisz w nowym pliku PDF. W FPDI zasadniczo wstawiasz plik PDF jako obraz, dzięki czemu możesz umieścić na nim wszystko, co chcesz.
Ale znowu, używa FPDF, więc jeśli nie chcesz tego używać, to nie zadziała.
źródło
Zend Framework może ładować i edytować istniejące pliki PDF. Myślę, że obsługuje również poprawki.
Używam go do tworzenia dokumentów w projekcie i działa świetnie. Jednak nigdy nie edytowałem.
Sprawdź dokument tutaj
źródło
Dokumentacja rozszerzenia PDF / pdflib w PHP jest rzadka (coś, co zostało odnotowane w bugs.php.net) - zalecam korzystanie z biblioteki Zend.
źródło
Tcpdf to także dobra biblioteka do generowania plików PDF w php http://www.tcpdf.org/
źródło
Naprawdę wiązałem duże nadzieje z dompdf (to fajny pomysł), ale kwestia pozycjonowania jest głównym czynnikiem w używaniu fpdf. Chociaż jest to żmudne, ponieważ każdy element musi zostać ustawiony; jest potężny, gdy wszyscy się wydostają.
Układam obraz w dokumencie pod obszarem roboczym, aby dopasować układ na wierzchu. Zawsze wystarczało nawet w przypadku kolumn (wymaga odrobiny obliczenia ciągu php, ale nic zbyt strasznego).
Powodzenia.
źródło
Używamy pdflib do tworzenia plików PDF z naszych aplikacji railsowych . Ma powiązania dla PHP i mnóstwo innych języków.
Używamy wersji komercyjnej, ale mamy też wersję darmową / open source, która ma pewne ograniczenia.
Niestety, pozwala to tylko na tworzenie plików PDF.
Jeśli chcesz otwierać i „edytować” istniejące pliki, pdflib zapewnia produkt, który to robi , ale kosztuje DUŻO
źródło
<?php //getting new instance $pdfFile = new_pdf(); PDF_open_file($pdfFile, " "); //document info pdf_set_info($pdfFile, "Auther", "Ahmed Elbshry"); pdf_set_info($pdfFile, "Creator", "Ahmed Elbshry"); pdf_set_info($pdfFile, "Title", "PDFlib"); pdf_set_info($pdfFile, "Subject", "Using PDFlib"); //starting our page and define the width and highet of the document pdf_begin_page($pdfFile, 595, 842); //check if Arial font is found, or exit if($font = PDF_findfont($pdfFile, "Arial", "winansi", 1)) { PDF_setfont($pdfFile, $font, 12); } else { echo ("Font Not Found!"); PDF_end_page($pdfFile); PDF_close($pdfFile); PDF_delete($pdfFile); exit(); } //start writing from the point 50,780 PDF_show_xy($pdfFile, "This Text In Arial Font", 50, 780); PDF_end_page($pdfFile); PDF_close($pdfFile); //store the pdf document in $pdf $pdf = PDF_get_buffer($pdfFile); //get the len to tell the browser about it $pdflen = strlen($pdfFile); //telling the browser about the pdf document header("Content-type: application/pdf"); header("Content-length: $pdflen"); header("Content-Disposition: inline; filename=phpMade.pdf"); //output the document print($pdf); //delete the object PDF_delete($pdfFile); ?>
źródło
pdf_set_info($pdfFile, "Title", "PDFlib");