Edycja PDF w PHP? [Zamknięte]

81

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.

kaybenleroll
źródło
Użyłem tylko FPDF i uważam, że jest niesamowity. Naprawdę niesamowite.
SQLMason
Próbowałem również znaleźć szybkie rozwiązanie tego problemu. Chciałem mieć ten sam plik PDF dla każdej ze stron moich produktów, ale z numerem produktu i nazwą produktu wymienionymi na każdym pliku PDF. Odkryłem, że użycie korespondencji seryjnej (Word lub OpenOffice) jest w rzeczywistości najłatwiejszym sposobem na zrobienie tego. Następnie wyeksportowałem wszystkie pliki PDF i załadowałem je. Mam nadzieję, że to komuś pomoże.
NotJay

Odpowiedzi:

70

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.

grom
źródło
1
To jest świetne! Nie zdawałem sobie sprawy, że Zend Framework jest darmowy, byłem zdezorientowany przez Zend Studio, które jest zastrzeżone.
Liam,
8
Tylko słowo przestrogi dla każdego, kto próbuje tego użyć: działa tylko z plikami PDF utworzonymi w programie Acrobat w wersji 4 i wcześniejszych. Po wersji 4 firma Adobe zaczęła kodować pliki, co utrudniało edycję plików PDF (lub importowanie do innych plików PDF).
Darryl Hein
4
Od tego czasu dodano obsługę PDF 1.4 .
Raphael Schweikert,
2
Czy to działa teraz bez Zend?
William Entriken
Jakieś rozwiązanie, jeśli chciałbym zamienić zawartość taką jak [ciąg znaków zastępczych]?
Starx
43

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');
metatron
źródło
1
Doskonała biblioteka - była dokładnie tym, czego szukałem, dzięki za rekomendację
james-geldart
1
To jest dobre, ale w niektórych pdf daje ten błąd. "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?
Musisz przekonwertować plik PDF do starszej wersji (pdf 1.4) lub użyć komercyjnej edycji fpdi. Oferujemy zamiennik parsera jako osobny dodatek komercyjny, który umożliwia FPDI obsługę dokumentów korzystających z tych funkcji kompresji. źródło
SwissFr
Czy można ustawić plik źródłowy z innej strony internetowej? Np .: przyklad.com/plik.pdf?
Alex
19

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.

AdamTheHutt
źródło
9
-1 Ponieważ nie odpowiada na pytanie. Plakat chce edytować istniejące pliki PDF, a nie tworzyć ich od podstaw.
Reimund
9
Przyszedłem na tę stronę, ponieważ chciałem edytować plik PDF, ale ta odpowiedź wydaje mi się bardziej użyteczna, ponieważ widzę, dlaczego może być łatwiejsze tworzenie od podstaw w html niż edytowanie istniejącego pliku PDF.
Justin Vincent
3

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.

Darryl Hein
źródło
3

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

Juan
źródło
2

Dokumentacja rozszerzenia PDF / pdflib w PHP jest rzadka (coś, co zostało odnotowane w bugs.php.net) - zalecam korzystanie z biblioteki Zend.

Ross
źródło
1

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.

josh.chavanne
źródło
0

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

Orion Edwards
źródło
-1
<?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);
?>
Nitin
źródło
8
Z jakiej biblioteki korzystasz?
Hugo Estrada
1
pdf_set_info($pdfFile, "Title", "PDFlib");
user183037,
nadal nie jest jasne, co to za biblioteka
Deniz Celebi
Myślę, że miał na myśli wbudowane rozszerzenie php pdflib. php.net/manual/en/pdf.examples-basic.php
Kostiantyn